From 9f2744df2ce62bee5ab2b144073ed7d70833d2b9 Mon Sep 17 00:00:00 2001 From: JR-Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Fri, 4 Nov 2022 02:50:37 +0000 Subject: [PATCH 1/7] seperating out editor UI from editor receiving --- Assets/SpecklePlayground.unity | 234 ++++++++++++++-- Assets/SpeckleReceiver.cs | 168 +++++++++++ Assets/SpeckleReceiver.cs.meta | 11 + .../CommitSelection.cs | 261 +++++++++++++++++ .../CommitSelection.cs.meta | 11 + .../Editor/StreamSelectionEditor.cs | 263 ++++++++++++++++++ .../Editor/StreamSelectionEditor.cs.meta | 11 + 7 files changed, 929 insertions(+), 30 deletions(-) create mode 100644 Assets/SpeckleReceiver.cs create mode 100644 Assets/SpeckleReceiver.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/CommitSelection.cs create mode 100644 Packages/systems.speckle.speckle-unity/CommitSelection.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs create mode 100644 Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs.meta diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index 07a9cca..65b90bd 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -1849,6 +1849,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 762643242} m_CullTransparentMesh: 1 +--- !u!114 &816671309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 141ce93d2d159c0448b5b8b33b1c0679, type: 3} + m_Name: + m_EditorClassIdentifier: + path: Assets/Resources --- !u!1 &869165413 GameObject: m_ObjectHideFlags: 0 @@ -2064,19 +2077,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &916416845 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141ce93d2d159c0448b5b8b33b1c0679, type: 3} - m_Name: - m_EditorClassIdentifier: - path: Assets/Resources --- !u!1 &1031574851 GameObject: m_ObjectHideFlags: 0 @@ -2773,6 +2773,98 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!1 &1377894061 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1377894063} + - component: {fileID: 1377894062} + m_Layer: 0 + m_Name: GameObject (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1377894062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377894061} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722168162615296 + k__BackingField: + rid: 6366722168162615297 + k__BackingField: + rid: 6366722168162615298 + k__BackingField: + rid: 6366722168162615299 + references: + version: 2 + RefIds: + - rid: 6366722168162615296 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 1 + - rid: 6366722168162615297 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 2 + k__BackingField: 50 + k__BackingField: + rid: 6366722168162615296 + - rid: 6366722168162615298 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 5 + k__BackingField: 20 + k__BackingField: 15 + k__BackingField: + rid: 6366722168162615297 + - rid: 6366722168162615299 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 1 + k__BackingField: + rid: 6366722168162615298 +--- !u!4 &1377894063 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377894061} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 10.1570635, y: -2.743827, z: 12.879177} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1390840085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1397973070 GameObject: m_ObjectHideFlags: 0 @@ -2874,8 +2966,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: nativeCaches: - - {fileID: 916416845} - - {fileID: 1951948666} + - {fileID: 1852085904} + - {fileID: 816671309} + - {fileID: 1390840085} --- !u!1 &1464556211 GameObject: m_ObjectHideFlags: 0 @@ -3568,6 +3661,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1762991479} m_CullTransparentMesh: 1 +--- !u!114 &1852085904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} + m_Name: + m_EditorClassIdentifier: + matchByName: 1 --- !u!1 &1885647142 GameObject: m_ObjectHideFlags: 0 @@ -3872,18 +3978,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1903798475} m_CullTransparentMesh: 1 ---- !u!114 &1951948666 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &2014586909 GameObject: m_ObjectHideFlags: 0 @@ -4111,11 +4205,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: SelectedAccountIndex: 0 - SelectedStreamIndex: 8 - SelectedBranchIndex: 1 + SelectedStreamIndex: 0 + SelectedBranchIndex: 0 SelectedCommitIndex: 0 OldSelectedAccountIndex: 0 - OldSelectedStreamIndex: 8 + OldSelectedStreamIndex: 0 --- !u!114 &2060322469 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4429,3 +4523,83 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2074142232} m_CullTransparentMesh: 1 +--- !u!1 &7221284245862074005 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7221284245862074011} + - component: {fileID: 7221284245862074008} + m_Layer: 0 + m_Name: GameObject (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &7221284245862074008 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7221284245862074005} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722168162615296 + k__BackingField: + rid: 6366722168162615297 + k__BackingField: + rid: 6366722168162615298 + k__BackingField: + rid: 6366722168162615299 + references: + version: 2 + RefIds: + - rid: 6366722168162615296 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 1 + - rid: 6366722168162615297 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 2 + k__BackingField: 50 + k__BackingField: + rid: 6366722168162615296 + - rid: 6366722168162615298 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 3 + k__BackingField: 20 + k__BackingField: 15 + k__BackingField: + rid: 6366722168162615297 + - rid: 6366722168162615299 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} + data: + selectedIndex: 3 + k__BackingField: + rid: 6366722168162615298 +--- !u!4 &7221284245862074011 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7221284245862074005} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 10.1570635, y: -2.743827, z: 12.879177} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/SpeckleReceiver.cs b/Assets/SpeckleReceiver.cs new file mode 100644 index 0000000..31c10b8 --- /dev/null +++ b/Assets/SpeckleReceiver.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Speckle.ConnectorUnity; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using Speckle.Core.Kits; +using Speckle.Core.Logging; +using Speckle.Core.Models; +using Speckle.Core.Transports; +using UnityEditor.VersionControl; +using UnityEngine; +using UnityEngine.Events; +using Task = System.Threading.Tasks.Task; + + +[ExecuteAlways] +[AddComponentMenu("Speckle/Speckle Receiver")] +[RequireComponent(typeof(RecursiveConverter))] +public class SpeckleReceiver : MonoBehaviour, ISerializationCallbackReceiver +{ + [field: SerializeReference] + public AccountSelection Account { get; protected set; } + + [field: SerializeReference] + public StreamSelection Stream { get; protected set; } + + [field: SerializeReference] + public BranchSelection Branch { get; protected set; } + + [field: SerializeReference] + public CommitSelection Commit { get; protected set; } + + public RecursiveConverter Converter { get; protected set; } + + private CancellationTokenSource cancellationTokenSource; + + public UnityEvent> OnProgressAction; + public UnityEvent OnErrorAction; + public UnityEvent OnTotalChildrenCountKnown; + public UnityEvent> OnComplete; + +#nullable enable + public void Awake() + { + Initialise(); + Account!.RefreshOptions(); + Converter = GetComponent(); + cancellationTokenSource = new CancellationTokenSource(); + } + + protected void Initialise() + { + Account ??= new AccountSelection(); + Stream ??= new StreamSelection(Account); + Branch ??= new BranchSelection(Stream); + Commit ??= new CommitSelection(Branch); + Stream.Initialise(); + Branch.Initialise(); + Commit.Initialise(); + if(Account.Options is not {Length: > 0}) + Account.RefreshOptions(); + } + + + public async void ReceiveAndConvert(CancellationToken token, Transform? parentDestination = null) + { + Account? account = Account.Selected; + if (account == null) throw new SpeckleException("Cannot receive: Selected Account is null"); + Client client = Account.Client ?? new Client(account); + Stream? stream = Stream.Selected; + if (stream == null) throw new SpeckleException("Cannot receive: Selected Stream is null"); + Commit? commit = Commit.Selected; + if (commit == null) throw new SpeckleException("Cannot receive: Selected Commit is null"); + + Base? commitObject = await ReceiveAsync( + token: token, + client: client, + streamId: stream.id, + objectId: commit.referencedObject, + commitId: commit.id, + onProgressAction: dict => OnProgressAction.Invoke(dict), + onErrorAction: (m, e) => OnErrorAction.Invoke(m, e), + onTotalChildrenCountKnown: c => OnTotalChildrenCountKnown.Invoke(c) + ); + + Dispatcher.Instance().Enqueue(() => + { + var converted = Converter.RecursivelyConvertToNative(commitObject, parentDestination); + OnComplete.Invoke(converted); + }); + } + + + public static async Task ReceiveAsync(CancellationToken token, + Client client, + string streamId, + string objectId, + string? commitId, + Action>? onProgressAction = null, + Action? onErrorAction = null, + Action? onTotalChildrenCountKnown = null) + { + Base? ret = null; + try + { + Analytics.TrackEvent(client.Account, Analytics.Events.Receive); + + if (token.IsCancellationRequested) token.ThrowIfCancellationRequested(); + + var transport = new ServerTransport(client.Account, streamId); + transport.CancellationToken = token; + + ret = await Operations.Receive( + objectId: objectId, + cancellationToken: token, + remoteTransport: transport, + onProgressAction: onProgressAction, + onErrorAction: onErrorAction, + onTotalChildrenCountKnown: onTotalChildrenCountKnown, + disposeTransports: true + ); + + if (token.IsCancellationRequested) token.ThrowIfCancellationRequested(); + + try + { + await client.CommitReceived(token, new CommitReceivedInput + { + streamId = streamId, + commitId = commitId, + message = $"received commit from {Application.unityVersion}", + sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()) + }); + } + catch + { + // Do nothing! + } + } + catch(Exception e) + { + onErrorAction?.Invoke(e.Message, e); + throw; + } + + + return ret; + } + + public void OnDestroy() + { + cancellationTokenSource.Cancel(); + Account?.Dispose(); + } + + public void OnBeforeSerialize() + { + //pass + } + + public void OnAfterDeserialize() + { + Initialise(); + } +} diff --git a/Assets/SpeckleReceiver.cs.meta b/Assets/SpeckleReceiver.cs.meta new file mode 100644 index 0000000..b92935d --- /dev/null +++ b/Assets/SpeckleReceiver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bc895f6cb37b674995dc13b79783c55 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/CommitSelection.cs b/Packages/systems.speckle.speckle-unity/CommitSelection.cs new file mode 100644 index 0000000..f36ae7b --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/CommitSelection.cs @@ -0,0 +1,261 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity +{ + [Serializable] + public sealed class CommitSelection : OptionSelection + { + [field: SerializeReference] + public BranchSelection BranchSelection { get; private set; } + + public CommitSelection(BranchSelection branchSelection) + { + BranchSelection = branchSelection; + Initialise(); + + } + + public void Initialise() + { + BranchSelection.OnSelectionChange = RefreshOptions; + } + + protected override string? KeyFunction(Commit? value) => value?.id; + + public override void RefreshOptions() + { + Branch? branch = BranchSelection.Selected; + if (branch == null) return; + List commits = branch.commits.items; + GenerateOptions(commits, (_, i) => i == 0); + } + } + + [Serializable] + public sealed class BranchSelection : OptionSelection + { + [field: SerializeField, Range(1,100)] + public int BranchLimit { get; set; } = 30; + [field: SerializeField, Range(1,100)] + public int CommitLimit { get; set; } = 15; + + [field: SerializeReference] + public StreamSelection StreamSelection { get; private set; } + + public BranchSelection(StreamSelection streamSelection) + { + StreamSelection = streamSelection; + Initialise(); + } + + public void Initialise() + { + StreamSelection.OnSelectionChange = RefreshOptions; + } + + protected override string? KeyFunction(Branch? value) => value?.name; + + public override void RefreshOptions() + { + Stream? stream = StreamSelection.Selected; + if (stream == null) return; + List branches = StreamSelection.Client!.StreamGetBranches(stream.id, BranchLimit, CommitLimit).GetAwaiter().GetResult(); + GenerateOptions(branches, (b, _) => b.name == "main"); + } + } + + [Serializable] + public sealed class StreamSelection : OptionSelection + { + private const int DEFAULT_REQUEST_LIMIT = 50; + [field: SerializeField, Range(1,100)] + public int RequestLimit { get; set; } = DEFAULT_REQUEST_LIMIT; + + [field: SerializeReference] + public AccountSelection AccountSelection { get; private set; } + + public StreamSelection(AccountSelection accountSelection) + { + AccountSelection = accountSelection; + Initialise(); + } + + public void Initialise() + { + AccountSelection.OnSelectionChange = RefreshOptions; + } + + internal Client? Client => AccountSelection.Client; + + protected override string? KeyFunction(Stream? value) => value?.id; + public override void RefreshOptions() + { + if (Client == null) return; + List streams = Client.StreamsGet(RequestLimit).GetAwaiter().GetResult(); + GenerateOptions(streams, (_, i) => i == 0); + } + } + + + [Serializable] + public sealed class AccountSelection : OptionSelection, IDisposable + { + private Client? client; + public Client? Client + { + get + { + Account? account = Selected; + if (account == null) return client = null; + if (client == null || !client.Account.Equals(account)) return client = new Client(Selected); + return client; + } + } + + protected override string? KeyFunction(Account? value) => value?.id; + + public override void RefreshOptions() + { + GenerateOptions(AccountManager.GetAccounts().ToArray(), + isDefault: (a, _) => a.isDefault); + } + + public void Dispose() + { + client?.Dispose(); + } + } + + + [Serializable] + public abstract class OptionSelection where TOption : class + { + [SerializeField] + private int selectedIndex = -1; + + public int SelectedIndex + { + get => selectedIndex; + set + { + selectedIndex = value; + OnSelectionChange?.Invoke(); + } + } + + public TOption? Selected + { + get + { + if (Options == null) return null; + if (SelectedIndex < 0 || SelectedIndex >= Options.Length) return null; + return Options[SelectedIndex]; + } + } + + public TOption[] Options { get; protected set; } = Array.Empty(); + public Action? OnSelectionChange { get; set; } + + [return: NotNullIfNotNull("value")] + protected abstract string? KeyFunction(TOption? value); + + public abstract void RefreshOptions(); + + protected void GenerateOptions(IList source, Func isDefault) + { + List optionsToAdd = new List(source.Count); + int defaultOption = -1; + int index = 0; + foreach (TOption? a in source) + { + if (a == null) continue; + optionsToAdd.Add(a); + if (isDefault(a, index)) defaultOption = index; + index++; + } + + TOption? currentSelected = Selected; + bool selectionOutOfRange = SelectedIndex < 0 || SelectedIndex >= optionsToAdd.Count; + if (selectionOutOfRange + || (currentSelected != null + && KeyFunction(currentSelected) != KeyFunction(optionsToAdd[SelectedIndex]))) + { + selectedIndex = defaultOption; + } + + Options = optionsToAdd.ToArray(); + Debug.Log($"{this.GetType()} updated"); + OnSelectionChange?.Invoke(); + } + + } + + + + + // [Serializable] + // public abstract class OptionSelection : ISerializationCallbackReceiver where TOption : class + // { + // [SerializeReference] + // private int selectedIndex = -1; + // [SerializeReference] + // protected string? selectedId; + // public TOption? Selected + // { + // get + // { + // if (selectedIndex == -1) return null; + // if(Options.Any(a => a.Equals()) + // if (!Options.ContainsKey(selectedId)) return null; + // return Options[selectedId]; + // } + // set + // { + // selectedId = KeyFunction(value); + // OnSelectionChange?.Invoke(); + // } + // } + // + // //public IDictionary Options { get; protected set; } = new Dictionary(); + // public TOption[] Options { get; protected set; } = Array.Empty(); + // internal Action? OnSelectionChange { get; set; } + // + // [return: NotNullIfNotNull("value")] + // protected abstract string? KeyFunction(TOption? value); + // + // public abstract void RefreshOptions(); + // + // protected void GenerateOptions(IEnumerable source, Func isDefault) + // { + // Options.Clear(); + // TOption? defaultOption = null; + // int index = 0; + // foreach (TOption? a in source) + // { + // if (a == null) continue; + // Options.TryAdd(KeyFunction(a), a); + // if (isDefault(a, index)) defaultOption = a; + // index++; + // } + // + // if (selectedId == null || !Options.ContainsKey(selectedId)) + // { + // Selected = defaultOption; + // } + // } + // + // public virtual void OnAfterDeserialize() + // { + // RefreshOptions(); + // } + // + // public virtual void OnBeforeSerialize() { /*pass*/ } + // } +} diff --git a/Packages/systems.speckle.speckle-unity/CommitSelection.cs.meta b/Packages/systems.speckle.speckle-unity/CommitSelection.cs.meta new file mode 100644 index 0000000..fbb11e9 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/CommitSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91a60a3a0e5293d499e746c08d071b28 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs new file mode 100644 index 0000000..05cc4a9 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs @@ -0,0 +1,263 @@ + +using System; +using System.Collections.Generic; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEditor.UIElements; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity +{ + [CustomPropertyDrawer(typeof(AccountSelection))] + public sealed class AccountSelectionDrawer : OptionSelectionDrawer + { + protected override bool DisplayRefresh => true; + protected override string FormatOption(Account o) => $"{o.userInfo.email} | {o.serverInfo.name}"; + protected override int GUIDetailsPropertyCount => 4; + protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Account selection) + { + EditorGUI.BeginDisabledGroup(true); + position.height = DetailsTextHeight; + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Id", selection.userInfo.id); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Name", selection.userInfo.name); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Server", selection.serverInfo.name); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "URL", selection.serverInfo.url); + + EditorGUI.EndDisabledGroup(); + } + } + + [CustomPropertyDrawer(typeof(StreamSelection))] + public sealed class StreamSelectionDrawer : OptionSelectionDrawer + { + protected override bool DisplayRefresh => true; + + protected override string FormatOption(Stream o) => $"{o.name}"; + protected override int GUIDetailsPropertyCount => 7; + + protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Stream selection) + { + EditorGUI.BeginDisabledGroup(true); + position.height = DetailsTextHeight; + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Stream Id", selection.id); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Description", selection.description); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Is Public", selection.isPublic.ToString()); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Role", selection.role); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Created At", selection.createdAt); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Updated At", selection.updatedAt); + + EditorGUI.EndDisabledGroup(); + + position.y += DetailsTextHeight; + var nameField = EditorGUI.PropertyField(position, property.FindPropertyRelative($"<{nameof(StreamSelection.RequestLimit)}>k__BackingField")); + + } + } + + [CustomPropertyDrawer(typeof(BranchSelection))] + public sealed class BranchSelectionDrawer : OptionSelectionDrawer + { + protected override bool DisplayRefresh => true; + + protected override string FormatOption(Branch o) => $"{o.name}"; + protected override int GUIDetailsPropertyCount => 1; + + protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Branch selection) + { + EditorGUI.BeginDisabledGroup(true); + position.height = DetailsTextHeight; + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Description", selection.description); + + EditorGUI.EndDisabledGroup(); + } + } + + [CustomPropertyDrawer(typeof(CommitSelection))] + public sealed class CommitSelectionDrawer : OptionSelectionDrawer + { + protected override string FormatOption(Commit o) => $"{o.message} - {o.id}"; + protected override int GUIDetailsPropertyCount => 5; + + protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Commit selection) + { + EditorGUI.BeginDisabledGroup(true); + position.height = DetailsTextHeight; + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Commit Id", selection.id); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Author Name", selection.authorName); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Created At", selection.createdAt); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Source Application", selection.sourceApplication); + + position.y += DetailsTextHeight; + EditorGUI.TextField(position, "Reference Object Id", selection.referencedObject); + + EditorGUI.EndDisabledGroup(); + + } + } + + + public abstract class OptionSelectionDrawer : PropertyDrawer where TOption : class + { + private const float RefreshButtonWidthScale = 0.2f; + private const float PrefixIndentation = 100f; + protected readonly float DetailsTextHeight = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + private bool foldOutStatus = false; + protected virtual bool DisplayRefresh => false; + protected abstract string FormatOption(TOption o); + protected abstract int GUIDetailsPropertyCount { get; } + + private string[] GetFormattedOptions(TOption[] options) + { + int optionsCount = options.Length; + string[] choices = new string[optionsCount]; + for (int i = 0; i < optionsCount; i++) + { + choices[i] = FormatOption(options[i]); + } + + return choices; + } + + protected abstract void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, TOption selection); + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(position, label, property); + var t = (OptionSelection)fieldInfo.GetValue(property.serializedObject.targetObject); + + var selectionRect = position;//EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); + selectionRect.x += PrefixIndentation + 5; + selectionRect.width -= PrefixIndentation + 5; + + var popupSize = DisplayRefresh + ? new Rect(selectionRect.x, selectionRect.y, selectionRect.width * (1-RefreshButtonWidthScale), DetailsTextHeight) + : selectionRect; + //TODO: fancy popup + + var selectedOption = t.Selected; + string selectedChoice = selectedOption != null ? FormatOption(selectedOption) : ""; + + if (GUI.Button(popupSize, selectedChoice, EditorStyles.popup)) + { + var windowPos = GUIUtility.GUIToScreenPoint(Event.current.mousePosition); + var provider = ScriptableObject.CreateInstance(); + provider.Title = typeof(TOption).Name; + provider.listItems = GetFormattedOptions(t.Options);; + provider.onSetIndexCallback = o => { t.SelectedIndex = o;}; + SearchWindow.Open(new SearchWindowContext(windowPos), provider); + } + + if (DisplayRefresh) + { + var buttonSize = new Rect(selectionRect.x + popupSize.width , selectionRect.y, selectionRect.width * RefreshButtonWidthScale, DetailsTextHeight); + if (GUI.Button(buttonSize, "Refresh")) + { + t.RefreshOptions(); + } + } + + //TODO drop down with details + //EditorGUI.DropdownButton(position, "TEST", FocusType.Passive); + + //position.y += DetailsTextHeight; + { // Details drop down + int visiblePropCount = property.isExpanded ? GUIDetailsPropertyCount : 0; + var detailsHeight = new Vector2(PrefixIndentation, DetailsTextHeight + visiblePropCount * DetailsTextHeight); + var foldoutRect = new Rect(position.position, detailsHeight); + property.isExpanded = EditorGUI.BeginFoldoutHeaderGroup(foldoutRect, property.isExpanded, label); + if (property.isExpanded && selectedOption != null) + { + EditorGUI.indentLevel++; + OnGUIDetails(position, property, label, selectedOption); + EditorGUI.indentLevel--; + } + EditorGUI.EndFoldoutHeaderGroup(); + } + + EditorGUI.EndProperty(); + EditorUtility.SetDirty(property.serializedObject.targetObject); + + } + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + var standardHeight = EditorGUIUtility.singleLineHeight; + + if (!property.isExpanded) return standardHeight; + + var detailsHeight = GUIDetailsPropertyCount * (standardHeight + EditorGUIUtility.standardVerticalSpacing); + + return standardHeight + detailsHeight; + } + + } + + #nullable disable + + public sealed class StringListSearchProvider : ScriptableObject, ISearchWindowProvider + { + public string Title { get; set; } + public string[] listItems; + + public Action onSetIndexCallback; + + public List CreateSearchTree(SearchWindowContext context) + { + List searchList = new(listItems.Length + 1) {new SearchTreeGroupEntry(new GUIContent(Title), 0)}; + + for(int i = 0; i < listItems.Length; i++) + { + SearchTreeEntry entry = new SearchTreeEntry(new GUIContent(listItems[i])) + { + level = 1, + userData = i + }; + searchList.Add(entry); + } + + return searchList; + } + + public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context) + { + onSetIndexCallback?.Invoke((int)SearchTreeEntry.userData); + + return true; + } + } + + + +} diff --git a/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs.meta new file mode 100644 index 0000000..9f14be3 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc44e364c0d7b8a4c95f87d0210054be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From c6de60f18ce15f3f7945e38772af44c2f7f868ff Mon Sep 17 00:00:00 2001 From: JR-Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Tue, 8 Nov 2022 19:13:48 +0000 Subject: [PATCH 2/7] Asset restructure to seperate components and wrappers --- Assets/Extra/ManualRecieveExample.cs | 1 + Assets/Extra/Speckle.Extra.asmdef | 2 +- Assets/SpecklePlayground.unity | 303 +++++----- Assets/SpeckleReceiver.cs | 168 ------ .../CommitSelection.cs | 261 --------- .../Components.meta | 8 + .../Components/Components.asmdef | 20 + .../Components/Components.asmdef.meta | 7 + .../{ => Components}/Editor.meta | 0 .../Editor/Speckle.Connector.Editor.asmdef | 4 +- .../Speckle.Connector.Editor.asmdef.meta | 0 .../Editor/SpeckleReceiver.Editor.cs | 146 +++++ .../Editor/SpeckleReceiver.Editor.cs.meta | 11 + .../Editor/StreamManagerEditor.cs | 2 +- .../Editor/StreamManagerEditor.cs.meta | 0 .../Editor/StreamSelectionEditor.cs | 253 +++++++++ .../Editor/StreamSelectionEditor.cs.meta | 0 .../{ => Components}/Receiver.cs | 8 +- .../{ => Components}/Receiver.cs.meta | 0 .../RecursiveConverter.ToNative.cs | 24 +- .../RecursiveConverter.ToNative.cs.meta | 0 .../RecursiveConverter.ToSpeckle.cs | 3 +- .../RecursiveConverter.ToSpeckle.cs.meta | 0 .../{ => Components}/RecursiveConverter.cs | 6 +- .../RecursiveConverter.cs.meta | 0 .../{ => Components}/Sender.cs | 1 + .../{ => Components}/Sender.cs.meta | 0 .../Components/SpeckleReceiver.cs | 528 ++++++++++++++++++ .../Components}/SpeckleReceiver.cs.meta | 0 .../{ => Components}/StreamManager.cs | 2 +- .../{ => Components}/StreamManager.cs.meta | 0 .../Converter.meta | 8 + .../Converter/Unity.meta | 8 + .../Unity}/ConverterUnity.BuiltElements.cs | 0 .../ConverterUnity.BuiltElements.cs.meta | 0 .../Unity}/ConverterUnity.Geometry.cs | 2 + .../Unity}/ConverterUnity.Geometry.cs.meta | 0 .../Unity}/ConverterUnity.Mesh.cs | 2 +- .../Unity}/ConverterUnity.Mesh.cs.meta | 0 .../Unity}/ConverterUnity.Units.cs | 0 .../Unity}/ConverterUnity.Units.cs.meta | 0 .../{ => Converter/Unity}/ConverterUnity.cs | 3 +- .../Unity}/ConverterUnity.cs.meta | 0 .../Converter/Unity/Objects.Converter.asmdef | 18 + .../Unity/Objects.Converter.asmdef.meta | 7 + .../Converter/Utils.meta | 8 + .../{ => Converter/Utils}/ObjectExtensions.cs | 2 +- .../Utils}/ObjectExtensions.cs.meta | 0 .../Converter/Utils/Utils.asmdef | 14 + .../Converter/Utils/Utils.asmdef.meta | 7 + .../{ => Converter/Utils}/Utils.cs | 2 +- .../{ => Converter/Utils}/Utils.cs.meta | 0 .../Editor/StreamSelectionEditor.cs | 263 --------- .../Factories.meta | 8 + .../Factories/ConverterFactory.cs | 14 + .../Factories/ConverterFactory.cs.meta | 11 + .../Factories/Factories.asmdef | 14 + .../Factories/Factories.asmdef.meta | 7 + .../Wrappers.meta | 8 + .../Wrappers/Editor.meta | 8 + .../Editor/SpecklePropertiesEditor.cs | 2 +- .../Editor/SpecklePropertiesEditor.cs.meta | 0 .../Wrappers/Editor/Wrappers.Editor.asmdef | 16 + .../Editor/Wrappers.Editor.asmdef.meta | 7 + .../Wrappers/Selection.meta | 8 + .../Wrappers/Selection/AccountSelection.cs | 50 ++ .../Selection/AccountSelection.cs.meta | 11 + .../Wrappers/Selection/BranchSelection.cs | 51 ++ .../Selection/BranchSelection.cs.meta | 11 + .../Wrappers/Selection/CommitSelection.cs | 42 ++ .../Selection}/CommitSelection.cs.meta | 0 .../Wrappers/Selection/OptionSelection.cs | 80 +++ .../Selection/OptionSelection.cs.meta | 11 + .../Wrappers/Selection/StreamSelection.cs | 47 ++ .../Selection/StreamSelection.cs.meta | 11 + .../Wrappers/SerialisationWrappers.asmdef | 16 + .../SerialisationWrappers.asmdef.meta | 7 + .../{ => Wrappers}/SpeckleProperties.cs | 2 +- .../{ => Wrappers}/SpeckleProperties.cs.meta | 0 79 files changed, 1668 insertions(+), 876 deletions(-) delete mode 100644 Assets/SpeckleReceiver.cs delete mode 100644 Packages/systems.speckle.speckle-unity/CommitSelection.cs create mode 100644 Packages/systems.speckle.speckle-unity/Components.meta create mode 100644 Packages/systems.speckle.speckle-unity/Components/Components.asmdef create mode 100644 Packages/systems.speckle.speckle-unity/Components/Components.asmdef.meta rename Packages/systems.speckle.speckle-unity/{ => Components}/Editor.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Editor/Speckle.Connector.Editor.asmdef (75%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Editor/Speckle.Connector.Editor.asmdef.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs create mode 100644 Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs.meta rename Packages/systems.speckle.speckle-unity/{ => Components}/Editor/StreamManagerEditor.cs (99%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Editor/StreamManagerEditor.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs rename Packages/systems.speckle.speckle-unity/{ => Components}/Editor/StreamSelectionEditor.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Receiver.cs (97%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Receiver.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/RecursiveConverter.ToNative.cs (86%) rename Packages/systems.speckle.speckle-unity/{ => Components}/RecursiveConverter.ToNative.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/RecursiveConverter.ToSpeckle.cs (97%) rename Packages/systems.speckle.speckle-unity/{ => Components}/RecursiveConverter.ToSpeckle.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/RecursiveConverter.cs (89%) rename Packages/systems.speckle.speckle-unity/{ => Components}/RecursiveConverter.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Sender.cs (99%) rename Packages/systems.speckle.speckle-unity/{ => Components}/Sender.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs rename {Assets => Packages/systems.speckle.speckle-unity/Components}/SpeckleReceiver.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Components}/StreamManager.cs (98%) rename Packages/systems.speckle.speckle-unity/{ => Components}/StreamManager.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Converter.meta create mode 100644 Packages/systems.speckle.speckle-unity/Converter/Unity.meta rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.BuiltElements.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.BuiltElements.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.Geometry.cs (99%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.Geometry.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.Mesh.cs (99%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.Mesh.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.Units.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.Units.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.cs (98%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Unity}/ConverterUnity.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef create mode 100644 Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef.meta create mode 100644 Packages/systems.speckle.speckle-unity/Converter/Utils.meta rename Packages/systems.speckle.speckle-unity/{ => Converter/Utils}/ObjectExtensions.cs (94%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Utils}/ObjectExtensions.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef create mode 100644 Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef.meta rename Packages/systems.speckle.speckle-unity/{ => Converter/Utils}/Utils.cs (97%) rename Packages/systems.speckle.speckle-unity/{ => Converter/Utils}/Utils.cs.meta (100%) delete mode 100644 Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs create mode 100644 Packages/systems.speckle.speckle-unity/Factories.meta create mode 100644 Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs create mode 100644 Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef create mode 100644 Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta rename Packages/systems.speckle.speckle-unity/{ => Wrappers}/Editor/SpecklePropertiesEditor.cs (99%) rename Packages/systems.speckle.speckle-unity/{ => Wrappers}/Editor/SpecklePropertiesEditor.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs rename Packages/systems.speckle.speckle-unity/{ => Wrappers/Selection}/CommitSelection.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs.meta create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef.meta rename Packages/systems.speckle.speckle-unity/{ => Wrappers}/SpeckleProperties.cs (98%) rename Packages/systems.speckle.speckle-unity/{ => Wrappers}/SpeckleProperties.cs.meta (100%) diff --git a/Assets/Extra/ManualRecieveExample.cs b/Assets/Extra/ManualRecieveExample.cs index 3a405e0..7975424 100644 --- a/Assets/Extra/ManualRecieveExample.cs +++ b/Assets/Extra/ManualRecieveExample.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Threading.Tasks; using Speckle.ConnectorUnity; +using Speckle.ConnectorUnity.Components; using Speckle.Core.Api; using Speckle.Core.Credentials; using Speckle.Core.Transports; diff --git a/Assets/Extra/Speckle.Extra.asmdef b/Assets/Extra/Speckle.Extra.asmdef index 8c6a9e6..8ad356d 100644 --- a/Assets/Extra/Speckle.Extra.asmdef +++ b/Assets/Extra/Speckle.Extra.asmdef @@ -1,4 +1,4 @@ { "name": "Speckle.Extra", - "references":[ "GUID:eed1b8b83e2c0074d9e5de2348e3ff72" ] + "references":[ "GUID:eed1b8b83e2c0074d9e5de2348e3ff72", "GUID:e6adfdc4e436206479f48eafc82f32b5" ] } diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index 65b90bd..95dd6b6 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -1056,6 +1056,109 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 310693430} m_CullTransparentMesh: 1 +--- !u!1 &344004928 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 344004931} + - component: {fileID: 344004930} + - component: {fileID: 344004929} + m_Layer: 0 + m_Name: New Editor Receiver + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &344004929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344004928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722279309049856 + k__BackingField: + rid: 6366722279309049857 + k__BackingField: + rid: 6366722279309049858 + k__BackingField: + rid: 6366722279309049859 + OnCommitSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnReceiveProgressAction: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnTotalChildrenCountKnown: + m_PersistentCalls: + m_Calls: [] + OnComplete: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 6366722279309049856 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} + data: + selectedIndex: 0 + - rid: 6366722279309049857 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} + data: + selectedIndex: 1 + k__BackingField: 50 + - rid: 6366722279309049858 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} + data: + selectedIndex: 0 + k__BackingField: 30 + k__BackingField: 15 + - rid: 6366722279309049859 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} + data: + selectedIndex: 1 +--- !u!114 &344004930 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344004928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed6cbf9ce4dca0349997d163ec9bce7e, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: {fileID: 1954025585} +--- !u!4 &344004931 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344004928} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 10.1570635, y: -2.743827, z: 12.879177} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &407638589 GameObject: m_ObjectHideFlags: 0 @@ -1956,6 +2059,19 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &881240700 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} + m_Name: + m_EditorClassIdentifier: + matchByName: 1 --- !u!1 &907145429 GameObject: m_ObjectHideFlags: 0 @@ -2773,86 +2889,6 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 ---- !u!1 &1377894061 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1377894063} - - component: {fileID: 1377894062} - m_Layer: 0 - m_Name: GameObject (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1377894062 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1377894061} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722168162615296 - k__BackingField: - rid: 6366722168162615297 - k__BackingField: - rid: 6366722168162615298 - k__BackingField: - rid: 6366722168162615299 - references: - version: 2 - RefIds: - - rid: 6366722168162615296 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 1 - - rid: 6366722168162615297 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 2 - k__BackingField: 50 - k__BackingField: - rid: 6366722168162615296 - - rid: 6366722168162615298 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 5 - k__BackingField: 20 - k__BackingField: 15 - k__BackingField: - rid: 6366722168162615297 - - rid: 6366722168162615299 - type: {class: CommitSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 1 - k__BackingField: - rid: 6366722168162615298 ---- !u!4 &1377894063 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1377894061} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 10.1570635, y: -2.743827, z: 12.879177} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 11 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1390840085 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3549,6 +3585,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1707872729} m_CullTransparentMesh: 1 +--- !u!114 &1722434596 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1729237655 GameObject: m_ObjectHideFlags: 0 @@ -3978,6 +4026,21 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1903798475} m_CullTransparentMesh: 1 +--- !u!114 &1954025585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 88d6b4f2f80eaa14f9f07505f7e44ec2, type: 3} + m_Name: + m_EditorClassIdentifier: + nativeCaches: + - {fileID: 881240700} + - {fileID: 1722434596} --- !u!1 &2014586909 GameObject: m_ObjectHideFlags: 0 @@ -4523,83 +4586,3 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2074142232} m_CullTransparentMesh: 1 ---- !u!1 &7221284245862074005 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7221284245862074011} - - component: {fileID: 7221284245862074008} - m_Layer: 0 - m_Name: GameObject (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &7221284245862074008 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7221284245862074005} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722168162615296 - k__BackingField: - rid: 6366722168162615297 - k__BackingField: - rid: 6366722168162615298 - k__BackingField: - rid: 6366722168162615299 - references: - version: 2 - RefIds: - - rid: 6366722168162615296 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 1 - - rid: 6366722168162615297 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 2 - k__BackingField: 50 - k__BackingField: - rid: 6366722168162615296 - - rid: 6366722168162615298 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 3 - k__BackingField: 20 - k__BackingField: 15 - k__BackingField: - rid: 6366722168162615297 - - rid: 6366722168162615299 - type: {class: CommitSelection, ns: Speckle.ConnectorUnity, asm: Speckle.Connector} - data: - selectedIndex: 3 - k__BackingField: - rid: 6366722168162615298 ---- !u!4 &7221284245862074011 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7221284245862074005} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 10.1570635, y: -2.743827, z: 12.879177} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 10 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/SpeckleReceiver.cs b/Assets/SpeckleReceiver.cs deleted file mode 100644 index 31c10b8..0000000 --- a/Assets/SpeckleReceiver.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Speckle.ConnectorUnity; -using Speckle.Core.Api; -using Speckle.Core.Credentials; -using Speckle.Core.Kits; -using Speckle.Core.Logging; -using Speckle.Core.Models; -using Speckle.Core.Transports; -using UnityEditor.VersionControl; -using UnityEngine; -using UnityEngine.Events; -using Task = System.Threading.Tasks.Task; - - -[ExecuteAlways] -[AddComponentMenu("Speckle/Speckle Receiver")] -[RequireComponent(typeof(RecursiveConverter))] -public class SpeckleReceiver : MonoBehaviour, ISerializationCallbackReceiver -{ - [field: SerializeReference] - public AccountSelection Account { get; protected set; } - - [field: SerializeReference] - public StreamSelection Stream { get; protected set; } - - [field: SerializeReference] - public BranchSelection Branch { get; protected set; } - - [field: SerializeReference] - public CommitSelection Commit { get; protected set; } - - public RecursiveConverter Converter { get; protected set; } - - private CancellationTokenSource cancellationTokenSource; - - public UnityEvent> OnProgressAction; - public UnityEvent OnErrorAction; - public UnityEvent OnTotalChildrenCountKnown; - public UnityEvent> OnComplete; - -#nullable enable - public void Awake() - { - Initialise(); - Account!.RefreshOptions(); - Converter = GetComponent(); - cancellationTokenSource = new CancellationTokenSource(); - } - - protected void Initialise() - { - Account ??= new AccountSelection(); - Stream ??= new StreamSelection(Account); - Branch ??= new BranchSelection(Stream); - Commit ??= new CommitSelection(Branch); - Stream.Initialise(); - Branch.Initialise(); - Commit.Initialise(); - if(Account.Options is not {Length: > 0}) - Account.RefreshOptions(); - } - - - public async void ReceiveAndConvert(CancellationToken token, Transform? parentDestination = null) - { - Account? account = Account.Selected; - if (account == null) throw new SpeckleException("Cannot receive: Selected Account is null"); - Client client = Account.Client ?? new Client(account); - Stream? stream = Stream.Selected; - if (stream == null) throw new SpeckleException("Cannot receive: Selected Stream is null"); - Commit? commit = Commit.Selected; - if (commit == null) throw new SpeckleException("Cannot receive: Selected Commit is null"); - - Base? commitObject = await ReceiveAsync( - token: token, - client: client, - streamId: stream.id, - objectId: commit.referencedObject, - commitId: commit.id, - onProgressAction: dict => OnProgressAction.Invoke(dict), - onErrorAction: (m, e) => OnErrorAction.Invoke(m, e), - onTotalChildrenCountKnown: c => OnTotalChildrenCountKnown.Invoke(c) - ); - - Dispatcher.Instance().Enqueue(() => - { - var converted = Converter.RecursivelyConvertToNative(commitObject, parentDestination); - OnComplete.Invoke(converted); - }); - } - - - public static async Task ReceiveAsync(CancellationToken token, - Client client, - string streamId, - string objectId, - string? commitId, - Action>? onProgressAction = null, - Action? onErrorAction = null, - Action? onTotalChildrenCountKnown = null) - { - Base? ret = null; - try - { - Analytics.TrackEvent(client.Account, Analytics.Events.Receive); - - if (token.IsCancellationRequested) token.ThrowIfCancellationRequested(); - - var transport = new ServerTransport(client.Account, streamId); - transport.CancellationToken = token; - - ret = await Operations.Receive( - objectId: objectId, - cancellationToken: token, - remoteTransport: transport, - onProgressAction: onProgressAction, - onErrorAction: onErrorAction, - onTotalChildrenCountKnown: onTotalChildrenCountKnown, - disposeTransports: true - ); - - if (token.IsCancellationRequested) token.ThrowIfCancellationRequested(); - - try - { - await client.CommitReceived(token, new CommitReceivedInput - { - streamId = streamId, - commitId = commitId, - message = $"received commit from {Application.unityVersion}", - sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()) - }); - } - catch - { - // Do nothing! - } - } - catch(Exception e) - { - onErrorAction?.Invoke(e.Message, e); - throw; - } - - - return ret; - } - - public void OnDestroy() - { - cancellationTokenSource.Cancel(); - Account?.Dispose(); - } - - public void OnBeforeSerialize() - { - //pass - } - - public void OnAfterDeserialize() - { - Initialise(); - } -} diff --git a/Packages/systems.speckle.speckle-unity/CommitSelection.cs b/Packages/systems.speckle.speckle-unity/CommitSelection.cs deleted file mode 100644 index f36ae7b..0000000 --- a/Packages/systems.speckle.speckle-unity/CommitSelection.cs +++ /dev/null @@ -1,261 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using Speckle.Core.Api; -using Speckle.Core.Credentials; -using UnityEngine; - -#nullable enable -namespace Speckle.ConnectorUnity -{ - [Serializable] - public sealed class CommitSelection : OptionSelection - { - [field: SerializeReference] - public BranchSelection BranchSelection { get; private set; } - - public CommitSelection(BranchSelection branchSelection) - { - BranchSelection = branchSelection; - Initialise(); - - } - - public void Initialise() - { - BranchSelection.OnSelectionChange = RefreshOptions; - } - - protected override string? KeyFunction(Commit? value) => value?.id; - - public override void RefreshOptions() - { - Branch? branch = BranchSelection.Selected; - if (branch == null) return; - List commits = branch.commits.items; - GenerateOptions(commits, (_, i) => i == 0); - } - } - - [Serializable] - public sealed class BranchSelection : OptionSelection - { - [field: SerializeField, Range(1,100)] - public int BranchLimit { get; set; } = 30; - [field: SerializeField, Range(1,100)] - public int CommitLimit { get; set; } = 15; - - [field: SerializeReference] - public StreamSelection StreamSelection { get; private set; } - - public BranchSelection(StreamSelection streamSelection) - { - StreamSelection = streamSelection; - Initialise(); - } - - public void Initialise() - { - StreamSelection.OnSelectionChange = RefreshOptions; - } - - protected override string? KeyFunction(Branch? value) => value?.name; - - public override void RefreshOptions() - { - Stream? stream = StreamSelection.Selected; - if (stream == null) return; - List branches = StreamSelection.Client!.StreamGetBranches(stream.id, BranchLimit, CommitLimit).GetAwaiter().GetResult(); - GenerateOptions(branches, (b, _) => b.name == "main"); - } - } - - [Serializable] - public sealed class StreamSelection : OptionSelection - { - private const int DEFAULT_REQUEST_LIMIT = 50; - [field: SerializeField, Range(1,100)] - public int RequestLimit { get; set; } = DEFAULT_REQUEST_LIMIT; - - [field: SerializeReference] - public AccountSelection AccountSelection { get; private set; } - - public StreamSelection(AccountSelection accountSelection) - { - AccountSelection = accountSelection; - Initialise(); - } - - public void Initialise() - { - AccountSelection.OnSelectionChange = RefreshOptions; - } - - internal Client? Client => AccountSelection.Client; - - protected override string? KeyFunction(Stream? value) => value?.id; - public override void RefreshOptions() - { - if (Client == null) return; - List streams = Client.StreamsGet(RequestLimit).GetAwaiter().GetResult(); - GenerateOptions(streams, (_, i) => i == 0); - } - } - - - [Serializable] - public sealed class AccountSelection : OptionSelection, IDisposable - { - private Client? client; - public Client? Client - { - get - { - Account? account = Selected; - if (account == null) return client = null; - if (client == null || !client.Account.Equals(account)) return client = new Client(Selected); - return client; - } - } - - protected override string? KeyFunction(Account? value) => value?.id; - - public override void RefreshOptions() - { - GenerateOptions(AccountManager.GetAccounts().ToArray(), - isDefault: (a, _) => a.isDefault); - } - - public void Dispose() - { - client?.Dispose(); - } - } - - - [Serializable] - public abstract class OptionSelection where TOption : class - { - [SerializeField] - private int selectedIndex = -1; - - public int SelectedIndex - { - get => selectedIndex; - set - { - selectedIndex = value; - OnSelectionChange?.Invoke(); - } - } - - public TOption? Selected - { - get - { - if (Options == null) return null; - if (SelectedIndex < 0 || SelectedIndex >= Options.Length) return null; - return Options[SelectedIndex]; - } - } - - public TOption[] Options { get; protected set; } = Array.Empty(); - public Action? OnSelectionChange { get; set; } - - [return: NotNullIfNotNull("value")] - protected abstract string? KeyFunction(TOption? value); - - public abstract void RefreshOptions(); - - protected void GenerateOptions(IList source, Func isDefault) - { - List optionsToAdd = new List(source.Count); - int defaultOption = -1; - int index = 0; - foreach (TOption? a in source) - { - if (a == null) continue; - optionsToAdd.Add(a); - if (isDefault(a, index)) defaultOption = index; - index++; - } - - TOption? currentSelected = Selected; - bool selectionOutOfRange = SelectedIndex < 0 || SelectedIndex >= optionsToAdd.Count; - if (selectionOutOfRange - || (currentSelected != null - && KeyFunction(currentSelected) != KeyFunction(optionsToAdd[SelectedIndex]))) - { - selectedIndex = defaultOption; - } - - Options = optionsToAdd.ToArray(); - Debug.Log($"{this.GetType()} updated"); - OnSelectionChange?.Invoke(); - } - - } - - - - - // [Serializable] - // public abstract class OptionSelection : ISerializationCallbackReceiver where TOption : class - // { - // [SerializeReference] - // private int selectedIndex = -1; - // [SerializeReference] - // protected string? selectedId; - // public TOption? Selected - // { - // get - // { - // if (selectedIndex == -1) return null; - // if(Options.Any(a => a.Equals()) - // if (!Options.ContainsKey(selectedId)) return null; - // return Options[selectedId]; - // } - // set - // { - // selectedId = KeyFunction(value); - // OnSelectionChange?.Invoke(); - // } - // } - // - // //public IDictionary Options { get; protected set; } = new Dictionary(); - // public TOption[] Options { get; protected set; } = Array.Empty(); - // internal Action? OnSelectionChange { get; set; } - // - // [return: NotNullIfNotNull("value")] - // protected abstract string? KeyFunction(TOption? value); - // - // public abstract void RefreshOptions(); - // - // protected void GenerateOptions(IEnumerable source, Func isDefault) - // { - // Options.Clear(); - // TOption? defaultOption = null; - // int index = 0; - // foreach (TOption? a in source) - // { - // if (a == null) continue; - // Options.TryAdd(KeyFunction(a), a); - // if (isDefault(a, index)) defaultOption = a; - // index++; - // } - // - // if (selectedId == null || !Options.ContainsKey(selectedId)) - // { - // Selected = defaultOption; - // } - // } - // - // public virtual void OnAfterDeserialize() - // { - // RefreshOptions(); - // } - // - // public virtual void OnBeforeSerialize() { /*pass*/ } - // } -} diff --git a/Packages/systems.speckle.speckle-unity/Components.meta b/Packages/systems.speckle.speckle-unity/Components.meta new file mode 100644 index 0000000..e3c26b0 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 45c80e079d3d1e94e89ab9bc9b323574 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components/Components.asmdef b/Packages/systems.speckle.speckle-unity/Components/Components.asmdef new file mode 100644 index 0000000..773c4f3 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Components.asmdef @@ -0,0 +1,20 @@ +{ + "name": "Components", + "rootNamespace": "Speckle.ConnectorUnity", + "references": [ + "GUID:05078f9b6da40444fbd72ec600449925", + "GUID:eed1b8b83e2c0074d9e5de2348e3ff72", + "GUID:13aec21e8e96f864bafd00df49f225fc", + "GUID:d274441ecc3eb3f43b093eec1503d681", + "GUID:50d889142fdf9de4b8501c6eaa4b3225" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Components/Components.asmdef.meta b/Packages/systems.speckle.speckle-unity/Components/Components.asmdef.meta new file mode 100644 index 0000000..0af9ffc --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Components.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e6adfdc4e436206479f48eafc82f32b5 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Editor.meta b/Packages/systems.speckle.speckle-unity/Components/Editor.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Editor.meta rename to Packages/systems.speckle.speckle-unity/Components/Editor.meta diff --git a/Packages/systems.speckle.speckle-unity/Editor/Speckle.Connector.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef similarity index 75% rename from Packages/systems.speckle.speckle-unity/Editor/Speckle.Connector.Editor.asmdef rename to Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef index 0f58715..8420dce 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/Speckle.Connector.Editor.asmdef +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef @@ -3,7 +3,9 @@ "rootNamespace": "Speckle.ConnectorUnity", "references": [ "GUID:eed1b8b83e2c0074d9e5de2348e3ff72", - "GUID:05078f9b6da40444fbd72ec600449925" + "GUID:05078f9b6da40444fbd72ec600449925", + "GUID:e6adfdc4e436206479f48eafc82f32b5", + "GUID:d274441ecc3eb3f43b093eec1503d681" ], "includePlatforms": [ "Editor" diff --git a/Packages/systems.speckle.speckle-unity/Editor/Speckle.Connector.Editor.asmdef.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Editor/Speckle.Connector.Editor.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs new file mode 100644 index 0000000..b5be207 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Speckle.ConnectorUnity.Components; +using Speckle.Core.Api; +using Speckle.Core.Models; +using UnityEditor; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity.Editor +{ + [CustomEditor(typeof(SpeckleReceiver))] + [CanEditMultipleObjects] + public class SpeckleReceiverEditor : UnityEditor.Editor + { + private CancellationTokenSource? tokenSource; + public override async void OnInspectorGUI() + { + var speckleReceiver = (SpeckleReceiver) target; + DrawDefaultInspector(); + + bool receive = GUILayout.Button("Receive!"); + + if (receive) + { + await Receive(speckleReceiver); + } + } + + public async Task Receive(SpeckleReceiver speckleReceiver) + { + tokenSource?.Cancel(); + if (!speckleReceiver.GetSelection(out Client? client, out _, out Commit? commit, out string? error)) + { + Debug.LogWarning($"Not ready to receive: {error}", speckleReceiver); + return null; + } + + tokenSource = new CancellationTokenSource(); + Base? commitObject = await ReceiveCommit(speckleReceiver, client.ServerUrl); + + if (commitObject == null) return null; + + var gameObject = Convert(speckleReceiver, commitObject, commit.id); + Debug.Log($"Successfully received and converted {commit.id}", target); + return gameObject; + } + + private GameObject Convert(SpeckleReceiver receiver, Base commitObject, string name) + { + //Convert Speckle Objects + int childrenConverted = 0; + float totalChildren = commitObject.totalChildrenCount; + + void BeforeConvertCallback(Base b) + { + //TODO: this is an incorrect way of measuring progress, as totalChildren != total convertable children + float progress = childrenConverted++ / totalChildren; + + EditorUtility.DisplayProgressBar("Converting To Native...", + $"{b.speckle_type} - {b.id}", + progress); + } + + var go = receiver.ConvertToNativeWithCategories(commitObject, + name, BeforeConvertCallback); + go.transform.SetParent(receiver.transform); + return go; + } + + + private async Task ReceiveCommit(SpeckleReceiver speckleReceiver, string serverLogName) + { + string message = $"Receiving data from {serverLogName}..."; + EditorUtility.DisplayProgressBar(message, "", 0); + + var totalObjectCount = 1; + void OnTotalChildrenKnown(int count) + { + totalObjectCount = count; + }; + + void OnProgress(ConcurrentDictionary dict) + { + var currentProgress = dict.Values.Average(); + var progress = (float) currentProgress / totalObjectCount; + EditorApplication.delayCall += () => + { + bool shouldCancel = EditorUtility.DisplayCancelableProgressBar(message, + $"{currentProgress}/{totalObjectCount}", + progress); + + if (shouldCancel) + { + CancelReceive(); + } + }; + }; + + void OnError(string message, Exception e) + { + if (e is not OperationCanceledException) + { + Debug.LogError($"Receive failed: {message}\n{e}", speckleReceiver); + } + CancelReceive(); + }; + + Base? commitObject = null; + try + { + speckleReceiver.OnTotalChildrenCountKnown.AddListener(OnTotalChildrenKnown); + speckleReceiver.OnReceiveProgressAction.AddListener(OnProgress); + speckleReceiver.OnErrorAction.AddListener(OnError); + commitObject = await speckleReceiver.ReceiveAsync(tokenSource?.Token ?? CancellationToken.None); + if (commitObject == null) + { + Debug.LogWarning($"Receive warning: Receive operation returned null", speckleReceiver); + } + } + finally + { + speckleReceiver.OnTotalChildrenCountKnown.RemoveListener(OnTotalChildrenKnown); + speckleReceiver.OnReceiveProgressAction.RemoveListener(OnProgress); + speckleReceiver.OnErrorAction.RemoveListener(OnError); + EditorApplication.delayCall += EditorUtility.ClearProgressBar; + } + + return commitObject; + } + + private void CancelReceive() + { + tokenSource?.Cancel(); + EditorApplication.delayCall += EditorUtility.ClearProgressBar; + } + + private void OnDestroy() + { + tokenSource?.Cancel(); + } + } +} diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs.meta new file mode 100644 index 0000000..90a5874 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 80d601c080f0bd84d98b91058b593996 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Editor/StreamManagerEditor.cs b/Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs similarity index 99% rename from Packages/systems.speckle.speckle-unity/Editor/StreamManagerEditor.cs rename to Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs index 780984e..c98f002 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/StreamManagerEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs @@ -12,7 +12,7 @@ using Speckle.Core.Transports; using UnityEditor; using UnityEngine; -namespace Speckle.ConnectorUnity.Editor +namespace Speckle.ConnectorUnity.Components.Editor { [CustomEditor(typeof(StreamManager))] [CanEditMultipleObjects] diff --git a/Packages/systems.speckle.speckle-unity/Editor/StreamManagerEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Editor/StreamManagerEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs b/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs new file mode 100644 index 0000000..e9c732c --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs @@ -0,0 +1,253 @@ +#nullable enable +using System; +using System.Collections.Generic; +using Speckle.ConnectorUnity.Wrappers.Selection; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine; + +namespace Speckle.ConnectorUnity.Components.Editor +{ + [CustomPropertyDrawer(typeof(AccountSelection))] + public sealed class AccountSelectionDrawer : OptionSelectionDrawer + { + protected override bool DisplayRefresh => true; + protected override string FormatOption(Account o) => $"{o.userInfo.email} | {o.serverInfo.name}"; + + public AccountSelectionDrawer() + { + details = new (string, Func)[] + { + ("Id", s => s.userInfo.id), + ("Name", s => s.userInfo.name), + ("Server", s => s.userInfo.name), + ("URL", s => s.serverInfo.name), + ("Description", s => s.serverInfo.url), + }; + } + } + + [CustomPropertyDrawer(typeof(StreamSelection))] + public sealed class StreamSelectionDrawer : OptionSelectionDrawer + { + protected override bool DisplayRefresh => true; + protected override string FormatOption(Stream o) => $"{o.name}"; + + public StreamSelectionDrawer() + { + properties = new []{$"<{nameof(StreamSelection.StreamsLimit)}>k__BackingField"}; + + details = new (string, Func)[] + { + ("Stream id", s => s.id), + ("Description", s => s.description), + ("Is Public", s => s.isPublic.ToString()), + ("Role", s => s.role), + ("Created at", s => s.createdAt), + ("Updated at", s => s.updatedAt), + }; + } + } + + [CustomPropertyDrawer(typeof(BranchSelection))] + public sealed class BranchSelectionDrawer : OptionSelectionDrawer + { + protected override bool DisplayRefresh => true; + protected override string FormatOption(Branch o) => $"{o.name}"; + + public BranchSelectionDrawer() + { + properties = new [] + { + $"<{nameof(BranchSelection.BranchesLimit)}>k__BackingField", + $"<{nameof(BranchSelection.CommitsLimit)}>k__BackingField", + }; + + details = new (string, Func)[] + { + ("Description", s => s.description), + }; + } + } + + [CustomPropertyDrawer(typeof(CommitSelection))] + public sealed class CommitSelectionDrawer : OptionSelectionDrawer + { + protected override string FormatOption(Commit o) => $"{o.message} - {o.id}"; + + public CommitSelectionDrawer() + { + details = new (string, Func)[] + { + ("Commit Id", s => s.id), + ("Author Name", s => s.authorName), + ("Created At", s => s.createdAt), + ("Source Application", s => s.sourceApplication), + ("Reference Object Id", s => s.referencedObject), + }; + } + } + + + public abstract class OptionSelectionDrawer : PropertyDrawer where TOption : class + { + private const float RefreshButtonWidthScale = 0.2f; + private const float PrefixIndentation = 100f; + protected readonly float DetailsTextHeight = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + + protected virtual bool DisplayRefresh => false; + protected abstract string FormatOption(TOption o); + protected virtual int GUIDetailsPropertyCount => properties.Length + details.Length; + + protected string[] properties = { }; + + protected (string, Func)[] details = { }; + + private string[] GetFormattedOptions(TOption[] options) + { + int optionsCount = options.Length; + string[] choices = new string[optionsCount]; + for (int i = 0; i < optionsCount; i++) + { + choices[i] = FormatOption(options[i]); + } + + return choices; + } + + protected virtual void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, TOption? selection) + { + position.height = DetailsTextHeight; + + foreach (string subPropertyName in properties) + { + position.y += DetailsTextHeight; + var subProperty = property.FindPropertyRelative(subPropertyName); + EditorGUI.PropertyField(position, subProperty); + } + + EditorGUI.indentLevel++; + EditorGUI.BeginDisabledGroup(true); + + foreach (var (name, func) in details) + { + position.y += DetailsTextHeight; + string text = selection != null ? func(selection) : ""; + EditorGUI.TextField(position, name, text); + } + + EditorGUI.EndDisabledGroup(); + EditorGUI.indentLevel--; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(position, label, property); + var t = (OptionSelection)fieldInfo.GetValue(property.serializedObject.targetObject); + + var selectionRect = position; + selectionRect.x += PrefixIndentation + 5; + selectionRect.width -= PrefixIndentation + 5; + + TOption? selectedOption = t.Selected; + + // Options selection + { + + var popupSize = DisplayRefresh + ? new Rect(selectionRect.x, selectionRect.y, selectionRect.width * (1-RefreshButtonWidthScale), DetailsTextHeight) + : selectionRect; + + string selectedChoice = selectedOption != null ? FormatOption(selectedOption) : ""; + + if (GUI.Button(popupSize, selectedChoice, EditorStyles.popup)) + { + var windowPos = GUIUtility.GUIToScreenPoint(Event.current.mousePosition); + var provider = ScriptableObject.CreateInstance(); + provider.Title = typeof(TOption).Name; + provider.listItems = GetFormattedOptions(t.Options);; + provider.onSetIndexCallback = o => { t.SelectedIndex = o;}; + SearchWindow.Open(new SearchWindowContext(windowPos), provider); + } + + // Optional refresh + if (DisplayRefresh) + { + var buttonSize = new Rect(selectionRect.x + popupSize.width , selectionRect.y, selectionRect.width * RefreshButtonWidthScale, DetailsTextHeight); + if (GUI.Button(buttonSize, "Refresh")) + { + EditorApplication.delayCall += t.RefreshOptions; + } + } + } + + // Collapsable details + { + int visiblePropCount = property.isExpanded ? GUIDetailsPropertyCount : 0; + var detailsHeight = new Vector2(PrefixIndentation, DetailsTextHeight + visiblePropCount * DetailsTextHeight); + var foldoutRect = new Rect(position.position, detailsHeight); + property.isExpanded = EditorGUI.BeginFoldoutHeaderGroup(foldoutRect, property.isExpanded, label); + if (property.isExpanded) + { + OnGUIDetails(position, property, label, selectedOption); + } + EditorGUI.EndFoldoutHeaderGroup(); + } + + + EditorGUI.EndProperty(); + //EditorUtility.SetDirty(property.serializedObject.targetObject); + + } + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + var standardHeight = EditorGUIUtility.singleLineHeight; + + if (!property.isExpanded) return standardHeight + EditorGUIUtility.standardVerticalSpacing; + + var detailsHeight = GUIDetailsPropertyCount * (standardHeight + EditorGUIUtility.standardVerticalSpacing); + + return standardHeight + detailsHeight + EditorGUIUtility.standardVerticalSpacing + EditorGUIUtility.standardVerticalSpacing; + } + + } + + #nullable disable + + public sealed class StringListSearchProvider : ScriptableObject, ISearchWindowProvider + { + public string Title { get; set; } + public string[] listItems; + + public Action onSetIndexCallback; + + public List CreateSearchTree(SearchWindowContext context) + { + List searchList = new(listItems.Length + 1) {new SearchTreeGroupEntry(new GUIContent(Title), 0)}; + + for(int i = 0; i < listItems.Length; i++) + { + SearchTreeEntry entry = new SearchTreeEntry(new GUIContent(listItems[i])) + { + level = 1, + userData = i + }; + searchList.Add(entry); + } + + return searchList; + } + + public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context) + { + onSetIndexCallback?.Invoke((int)SearchTreeEntry.userData); + + return true; + } + } + + + +} diff --git a/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Receiver.cs b/Packages/systems.speckle.speckle-unity/Components/Receiver.cs similarity index 97% rename from Packages/systems.speckle.speckle-unity/Receiver.cs rename to Packages/systems.speckle.speckle-unity/Components/Receiver.cs index 4b98f96..f9fbbf6 100644 --- a/Packages/systems.speckle.speckle-unity/Receiver.cs +++ b/Packages/systems.speckle.speckle-unity/Components/Receiver.cs @@ -1,18 +1,14 @@ -using Objects.Converter.Unity; -using Speckle.Core.Api; +using Speckle.Core.Api; using Speckle.Core.Api.SubscriptionModels; using Speckle.Core.Credentials; using Speckle.Core.Logging; -using Speckle.Core.Models; using Speckle.Core.Transports; using System; -using System.Collections; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Sentry; -using Sentry.Protocol; +using Speckle.ConnectorUnity.Components; using Speckle.Core.Kits; using UnityEngine; diff --git a/Packages/systems.speckle.speckle-unity/Receiver.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Receiver.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Receiver.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/Receiver.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/RecursiveConverter.ToNative.cs b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs similarity index 86% rename from Packages/systems.speckle.speckle-unity/RecursiveConverter.ToNative.cs rename to Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs index bcccc3d..c7b7b08 100644 --- a/Packages/systems.speckle.speckle-unity/RecursiveConverter.ToNative.cs +++ b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs @@ -6,10 +6,21 @@ using System.Linq; using Speckle.Core.Models; using UnityEngine; -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Components { public partial class RecursiveConverter { + public IEnumerator ConvertCoroutine(Base rootObject, Transform? parent, List outCreatedObjects) + => ConvertCoroutine(rootObject, parent, outCreatedObjects,b => ConverterInstance.CanConvertToNative(b)); + + public IEnumerator ConvertCoroutine(Base rootObject, Transform? parent, List outCreatedObjects, Func predicate) + { + foreach (string propertyName in GetPotentialChildren(rootObject)) + { + ConvertChild(rootObject[propertyName], parent, predicate, outCreatedObjects); + yield return null; + } + } /// /// Given , @@ -96,9 +107,7 @@ namespace Speckle.ConnectorUnity } // For geometry, only traverse `elements` prop, otherwise, try and convert everything - IEnumerable potentialChildren = ConverterInstance.CanConvertToNative(baseObject) - ? new []{"elements"} - : baseObject.GetMembers().Keys; + IEnumerable potentialChildren = GetPotentialChildren(baseObject); // Convert Children foreach (string propertyName in potentialChildren) @@ -108,6 +117,13 @@ namespace Speckle.ConnectorUnity } + private IEnumerable GetPotentialChildren(Base baseObject) + { + return ConverterInstance.CanConvertToNative(baseObject) + ? new []{"elements"} + : baseObject.GetMembers().Keys; + } + protected virtual void ConvertChild(object? value, Transform? parent, Func predicate, IList outCreatedObjects) { diff --git a/Packages/systems.speckle.speckle-unity/RecursiveConverter.ToNative.cs.meta b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/RecursiveConverter.ToNative.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/RecursiveConverter.ToSpeckle.cs b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs similarity index 97% rename from Packages/systems.speckle.speckle-unity/RecursiveConverter.ToSpeckle.cs rename to Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs index dce3b1c..aae810f 100644 --- a/Packages/systems.speckle.speckle-unity/RecursiveConverter.ToSpeckle.cs +++ b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs @@ -2,10 +2,11 @@ using System; using System.Collections.Generic; +using Speckle.ConnectorUnity.Converter.Utils; using Speckle.Core.Models; using UnityEngine; -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Components { public partial class RecursiveConverter diff --git a/Packages/systems.speckle.speckle-unity/RecursiveConverter.ToSpeckle.cs.meta b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/RecursiveConverter.ToSpeckle.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/RecursiveConverter.cs b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs similarity index 89% rename from Packages/systems.speckle.speckle-unity/RecursiveConverter.cs rename to Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs index 307f605..176e801 100644 --- a/Packages/systems.speckle.speckle-unity/RecursiveConverter.cs +++ b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs @@ -1,10 +1,10 @@ -using Objects.Converter.Unity; +using Speckle.ConnectorUnity.Factories; using Speckle.ConnectorUnity.NativeCache; using Speckle.Core.Kits; using Speckle.Core.Logging; using UnityEngine; -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Components { /// /// for recursive conversion of Speckle Objects to Native, and Native Objects to Speckle @@ -13,7 +13,7 @@ namespace Speckle.ConnectorUnity [ExecuteAlways, DisallowMultipleComponent] public partial class RecursiveConverter : MonoBehaviour { - public ISpeckleConverter ConverterInstance { get; set; } = new ConverterUnity(); + public ISpeckleConverter ConverterInstance { get; set; } = ConverterFactory.GetDefaultConverter(); [field: SerializeField] public AggregateNativeCache AssetCache { get; set; } diff --git a/Packages/systems.speckle.speckle-unity/RecursiveConverter.cs.meta b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/RecursiveConverter.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Sender.cs b/Packages/systems.speckle.speckle-unity/Components/Sender.cs similarity index 99% rename from Packages/systems.speckle.speckle-unity/Sender.cs rename to Packages/systems.speckle.speckle-unity/Components/Sender.cs index c1a7184..5b25a84 100644 --- a/Packages/systems.speckle.speckle-unity/Sender.cs +++ b/Packages/systems.speckle.speckle-unity/Components/Sender.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Sentry; +using Speckle.ConnectorUnity.Components; using Speckle.Core.Kits; using UnityEngine; using UnityEngine.SceneManagement; diff --git a/Packages/systems.speckle.speckle-unity/Sender.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Sender.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Sender.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/Sender.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs new file mode 100644 index 0000000..4e6ab9f --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs @@ -0,0 +1,528 @@ +using System; +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using System.Threading.Tasks; +using Speckle.ConnectorUnity.Wrappers.Selection; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using Speckle.Core.Kits; +using Speckle.Core.Logging; +using Speckle.Core.Models; +using Speckle.Core.Transports; +using UnityEngine; +using UnityEngine.Events; + +namespace Speckle.ConnectorUnity.Components +{ + [ExecuteAlways] + [AddComponentMenu("Speckle/Speckle Receiver")] + [RequireComponent(typeof(RecursiveConverter))] + public class SpeckleReceiver : MonoBehaviour, ISerializationCallbackReceiver + { + [field: SerializeReference] + public AccountSelection Account { get; protected set; } + + [field: SerializeReference] + public StreamSelection Stream { get; protected set; } + + [field: SerializeReference] + public BranchSelection Branch { get; protected set; } + + [field: SerializeReference] + public CommitSelection Commit { get; protected set; } + + public RecursiveConverter Converter { get; protected set; } + + private CancellationTokenSource cancellationTokenSource; + + [Header("Events")] + public UnityEvent OnCommitSelectionChange; + public UnityEvent> OnReceiveProgressAction; + public UnityEvent OnErrorAction; + public UnityEvent OnTotalChildrenCountKnown; + public UnityEvent OnComplete; + +#nullable enable + + public void Awake() + { + Initialise(true); + Converter = GetComponent(); + cancellationTokenSource = new CancellationTokenSource(); + + } + + protected void Initialise(bool forceRefresh = false) + { + Account ??= new AccountSelection(); + Stream ??= new StreamSelection(Account); + Branch ??= new BranchSelection(Stream); + Commit ??= new CommitSelection(Branch); + Stream.Initialise(); + Branch.Initialise(); + Commit.Initialise(); + if(Account.Options is not {Length: > 0} || forceRefresh) + Account.RefreshOptions(); + + } + + + /// + /// + /// + /// + /// + /// + /// error messages for + /// true if selection is complete, as we are ready to receive + public bool GetSelection( + [NotNullWhen(true)] out Client? client, + [NotNullWhen(true)] out Stream? stream, + [NotNullWhen(true)] out Commit? commit, + [NotNullWhen(false)] out string? error) + { + Account? account = Account.Selected; + stream = Stream.Selected; + commit = Commit.Selected; + + if (account == null) + { + error = "Selected Account is null"; + client = null; + return false; + } + client = Account.Client ?? new Client(account); + + if (stream == null) + { + error = "Selected Stream is null"; + return false; + } + + if (commit == null) + { + error = "Selected Commit is null"; + return false; + } + error = null; + return true; + } + + + /// + /// Receives the selected commit object using async Task + /// + /// + /// Awaitable commit object + /// thrown when selection is incomplete + public async Task ReceiveAsync(CancellationToken token) + { + if(!GetSelection(out Client? client, out Stream? stream, out Commit? commit, out string? error)) + throw new SpeckleException(error); + + return await ReceiveAsync( + token: token, + client: client, + streamId: stream.id, + objectId: commit.referencedObject, + commitId: commit.id, + onProgressAction: dict => OnReceiveProgressAction.Invoke(dict), + onErrorAction: (m, e) => OnErrorAction.Invoke(m, e), + onTotalChildrenCountKnown: c => OnTotalChildrenCountKnown.Invoke(c) + ); + } + + /// + /// Receives the requested using async Task + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task ReceiveAsync(CancellationToken token, + Client client, + string streamId, + string objectId, + string? commitId, + Action>? onProgressAction = null, + Action? onErrorAction = null, + Action? onTotalChildrenCountKnown = null) + { + ServerTransport transport = new ServerTransport(client.Account, streamId); + transport.CancellationToken = token; + + Base? ret = null; + try + { + Analytics.TrackEvent(client.Account, Analytics.Events.Receive); + + token.ThrowIfCancellationRequested(); + + ret = await Operations.Receive( + objectId: objectId, + cancellationToken: token, + remoteTransport: transport, + onProgressAction: onProgressAction, + onErrorAction: onErrorAction, + onTotalChildrenCountKnown: onTotalChildrenCountKnown, + disposeTransports: true + ); + + token.ThrowIfCancellationRequested(); + + //Read receipt + try + { + await client.CommitReceived(token, new CommitReceivedInput + { + streamId = streamId, + commitId = commitId, + message = $"received commit from {Application.unityVersion}", + sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()) + }); + } + catch (Exception e) + { + // Do nothing! + Debug.LogWarning($"Failed to send read receipt\n{e}"); + } + } + catch (Exception e) + { + onErrorAction?.Invoke(e.Message, e); + } + finally + { + transport?.Dispose(); + } + + return ret; + } + + /// + /// Helper method for using . + /// Creates blank GameObjects for each property/category of the root object. + /// + /// The commitObject to convert + /// The name of the parent to create + /// Callback for each object converted + /// The created parent + public GameObject ConvertToNativeWithCategories(Base @base, string rootObjectName, + Action? beforeConvertCallback) + { + var rootObject = new GameObject(rootObjectName); + + bool Predicate(Base o) + { + beforeConvertCallback?.Invoke(o); + return Converter.ConverterInstance.CanConvertToNative(o) //Accept geometry + || o.speckle_type == nameof(Base) && o.totalChildrenCount > 0; // Or Base objects that have children + } + + + // For the rootObject only, we will create property GameObjects + // i.e. revit categories + foreach (var prop in @base.GetMembers()) + { + var converted = Converter.RecursivelyConvertToNative(prop.Value, null, Predicate); + + //Skip empties + if (converted.Count <= 0) continue; + + var propertyObject = new GameObject(prop.Key); + propertyObject.transform.SetParent(rootObject.transform); + foreach (var o in converted) + { + if (o.transform.parent == null) o.transform.SetParent(propertyObject.transform); + } + } + + return rootObject; + } + + + public void OnDestroy() + { + cancellationTokenSource?.Cancel(); + cancellationTokenSource?.Dispose(); + } + + public void OnBeforeSerialize() + { + //pass + } + public void OnAfterDeserialize() + { + Initialise(); + } + } +} + + + + + +// using System; +// using System.Collections.Concurrent; +// using System.Diagnostics.CodeAnalysis; +// using System.Threading; +// using System.Threading.Tasks; +// using Speckle.ConnectorUnity.Wrappers.Selection; +// using Speckle.Core.Api; +// using Speckle.Core.Credentials; +// using Speckle.Core.Kits; +// using Speckle.Core.Logging; +// using Speckle.Core.Models; +// using Speckle.Core.Transports; +// using UnityEngine; +// using UnityEngine.Events; +// +// namespace Speckle.ConnectorUnity.Components +// { +// [ExecuteAlways] +// [AddComponentMenu("Speckle/Speckle Receiver")] +// [RequireComponent(typeof(RecursiveConverter))] +// public class SpeckleReceiver : MonoBehaviour +// { +// [field: SerializeReference] +// public AccountSelection Account { get; protected set; } +// +// [field: SerializeReference] +// public StreamSelection Stream { get; protected set; } +// +// [field: SerializeReference] +// public BranchSelection Branch { get; protected set; } +// +// [field: SerializeReference] +// public CommitSelection Commit { get; protected set; } +// +// public RecursiveConverter Converter { get; protected set; } +// +// private CancellationTokenSource cancellationTokenSource; +// +// [Header("Events")] +// public UnityEvent OnCommitSelectionChange; +// public UnityEvent> OnReceiveProgressAction; +// public UnityEvent OnErrorAction; +// public UnityEvent OnTotalChildrenCountKnown; +// public UnityEvent OnComplete; +// +// #nullable enable +// +// void Awake() +// { +// cancellationTokenSource = new CancellationTokenSource(); +// +// Commit = GetComponent(); +// if (Commit == null) Commit = gameObject.AddComponent(); +// +// Converter = GetComponent(); +// if (Converter == null) Converter = gameObject.AddComponent(); +// } +// +// protected void Start() +// { +// Commit.OnSelectionChange.AddListener(() => OnCommitSelectionChange?.Invoke(Commit.Selected)); +// Branch = Commit.BranchSelection; +// Stream = Branch.StreamSelection; +// Account = Stream.AccountSelection; +// +// if (Account.Options is not {Length: > 0}) +// Account.RefreshOptions(); +// +// } +// +// +// /// +// /// +// /// +// /// +// /// +// /// +// /// error messages for +// /// true if selection is complete, as we are ready to receive +// public bool GetSelection( +// [NotNullWhen(true)] out Client? client, +// [NotNullWhen(true)] out Stream? stream, +// [NotNullWhen(true)] out Commit? commit, +// [NotNullWhen(false)] out string? error) +// { +// Account? account = Account.Selected; +// stream = Stream.Selected; +// commit = Commit.Selected; +// +// if (account == null) +// { +// error = "Selected Account is null"; +// client = null; +// return false; +// } +// client = Account.Client ?? new Client(account); +// +// if (stream == null) +// { +// error = "Selected Stream is null"; +// return false; +// } +// +// if (commit == null) +// { +// error = "Selected Commit is null"; +// return false; +// } +// error = null; +// return true; +// } +// +// +// /// +// /// Receives the selected commit object using async Task +// /// +// /// +// /// Awaitable commit object +// /// thrown when selection is incomplete +// public async Task ReceiveAsync(CancellationToken token) +// { +// if(!GetSelection(out Client? client, out Stream? stream, out Commit? commit, out string? error)) +// throw new SpeckleException(error); +// +// return await ReceiveAsync( +// token: token, +// client: client, +// streamId: stream.id, +// objectId: commit.referencedObject, +// commitId: commit.id, +// onProgressAction: dict => OnReceiveProgressAction.Invoke(dict), +// onErrorAction: (m, e) => OnErrorAction.Invoke(m, e), +// onTotalChildrenCountKnown: c => OnTotalChildrenCountKnown.Invoke(c) +// ); +// } +// +// /// +// /// Receives the requested using async Task +// /// +// /// +// /// +// /// +// /// +// /// +// /// +// /// +// /// +// /// +// public static async Task ReceiveAsync(CancellationToken token, +// Client client, +// string streamId, +// string objectId, +// string? commitId, +// Action>? onProgressAction = null, +// Action? onErrorAction = null, +// Action? onTotalChildrenCountKnown = null) +// { +// ServerTransport transport = new ServerTransport(client.Account, streamId); +// transport.CancellationToken = token; +// +// Base? ret = null; +// try +// { +// Analytics.TrackEvent(client.Account, Analytics.Events.Receive); +// +// token.ThrowIfCancellationRequested(); +// +// ret = await Operations.Receive( +// objectId: objectId, +// cancellationToken: token, +// remoteTransport: transport, +// onProgressAction: onProgressAction, +// onErrorAction: onErrorAction, +// onTotalChildrenCountKnown: onTotalChildrenCountKnown, +// disposeTransports: true +// ); +// +// token.ThrowIfCancellationRequested(); +// +// //Read receipt +// try +// { +// await client.CommitReceived(token, new CommitReceivedInput +// { +// streamId = streamId, +// commitId = commitId, +// message = $"received commit from {Application.unityVersion}", +// sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()) +// }); +// } +// catch (Exception e) +// { +// // Do nothing! +// Debug.LogWarning($"Failed to send read receipt\n{e}"); +// } +// } +// catch (Exception e) +// { +// onErrorAction?.Invoke(e.Message, e); +// } +// finally +// { +// transport?.Dispose(); +// } +// +// return ret; +// } +// +// /// +// /// Helper method for using . +// /// Creates blank GameObjects for each property/category of the root object. +// /// +// /// The commitObject to convert +// /// The name of the parent to create +// /// Callback for each object converted +// /// The created parent +// public GameObject ConvertToNativeWithCategories(Base @base, string rootObjectName, +// Action? beforeConvertCallback) +// { +// var rootObject = new GameObject(rootObjectName); +// +// bool Predicate(Base o) +// { +// beforeConvertCallback?.Invoke(o); +// return Converter.ConverterInstance.CanConvertToNative(o) //Accept geometry +// || o.speckle_type == nameof(Base) && o.totalChildrenCount > 0; // Or Base objects that have children +// } +// +// +// // For the rootObject only, we will create property GameObjects +// // i.e. revit categories +// foreach (var prop in @base.GetMembers()) +// { +// var converted = Converter.RecursivelyConvertToNative(prop.Value, null, Predicate); +// +// //Skip empties +// if (converted.Count <= 0) continue; +// +// var propertyObject = new GameObject(prop.Key); +// propertyObject.transform.SetParent(rootObject.transform); +// foreach (var o in converted) +// { +// if (o.transform.parent == null) o.transform.SetParent(propertyObject.transform); +// } +// } +// +// return rootObject; +// } +// +// +// public void OnDestroy() +// { +// cancellationTokenSource?.Cancel(); +// cancellationTokenSource?.Dispose(); +// } +// +// } +// } diff --git a/Assets/SpeckleReceiver.cs.meta b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta similarity index 100% rename from Assets/SpeckleReceiver.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/StreamManager.cs b/Packages/systems.speckle.speckle-unity/Components/StreamManager.cs similarity index 98% rename from Packages/systems.speckle.speckle-unity/StreamManager.cs rename to Packages/systems.speckle.speckle-unity/Components/StreamManager.cs index 49c4ea1..0d42cbf 100644 --- a/Packages/systems.speckle.speckle-unity/StreamManager.cs +++ b/Packages/systems.speckle.speckle-unity/Components/StreamManager.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using Speckle.Core.Models; using UnityEngine; -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Components { [ExecuteAlways] [AddComponentMenu("Speckle/Stream Manager")] diff --git a/Packages/systems.speckle.speckle-unity/StreamManager.cs.meta b/Packages/systems.speckle.speckle-unity/Components/StreamManager.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/StreamManager.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/StreamManager.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter.meta b/Packages/systems.speckle.speckle-unity/Converter.meta new file mode 100644 index 0000000..a2e8d05 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c217e30ac070cd40aebb71976cace11 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity.meta new file mode 100644 index 0000000..dbe7bc6 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b80ae365e844a2e4a943d96b25654c35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.BuiltElements.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.BuiltElements.cs rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.BuiltElements.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.BuiltElements.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.Geometry.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs similarity index 99% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.Geometry.cs rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs index 471b4f9..aecc773 100644 --- a/Packages/systems.speckle.speckle-unity/ConverterUnity.Geometry.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs @@ -6,7 +6,9 @@ using System.Linq; using System.Reflection; using Objects.Other; using Speckle.ConnectorUnity; +using Speckle.ConnectorUnity.Converter.Utils; using Speckle.ConnectorUnity.NativeCache; +using Speckle.ConnectorUnity.Wrappers; using Speckle.Core.Logging; using Speckle.Core.Models; using UnityEditor; diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.Geometry.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.Geometry.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.Mesh.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs similarity index 99% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.Mesh.cs rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs index 244d6a3..f2ede74 100644 --- a/Packages/systems.speckle.speckle-unity/ConverterUnity.Mesh.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Speckle.ConnectorUnity.Converter.Utils; using Objects.Other; using Objects.Utils; -using Speckle.ConnectorUnity; using Speckle.ConnectorUnity.NativeCache; using Speckle.Core.Models; using UnityEngine; diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.Mesh.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.Mesh.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.Units.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.Units.cs rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.Units.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.Units.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs similarity index 98% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.cs rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs index e8a2577..c726ee1 100644 --- a/Packages/systems.speckle.speckle-unity/ConverterUnity.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs @@ -6,8 +6,9 @@ using System.Collections.Generic; using System.Linq; using Objects.BuiltElements; using Objects.Other; -using Speckle.ConnectorUnity; +using Speckle.ConnectorUnity.Converter.Utils; using Speckle.ConnectorUnity.NativeCache; +using Speckle.ConnectorUnity.Wrappers; using UnityEngine; using Mesh = Objects.Geometry.Mesh; using Object = UnityEngine.Object; diff --git a/Packages/systems.speckle.speckle-unity/ConverterUnity.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/ConverterUnity.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef b/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef new file mode 100644 index 0000000..57eb706 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef @@ -0,0 +1,18 @@ +{ + "name": "Objects.Converter", + "rootNamespace": "Objects", + "references": [ + "GUID:05078f9b6da40444fbd72ec600449925", + "GUID:d274441ecc3eb3f43b093eec1503d681", + "GUID:50d889142fdf9de4b8501c6eaa4b3225" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef.meta new file mode 100644 index 0000000..3583fb1 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7383cd71541a2aa48a7baf23f74b4d5f +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils.meta b/Packages/systems.speckle.speckle-unity/Converter/Utils.meta new file mode 100644 index 0000000..2ae3122 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 29458c1909cf0d946af3e931fec1df0b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/ObjectExtensions.cs b/Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs similarity index 94% rename from Packages/systems.speckle.speckle-unity/ObjectExtensions.cs rename to Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs index 9769522..fb86e0f 100644 --- a/Packages/systems.speckle.speckle-unity/ObjectExtensions.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs @@ -2,7 +2,7 @@ using System.Linq; using Speckle.Core.Models; #nullable enable -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Converter.Utils { /// /// Extension methods for object models diff --git a/Packages/systems.speckle.speckle-unity/ObjectExtensions.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/ObjectExtensions.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef new file mode 100644 index 0000000..887ffc3 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef @@ -0,0 +1,14 @@ +{ + "name": "Utils", + "rootNamespace": "Speckle.ConnectorUnity", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef.meta b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef.meta new file mode 100644 index 0000000..9f34143 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 50d889142fdf9de4b8501c6eaa4b3225 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Utils.cs b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs similarity index 97% rename from Packages/systems.speckle.speckle-unity/Utils.cs rename to Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs index 80b8ee2..fa9be18 100644 --- a/Packages/systems.speckle.speckle-unity/Utils.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs @@ -2,7 +2,7 @@ using UnityEngine; #nullable enable -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Converter.Utils { public static class Utils { diff --git a/Packages/systems.speckle.speckle-unity/Utils.cs.meta b/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils.cs.meta rename to Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs deleted file mode 100644 index 05cc4a9..0000000 --- a/Packages/systems.speckle.speckle-unity/Editor/StreamSelectionEditor.cs +++ /dev/null @@ -1,263 +0,0 @@ - -using System; -using System.Collections.Generic; -using Speckle.Core.Api; -using Speckle.Core.Credentials; -using UnityEditor; -using UnityEditor.Experimental.GraphView; -using UnityEditor.UIElements; -using UnityEngine; - -#nullable enable -namespace Speckle.ConnectorUnity -{ - [CustomPropertyDrawer(typeof(AccountSelection))] - public sealed class AccountSelectionDrawer : OptionSelectionDrawer - { - protected override bool DisplayRefresh => true; - protected override string FormatOption(Account o) => $"{o.userInfo.email} | {o.serverInfo.name}"; - protected override int GUIDetailsPropertyCount => 4; - protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Account selection) - { - EditorGUI.BeginDisabledGroup(true); - position.height = DetailsTextHeight; - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Id", selection.userInfo.id); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Name", selection.userInfo.name); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Server", selection.serverInfo.name); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "URL", selection.serverInfo.url); - - EditorGUI.EndDisabledGroup(); - } - } - - [CustomPropertyDrawer(typeof(StreamSelection))] - public sealed class StreamSelectionDrawer : OptionSelectionDrawer - { - protected override bool DisplayRefresh => true; - - protected override string FormatOption(Stream o) => $"{o.name}"; - protected override int GUIDetailsPropertyCount => 7; - - protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Stream selection) - { - EditorGUI.BeginDisabledGroup(true); - position.height = DetailsTextHeight; - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Stream Id", selection.id); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Description", selection.description); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Is Public", selection.isPublic.ToString()); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Role", selection.role); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Created At", selection.createdAt); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Updated At", selection.updatedAt); - - EditorGUI.EndDisabledGroup(); - - position.y += DetailsTextHeight; - var nameField = EditorGUI.PropertyField(position, property.FindPropertyRelative($"<{nameof(StreamSelection.RequestLimit)}>k__BackingField")); - - } - } - - [CustomPropertyDrawer(typeof(BranchSelection))] - public sealed class BranchSelectionDrawer : OptionSelectionDrawer - { - protected override bool DisplayRefresh => true; - - protected override string FormatOption(Branch o) => $"{o.name}"; - protected override int GUIDetailsPropertyCount => 1; - - protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Branch selection) - { - EditorGUI.BeginDisabledGroup(true); - position.height = DetailsTextHeight; - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Description", selection.description); - - EditorGUI.EndDisabledGroup(); - } - } - - [CustomPropertyDrawer(typeof(CommitSelection))] - public sealed class CommitSelectionDrawer : OptionSelectionDrawer - { - protected override string FormatOption(Commit o) => $"{o.message} - {o.id}"; - protected override int GUIDetailsPropertyCount => 5; - - protected override void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, Commit selection) - { - EditorGUI.BeginDisabledGroup(true); - position.height = DetailsTextHeight; - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Commit Id", selection.id); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Author Name", selection.authorName); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Created At", selection.createdAt); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Source Application", selection.sourceApplication); - - position.y += DetailsTextHeight; - EditorGUI.TextField(position, "Reference Object Id", selection.referencedObject); - - EditorGUI.EndDisabledGroup(); - - } - } - - - public abstract class OptionSelectionDrawer : PropertyDrawer where TOption : class - { - private const float RefreshButtonWidthScale = 0.2f; - private const float PrefixIndentation = 100f; - protected readonly float DetailsTextHeight = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - private bool foldOutStatus = false; - protected virtual bool DisplayRefresh => false; - protected abstract string FormatOption(TOption o); - protected abstract int GUIDetailsPropertyCount { get; } - - private string[] GetFormattedOptions(TOption[] options) - { - int optionsCount = options.Length; - string[] choices = new string[optionsCount]; - for (int i = 0; i < optionsCount; i++) - { - choices[i] = FormatOption(options[i]); - } - - return choices; - } - - protected abstract void OnGUIDetails(Rect position, SerializedProperty property, GUIContent label, TOption selection); - - public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) - { - EditorGUI.BeginProperty(position, label, property); - var t = (OptionSelection)fieldInfo.GetValue(property.serializedObject.targetObject); - - var selectionRect = position;//EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); - selectionRect.x += PrefixIndentation + 5; - selectionRect.width -= PrefixIndentation + 5; - - var popupSize = DisplayRefresh - ? new Rect(selectionRect.x, selectionRect.y, selectionRect.width * (1-RefreshButtonWidthScale), DetailsTextHeight) - : selectionRect; - //TODO: fancy popup - - var selectedOption = t.Selected; - string selectedChoice = selectedOption != null ? FormatOption(selectedOption) : ""; - - if (GUI.Button(popupSize, selectedChoice, EditorStyles.popup)) - { - var windowPos = GUIUtility.GUIToScreenPoint(Event.current.mousePosition); - var provider = ScriptableObject.CreateInstance(); - provider.Title = typeof(TOption).Name; - provider.listItems = GetFormattedOptions(t.Options);; - provider.onSetIndexCallback = o => { t.SelectedIndex = o;}; - SearchWindow.Open(new SearchWindowContext(windowPos), provider); - } - - if (DisplayRefresh) - { - var buttonSize = new Rect(selectionRect.x + popupSize.width , selectionRect.y, selectionRect.width * RefreshButtonWidthScale, DetailsTextHeight); - if (GUI.Button(buttonSize, "Refresh")) - { - t.RefreshOptions(); - } - } - - //TODO drop down with details - //EditorGUI.DropdownButton(position, "TEST", FocusType.Passive); - - //position.y += DetailsTextHeight; - { // Details drop down - int visiblePropCount = property.isExpanded ? GUIDetailsPropertyCount : 0; - var detailsHeight = new Vector2(PrefixIndentation, DetailsTextHeight + visiblePropCount * DetailsTextHeight); - var foldoutRect = new Rect(position.position, detailsHeight); - property.isExpanded = EditorGUI.BeginFoldoutHeaderGroup(foldoutRect, property.isExpanded, label); - if (property.isExpanded && selectedOption != null) - { - EditorGUI.indentLevel++; - OnGUIDetails(position, property, label, selectedOption); - EditorGUI.indentLevel--; - } - EditorGUI.EndFoldoutHeaderGroup(); - } - - EditorGUI.EndProperty(); - EditorUtility.SetDirty(property.serializedObject.targetObject); - - } - public override float GetPropertyHeight(SerializedProperty property, GUIContent label) - { - var standardHeight = EditorGUIUtility.singleLineHeight; - - if (!property.isExpanded) return standardHeight; - - var detailsHeight = GUIDetailsPropertyCount * (standardHeight + EditorGUIUtility.standardVerticalSpacing); - - return standardHeight + detailsHeight; - } - - } - - #nullable disable - - public sealed class StringListSearchProvider : ScriptableObject, ISearchWindowProvider - { - public string Title { get; set; } - public string[] listItems; - - public Action onSetIndexCallback; - - public List CreateSearchTree(SearchWindowContext context) - { - List searchList = new(listItems.Length + 1) {new SearchTreeGroupEntry(new GUIContent(Title), 0)}; - - for(int i = 0; i < listItems.Length; i++) - { - SearchTreeEntry entry = new SearchTreeEntry(new GUIContent(listItems[i])) - { - level = 1, - userData = i - }; - searchList.Add(entry); - } - - return searchList; - } - - public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context) - { - onSetIndexCallback?.Invoke((int)SearchTreeEntry.userData); - - return true; - } - } - - - -} diff --git a/Packages/systems.speckle.speckle-unity/Factories.meta b/Packages/systems.speckle.speckle-unity/Factories.meta new file mode 100644 index 0000000..166f79d --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Factories.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7eb57c561faa0df43947fdc6214d0592 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs b/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs new file mode 100644 index 0000000..2425ed9 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs @@ -0,0 +1,14 @@ +using Objects.Converter.Unity; +using Speckle.Core.Kits; + +namespace Speckle.ConnectorUnity.Factories +{ + + public static class ConverterFactory + { + public static ISpeckleConverter GetDefaultConverter() + { + return new ConverterUnity(); + } + } +} diff --git a/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs.meta b/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs.meta new file mode 100644 index 0000000..cce0f38 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4831f0baf7fb4be45a4219c1acd23ee5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef b/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef new file mode 100644 index 0000000..5097837 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef @@ -0,0 +1,14 @@ +{ + "name": "Factories", + "rootNamespace": "Speckle.ConnectorUnity", + "references": ["GUID:7383cd71541a2aa48a7baf23f74b4d5f"], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef.meta b/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef.meta new file mode 100644 index 0000000..bca654a --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 13aec21e8e96f864bafd00df49f225fc +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers.meta b/Packages/systems.speckle.speckle-unity/Wrappers.meta new file mode 100644 index 0000000..c34a0fc --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9f1c7d8bea27bd42943bbefbca89af1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta new file mode 100644 index 0000000..b2f96e3 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82f8a9bc0a75c5a4886e84400405ce54 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Editor/SpecklePropertiesEditor.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs similarity index 99% rename from Packages/systems.speckle.speckle-unity/Editor/SpecklePropertiesEditor.cs rename to Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs index a77dd0a..f908f2a 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/SpecklePropertiesEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs @@ -11,7 +11,7 @@ using Mesh = Objects.Geometry.Mesh; using Object = UnityEngine.Object; #nullable enable -namespace Speckle.ConnectorUnity.Editor +namespace Speckle.ConnectorUnity.Wrappers.Editor { [CustomEditor(typeof(SpeckleProperties))] public class SpecklePropertiesEditor : UnityEditor.Editor diff --git a/Packages/systems.speckle.speckle-unity/Editor/SpecklePropertiesEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Editor/SpecklePropertiesEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef new file mode 100644 index 0000000..a71ea7d --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "Wrappers.Editor", + "rootNamespace": "Speckle.ConnectorUnity", + "references": ["GUID:d274441ecc3eb3f43b093eec1503d681"], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef.meta new file mode 100644 index 0000000..63d707b --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5a59c53feb35b8942935c8c5ee0ea4c1 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection.meta new file mode 100644 index 0000000..a7d0244 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2d8faa20c5c31b4da3a60946cf3e451 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs new file mode 100644 index 0000000..fadd2e1 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections; +using System.Linq; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity.Wrappers.Selection +{ + [Serializable] + public sealed class AccountSelection : OptionSelection, IDisposable + { + private Client? client; + public override Client? Client + { + get + { + Account? account = Selected; + if (account == null) return client = null; + if (client == null || !client.Account.Equals(account)) return client = new Client(Selected); + return client; + } + } + + protected override string? KeyFunction(Account? value) => value?.id; + + public override void RefreshOptions() + { + Account[] accounts; + try + { + accounts = AccountManager.GetAccounts().ToArray(); + if(accounts.Length == 0) + Debug.LogWarning("No Accounts found, please login in Manager"); + } + catch(Exception e) + { + accounts = Array.Empty(); + Debug.LogWarning($"Unable to refresh {this}\n{e}"); + } + GenerateOptions(accounts, isDefault: (a, i) => a.isDefault || i == 0); + } + + public void Dispose() + { + client?.Dispose(); + } + } +} diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs.meta new file mode 100644 index 0000000..7632b25 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b42ba90e10f1d484c97adf9f3fde1a13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs new file mode 100644 index 0000000..2b70aa2 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using Speckle.Core.Api; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity.Wrappers.Selection +{ + [Serializable] + public sealed class BranchSelection : OptionSelection + { + [field: SerializeField, Range(1,100), Tooltip("Number of branches to request")] + public int BranchesLimit { get; set; } = 30; + [field: SerializeField, Range(1,100), Tooltip("Number of commits to request")] + public int CommitsLimit { get; set; } = 15; + + [field: SerializeReference] + public StreamSelection StreamSelection { get; private set; } + public override Client? Client => StreamSelection.Client; + + public BranchSelection(StreamSelection streamSelection) + { + StreamSelection = streamSelection; + Initialise(); + } + + public void Initialise() + { + StreamSelection.OnSelectionChange = RefreshOptions; + } + + protected override string? KeyFunction(Branch? value) => value?.name; + + public override void RefreshOptions() + { + Stream? stream = StreamSelection.Selected; + if (stream == null) return; + IList branches; + try + { + branches = Client!.StreamGetBranches(stream.id, BranchesLimit, CommitsLimit).GetAwaiter().GetResult(); + } + catch(Exception e) + { + Debug.LogWarning($"Unable to refresh {this}\n{e}"); + branches = Array.Empty(); + } + GenerateOptions(branches, (b, _) => b.name == "main"); + } + } +} diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs.meta new file mode 100644 index 0000000..72af9ad --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 666adc9a98cfadc46a3bd907b9dc5bda +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs new file mode 100644 index 0000000..07105c8 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using Speckle.Core.Api; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity.Wrappers.Selection +{ + + [Serializable] + public sealed class CommitSelection : OptionSelection + { + + [field: SerializeReference] + public BranchSelection BranchSelection { get; private set; } + + public override Client? Client => BranchSelection.Client; + + public CommitSelection(BranchSelection branchSelection) + { + BranchSelection = branchSelection; + Initialise(); + + } + + public void Initialise() + { + BranchSelection.OnSelectionChange = RefreshOptions; + } + + + protected override string? KeyFunction(Commit? value) => value?.id; + + public override void RefreshOptions() + { + Branch? branch = BranchSelection!.Selected; + if (branch == null) return; + List commits = branch.commits.items; + GenerateOptions(commits, (_, i) => i == 0); + } + } +} diff --git a/Packages/systems.speckle.speckle-unity/CommitSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/CommitSelection.cs.meta rename to Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs new file mode 100644 index 0000000..bad0294 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using Speckle.Core.Api; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity.Wrappers.Selection +{ + /// + /// Reusable serializable type that abstracts + /// the fetching of objects. + /// And exposes an of + /// with serialised selection. + /// + /// + [Serializable] + public abstract class OptionSelection + where TOption : class + { + [SerializeField] private int selectedIndex = -1; + + public int SelectedIndex + { + get => selectedIndex; + set + { + selectedIndex = value; + OnSelectionChange?.Invoke(); + } + } + + public TOption? Selected + { + get + { + if (Options == null) return null; + if (SelectedIndex < 0 || SelectedIndex >= Options.Length) return null; + return Options[SelectedIndex]; + } + } + + public TOption[] Options { get; protected set; } = Array.Empty(); + public Action? OnSelectionChange { get; set; } + + public abstract Client? Client { get; } + + [return: NotNullIfNotNull("value")] + protected abstract string? KeyFunction(TOption? value); + + public abstract void RefreshOptions(); + + protected void GenerateOptions(IList source, Func isDefault) + { + List optionsToAdd = new List(source.Count); + int defaultOption = -1; + int index = 0; + foreach (TOption? a in source) + { + if (a == null) continue; + optionsToAdd.Add(a); + if (isDefault(a, index)) defaultOption = index; + index++; + } + + TOption? currentSelected = Selected; + bool selectionOutOfRange = SelectedIndex < 0 || SelectedIndex >= optionsToAdd.Count; + if (selectionOutOfRange + || (currentSelected != null + && KeyFunction(currentSelected) != KeyFunction(optionsToAdd[SelectedIndex]))) + { + selectedIndex = defaultOption; + } + + Options = optionsToAdd.ToArray(); + Debug.Log($"{this.GetType()} updated"); + OnSelectionChange?.Invoke(); + } + } +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs.meta new file mode 100644 index 0000000..2f3ebb4 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f73f6a062bde10a4b902533e53b3c3be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs new file mode 100644 index 0000000..01ec1b9 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using Speckle.Core.Api; +using UnityEngine; + +#nullable enable +namespace Speckle.ConnectorUnity.Wrappers.Selection +{ + [Serializable] + public sealed class StreamSelection : OptionSelection + { + private const int DEFAULT_REQUEST_LIMIT = 50; + [field: SerializeField, Range(1,100), Tooltip("Number of streams to request")] + public int StreamsLimit { get; set; } = DEFAULT_REQUEST_LIMIT; + [field: SerializeReference] + public AccountSelection AccountSelection { get; private set; } + + public StreamSelection(AccountSelection accountSelection) + { + AccountSelection = accountSelection; + Initialise(); + } + public void Initialise() + { + AccountSelection.OnSelectionChange = RefreshOptions; + } + + public override Client? Client => AccountSelection.Client; + + protected override string? KeyFunction(Stream? value) => value?.id; + public override void RefreshOptions() + { + if (Client == null) return; + IList streams; + try + { + streams = Client.StreamsGet(StreamsLimit).GetAwaiter().GetResult(); + } + catch(Exception e) + { + Debug.LogWarning($"Unable to refresh {this}\n{e}"); + streams = Array.Empty(); + } + GenerateOptions(streams, (_, i) => i == 0); + } + } +} diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs.meta new file mode 100644 index 0000000..f2fb5fa --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a363ef51d6b42f45882cffefb981975 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef b/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef new file mode 100644 index 0000000..db20ebb --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef @@ -0,0 +1,16 @@ +{ + "name": "Serilisation Wrappers", + "rootNamespace": "Speckle.ConnectorUnity", + "references": [ + "GUID:24f666972ea7e9149abddaae766b9c1d" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef.meta b/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef.meta new file mode 100644 index 0000000..f5fb161 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d274441ecc3eb3f43b093eec1503d681 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/SpeckleProperties.cs b/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs similarity index 98% rename from Packages/systems.speckle.speckle-unity/SpeckleProperties.cs rename to Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs index 70cf564..259ab85 100644 --- a/Packages/systems.speckle.speckle-unity/SpeckleProperties.cs +++ b/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs @@ -6,7 +6,7 @@ using Speckle.Core.Api; using Speckle.Core.Models; using UnityEngine; -namespace Speckle.ConnectorUnity +namespace Speckle.ConnectorUnity.Wrappers { /// /// This class gets attached to GOs and is used to store Speckle's metadata when sending / receiving diff --git a/Packages/systems.speckle.speckle-unity/SpeckleProperties.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/SpeckleProperties.cs.meta rename to Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta From 6a802df7ee035336355f64007375529f4879db93 Mon Sep 17 00:00:00 2001 From: JR-Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Wed, 9 Nov 2022 00:08:41 +0000 Subject: [PATCH 3/7] Stream Previews --- Assets/SpecklePlayground.unity | 124 +++++++++--------- .../Editor/Speckle.Connector.Editor.asmdef | 3 +- .../Editor/SpeckleReceiver.Editor.cs | 30 ++++- .../RecursiveConverter.ToSpeckle.cs | 2 +- .../Components/SpeckleReceiver.cs | 107 +++++++++------ .../Unity/ConverterUnity.Geometry.cs | 4 +- .../Converter/Unity/ConverterUnity.Mesh.cs | 4 +- .../Converter/Unity/ConverterUnity.cs | 2 +- .../Speckle.Connector.asmdef | 3 +- .../{Converter => }/Utils.meta | 0 .../{ => Utils}/CoreUtils.cs | 0 .../{ => Utils}/CoreUtils.cs.meta | 0 .../{Converter => }/Utils/ObjectExtensions.cs | 2 +- .../Utils/ObjectExtensions.cs.meta | 0 .../{Converter => }/Utils/Utils.asmdef | 0 .../{Converter => }/Utils/Utils.asmdef.meta | 0 .../{Converter => }/Utils/Utils.cs | 23 +++- .../{Converter => }/Utils/Utils.cs.meta | 0 .../Wrappers/Selection/Editor.meta | 8 ++ .../Editor/StreamSelectionEditor.cs | 3 +- .../Editor/StreamSelectionEditor.cs.meta | 0 .../Wrappers/Selection/OptionSelection.cs | 2 +- ...isationWrappers.asmdef => Wrappers.asmdef} | 2 +- ...ppers.asmdef.meta => Wrappers.asmdef.meta} | 0 24 files changed, 202 insertions(+), 117 deletions(-) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Utils}/CoreUtils.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Utils}/CoreUtils.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils/ObjectExtensions.cs (94%) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils/ObjectExtensions.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils/Utils.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils/Utils.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils/Utils.cs (68%) rename Packages/systems.speckle.speckle-unity/{Converter => }/Utils/Utils.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta rename Packages/systems.speckle.speckle-unity/{Components => Wrappers/Selection}/Editor/StreamSelectionEditor.cs (98%) rename Packages/systems.speckle.speckle-unity/{Components => Wrappers/Selection}/Editor/StreamSelectionEditor.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/Wrappers/{SerialisationWrappers.asmdef => Wrappers.asmdef} (91%) rename Packages/systems.speckle.speckle-unity/Wrappers/{SerialisationWrappers.asmdef.meta => Wrappers.asmdef.meta} (100%) diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index 95dd6b6..c46d40c 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -1066,7 +1066,7 @@ GameObject: m_Component: - component: {fileID: 344004931} - component: {fileID: 344004930} - - component: {fileID: 344004929} + - component: {fileID: 344004932} m_Layer: 0 m_Name: New Editor Receiver m_TagString: Untagged @@ -1074,63 +1074,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &344004929 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 344004928} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722279309049856 - k__BackingField: - rid: 6366722279309049857 - k__BackingField: - rid: 6366722279309049858 - k__BackingField: - rid: 6366722279309049859 - OnCommitSelectionChange: - m_PersistentCalls: - m_Calls: [] - OnReceiveProgressAction: - m_PersistentCalls: - m_Calls: [] - OnErrorAction: - m_PersistentCalls: - m_Calls: [] - OnTotalChildrenCountKnown: - m_PersistentCalls: - m_Calls: [] - OnComplete: - m_PersistentCalls: - m_Calls: [] - references: - version: 2 - RefIds: - - rid: 6366722279309049856 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} - data: - selectedIndex: 0 - - rid: 6366722279309049857 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} - data: - selectedIndex: 1 - k__BackingField: 50 - - rid: 6366722279309049858 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} - data: - selectedIndex: 0 - k__BackingField: 30 - k__BackingField: 15 - - rid: 6366722279309049859 - type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Serilisation Wrappers} - data: - selectedIndex: 1 --- !u!114 &344004930 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1152,13 +1095,76 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 344004928} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 10.1570635, y: -2.743827, z: 12.879177} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &344004932 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344004928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722279309049896 + k__BackingField: + rid: 6366722279309049897 + k__BackingField: + rid: 6366722279309049898 + k__BackingField: + rid: 6366722279309049899 + OnCommitSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnReceiveProgressAction: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnTotalChildrenCountKnown: + m_PersistentCalls: + m_Calls: [] + OnComplete: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 6366722279309049896 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + data: + selectedIndex: 0 + - rid: 6366722279309049897 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + data: + selectedIndex: 0 + k__BackingField: 50 + k__BackingField: + rid: 6366722279309049896 + - rid: 6366722279309049898 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + data: + selectedIndex: 0 + k__BackingField: 50 + k__BackingField: 15 + k__BackingField: + rid: 6366722279309049897 + - rid: 6366722279309049899 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + data: + selectedIndex: 0 + k__BackingField: + rid: 6366722279309049898 --- !u!1 &407638589 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef index 8420dce..1e5b8d0 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef @@ -5,7 +5,8 @@ "GUID:eed1b8b83e2c0074d9e5de2348e3ff72", "GUID:05078f9b6da40444fbd72ec600449925", "GUID:e6adfdc4e436206479f48eafc82f32b5", - "GUID:d274441ecc3eb3f43b093eec1503d681" + "GUID:d274441ecc3eb3f43b093eec1503d681", + "GUID:50d889142fdf9de4b8501c6eaa4b3225" ], "includePlatforms": [ "Editor" diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs index b5be207..a49a14d 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs @@ -3,24 +3,50 @@ using System.Collections.Concurrent; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Speckle.ConnectorUnity.Components; using Speckle.Core.Api; using Speckle.Core.Models; using UnityEditor; using UnityEngine; #nullable enable -namespace Speckle.ConnectorUnity.Editor +namespace Speckle.ConnectorUnity.Components.Editor { [CustomEditor(typeof(SpeckleReceiver))] [CanEditMultipleObjects] public class SpeckleReceiverEditor : UnityEditor.Editor { + private bool foldOutStatus = true; + private Texture2D? previewImage; + private CancellationTokenSource? tokenSource; + + public void OnEnable() + { + var speckleReceiver = (SpeckleReceiver) target; + UpdatePreviewImage(); + speckleReceiver.OnCommitSelectionChange.AddListener(_ => UpdatePreviewImage()); + } + + private void UpdatePreviewImage() + { + previewImage = null; + ((SpeckleReceiver)target).GetPreviewImage(t => previewImage = t); + } + public override async void OnInspectorGUI() { var speckleReceiver = (SpeckleReceiver) target; + + + //Draw events in a collapsed region DrawDefaultInspector(); + + foldOutStatus = EditorGUILayout.Foldout(foldOutStatus, "Preview Image"); + if (foldOutStatus) + { + Rect rect = GUILayoutUtility.GetAspectRect(7f/4f); + if(previewImage != null) GUI.DrawTexture(rect, previewImage); + } bool receive = GUILayout.Button("Receive!"); diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs index aae810f..8d94bc7 100644 --- a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs +++ b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; -using Speckle.ConnectorUnity.Converter.Utils; +using Speckle.ConnectorUnity.Utils; using Speckle.Core.Models; using UnityEngine; diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs index 4e6ab9f..9f3da72 100644 --- a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs +++ b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs @@ -36,11 +36,15 @@ namespace Speckle.ConnectorUnity.Components private CancellationTokenSource cancellationTokenSource; - [Header("Events")] + [Header("Events"), HideInInspector] public UnityEvent OnCommitSelectionChange; + [HideInInspector] public UnityEvent> OnReceiveProgressAction; + [HideInInspector] public UnityEvent OnErrorAction; + [HideInInspector] public UnityEvent OnTotalChildrenCountKnown; + [HideInInspector] public UnityEvent OnComplete; #nullable enable @@ -62,52 +66,13 @@ namespace Speckle.ConnectorUnity.Components Stream.Initialise(); Branch.Initialise(); Commit.Initialise(); + Commit.OnSelectionChange = () => OnCommitSelectionChange.Invoke(Commit.Selected); if(Account.Options is not {Length: > 0} || forceRefresh) Account.RefreshOptions(); } - /// - /// - /// - /// - /// - /// - /// error messages for - /// true if selection is complete, as we are ready to receive - public bool GetSelection( - [NotNullWhen(true)] out Client? client, - [NotNullWhen(true)] out Stream? stream, - [NotNullWhen(true)] out Commit? commit, - [NotNullWhen(false)] out string? error) - { - Account? account = Account.Selected; - stream = Stream.Selected; - commit = Commit.Selected; - - if (account == null) - { - error = "Selected Account is null"; - client = null; - return false; - } - client = Account.Client ?? new Client(account); - - if (stream == null) - { - error = "Selected Stream is null"; - return false; - } - - if (commit == null) - { - error = "Selected Commit is null"; - return false; - } - error = null; - return true; - } /// @@ -246,7 +211,67 @@ namespace Speckle.ConnectorUnity.Components return rootObject; } + /// + /// + /// + /// + /// + /// + /// error messages for + /// true if selection is complete, as we are ready to receive + public bool GetSelection( + [NotNullWhen(true)] out Client? client, + [NotNullWhen(true)] out Stream? stream, + [NotNullWhen(true)] out Commit? commit, + [NotNullWhen(false)] out string? error) + { + Account? account = Account.Selected; + stream = Stream.Selected; + commit = Commit.Selected; + + if (account == null) + { + error = "Selected Account is null"; + client = null; + return false; + } + client = Account.Client ?? new Client(account); + + if (stream == null) + { + error = "Selected Stream is null"; + return false; + } + + if (commit == null) + { + error = "Selected Commit is null"; + return false; + } + error = null; + return true; + } + /// + /// Fetches the commit preview for the currently selected commit + /// + /// Callback function to be called when the web request completes + /// if , , or was + public bool GetPreviewImage(Action callback) + { + Account? account = Account.Selected; + if (account == null) return false; + string? streamId = Stream.Selected?.id; + if (streamId == null) return false; + string? commitId = Commit.Selected?.id; + if (commitId == null) return false; + string url = $"{account.serverInfo.url}/preview/{streamId}/commits/{commitId}"; + string authToken = account.token; + + StartCoroutine(Utils.Utils.GetImageRoutine(url, authToken, callback)); + return true; + } + public void OnDestroy() { cancellationTokenSource?.Cancel(); diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs index aecc773..0c6f6ba 100644 --- a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs @@ -1,13 +1,11 @@ using System; using Objects.Geometry; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Reflection; using Objects.Other; -using Speckle.ConnectorUnity; -using Speckle.ConnectorUnity.Converter.Utils; using Speckle.ConnectorUnity.NativeCache; +using Speckle.ConnectorUnity.Utils; using Speckle.ConnectorUnity.Wrappers; using Speckle.Core.Logging; using Speckle.Core.Models; diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs index f2ede74..6a03e8d 100644 --- a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; -using Speckle.ConnectorUnity.Converter.Utils; +using Speckle.ConnectorUnity.Utils; using Objects.Other; using Objects.Utils; using Speckle.ConnectorUnity.NativeCache; @@ -285,7 +285,7 @@ namespace Objects.Converter.Unity => MeshToNativeMesh(meshes, out nativeMesh, out _, false); - /// + /// /// when true, will recenter vertices /// Center position for the mesh public void MeshToNativeMesh(IReadOnlyCollection meshes, diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs index c726ee1..a5436fd 100644 --- a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using Objects.BuiltElements; using Objects.Other; -using Speckle.ConnectorUnity.Converter.Utils; +using Speckle.ConnectorUnity.Utils; using Speckle.ConnectorUnity.NativeCache; using Speckle.ConnectorUnity.Wrappers; using UnityEngine; diff --git a/Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef b/Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef index 5dcce05..6f5e93a 100644 --- a/Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef +++ b/Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef @@ -4,7 +4,8 @@ "references": [ "GUID:24f666972ea7e9149abddaae766b9c1d", "GUID:05078f9b6da40444fbd72ec600449925", - "GUID:a97f36292d600f8459146719f68d6bb2" + "GUID:a97f36292d600f8459146719f68d6bb2", + "GUID:50d889142fdf9de4b8501c6eaa4b3225" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils.meta b/Packages/systems.speckle.speckle-unity/Utils.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Utils.meta rename to Packages/systems.speckle.speckle-unity/Utils.meta diff --git a/Packages/systems.speckle.speckle-unity/CoreUtils.cs b/Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/CoreUtils.cs rename to Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs diff --git a/Packages/systems.speckle.speckle-unity/CoreUtils.cs.meta b/Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/CoreUtils.cs.meta rename to Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs b/Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs similarity index 94% rename from Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs rename to Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs index fb86e0f..a9a4320 100644 --- a/Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs +++ b/Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs @@ -2,7 +2,7 @@ using System.Linq; using Speckle.Core.Models; #nullable enable -namespace Speckle.ConnectorUnity.Converter.Utils +namespace Speckle.ConnectorUnity.Utils { /// /// Extension methods for object models diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs.meta b/Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Utils/ObjectExtensions.cs.meta rename to Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef b/Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef rename to Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef.meta b/Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs b/Packages/systems.speckle.speckle-unity/Utils/Utils.cs similarity index 68% rename from Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs rename to Packages/systems.speckle.speckle-unity/Utils/Utils.cs index fa9be18..c6e9687 100644 --- a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs +++ b/Packages/systems.speckle.speckle-unity/Utils/Utils.cs @@ -1,8 +1,12 @@ using System; +using System.Collections; +using System.Threading; +using System.Threading.Tasks; using UnityEngine; +using UnityEngine.Networking; #nullable enable -namespace Speckle.ConnectorUnity.Converter.Utils +namespace Speckle.ConnectorUnity.Utils { public static class Utils { @@ -69,5 +73,22 @@ namespace Speckle.ConnectorUnity.Converter.Utils return new Color(argb.R / 255f, argb.G / 255f, argb.B / 255f); } + + public static IEnumerator GetImageRoutine(string url, string authToken, Action callback) + { + using UnityWebRequest www = UnityWebRequestTexture.GetTexture(url); + www.SetRequestHeader("Authorization", $"Bearer {authToken}"); + UnityWebRequestAsyncOperation request = www.SendWebRequest(); + + yield return request; + + if(www.result != UnityWebRequest.Result.Success ) + { + Debug.LogWarning( $"Error fetching image from {www.url}: {www.error}" ); + yield break; + } + Texture2D? texture = DownloadHandlerTexture.GetContent(www); + callback.Invoke(texture); + } } } \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs.meta b/Packages/systems.speckle.speckle-unity/Utils/Utils.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Utils/Utils.cs.meta rename to Packages/systems.speckle.speckle-unity/Utils/Utils.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta new file mode 100644 index 0000000..983683e --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d5d6adc3dd4d864fbba5c498ee6f943 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs similarity index 98% rename from Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs rename to Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs index e9c732c..629d50c 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs @@ -1,14 +1,13 @@ #nullable enable using System; using System.Collections.Generic; -using Speckle.ConnectorUnity.Wrappers.Selection; using Speckle.Core.Api; using Speckle.Core.Credentials; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; -namespace Speckle.ConnectorUnity.Components.Editor +namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor { [CustomPropertyDrawer(typeof(AccountSelection))] public sealed class AccountSelectionDrawer : OptionSelectionDrawer diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/StreamSelectionEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs index bad0294..2e4e273 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs @@ -73,7 +73,7 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection } Options = optionsToAdd.ToArray(); - Debug.Log($"{this.GetType()} updated"); + //Debug.Log($"{this.GetType()} updated"); OnSelectionChange?.Invoke(); } } diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef b/Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef similarity index 91% rename from Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef rename to Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef index db20ebb..dc10065 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef @@ -1,5 +1,5 @@ { - "name": "Serilisation Wrappers", + "name": "Wrappers", "rootNamespace": "Speckle.ConnectorUnity", "references": [ "GUID:24f666972ea7e9149abddaae766b9c1d" diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/SerialisationWrappers.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef.meta From cf7362b023eeeb48edda21e6f69eea9ced261449 Mon Sep 17 00:00:00 2001 From: JR-Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Wed, 9 Nov 2022 03:12:23 +0000 Subject: [PATCH 4/7] feat(Sender): Added editor sender --- Assets/SpecklePlayground.unity | 1842 ++++++++++++++++- ...e.ConnectorUnity.Components.Editor.asmdef} | 2 +- ...nectorUnity.Components.Editor.asmdef.meta} | 0 ...ver.Editor.cs => SpeckleReceiverEditor.cs} | 18 +- ....cs.meta => SpeckleReceiverEditor.cs.meta} | 0 .../Components/Editor/SpeckleSendEditor.cs | 111 + .../Editor/SpeckleSendEditor.cs.meta | 11 + .../RecursiveConverter.ToSpeckle.cs | 2 +- .../Components/RecursiveConverter.cs.meta | 2 +- ... Speckle.ConnectorUnity.Components.asmdef} | 2 +- ...kle.ConnectorUnity.Components.asmdef.meta} | 0 .../Components/SpeckleReceiver.cs | 80 +- .../Components/SpeckleReceiver.cs.meta | 2 +- .../Components/SpeckleSender.cs | 185 ++ .../Components/SpeckleSender.cs.meta | 11 + ...ects.Converter.asmdef => Converter.asmdef} | 0 ...rter.asmdef.meta => Converter.asmdef.meta} | 0 .../Converter/Unity/ConverterUnity.Mesh.cs | 3 +- ...> Speckle.ConnectorUnity.Factories.asmdef} | 6 +- ...ckle.ConnectorUnity.Factories.asmdef.meta} | 0 .../systems.speckle.speckle-unity/Gizmos.meta | 8 + .../Gizmos/GetObjectValueByKey@128.png | Bin 0 -> 7534 bytes .../Gizmos/GetObjectValueByKey@128.png.meta | 159 ++ .../Gizmos/Receiver@128.png | Bin 0 -> 8702 bytes .../Gizmos/Receiver@128.png.meta | 159 ++ .../Gizmos/Sender@128.png | Bin 0 -> 8553 bytes .../Gizmos/Sender@128.png.meta | 159 ++ .../Gizmos/StreamList@128.png | Bin 0 -> 5473 bytes .../Gizmos/StreamList@128.png.meta | 159 ++ .../Gizmos/ToNative@128.png | Bin 0 -> 9001 bytes .../Gizmos/ToNative@128.png.meta | 159 ++ .../Gizmos/ToSpeckle@128.png | Bin 0 -> 8999 bytes .../Gizmos/ToSpeckle@128.png.meta | 159 ++ .../Gizmos/logo128.png | Bin 0 -> 1651 bytes .../Gizmos/logo128.png.meta | 159 ++ ...ConnectorUnity.NativeCaches.Editor.asmdef} | 8 +- ...ctorUnity.NativeCaches.Editor.asmdef.meta} | 0 ...peckle.ConnectorUnity.NativeCaches.asmdef} | 2 +- ...e.ConnectorUnity.NativeCaches.asmdef.meta} | 0 ...=> Speckle.ConnectorUnity.Wrappers.asmdef} | 2 +- ...eckle.ConnectorUnity.Wrappers.asmdef.meta} | 0 .../Wrappers/SpeckleProperties.cs.meta | 2 +- 42 files changed, 3329 insertions(+), 83 deletions(-) rename Packages/systems.speckle.speckle-unity/Components/Editor/{Speckle.Connector.Editor.asmdef => Speckle.ConnectorUnity.Components.Editor.asmdef} (91%) rename Packages/systems.speckle.speckle-unity/Components/Editor/{Speckle.Connector.Editor.asmdef.meta => Speckle.ConnectorUnity.Components.Editor.asmdef.meta} (100%) rename Packages/systems.speckle.speckle-unity/Components/Editor/{SpeckleReceiver.Editor.cs => SpeckleReceiverEditor.cs} (94%) rename Packages/systems.speckle.speckle-unity/Components/Editor/{SpeckleReceiver.Editor.cs.meta => SpeckleReceiverEditor.cs.meta} (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs create mode 100644 Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs.meta rename Packages/systems.speckle.speckle-unity/Components/{Components.asmdef => Speckle.ConnectorUnity.Components.asmdef} (92%) rename Packages/systems.speckle.speckle-unity/Components/{Components.asmdef.meta => Speckle.ConnectorUnity.Components.asmdef.meta} (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs create mode 100644 Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs.meta rename Packages/systems.speckle.speckle-unity/Converter/Unity/{Objects.Converter.asmdef => Converter.asmdef} (100%) rename Packages/systems.speckle.speckle-unity/Converter/Unity/{Objects.Converter.asmdef.meta => Converter.asmdef.meta} (100%) rename Packages/systems.speckle.speckle-unity/Factories/{Factories.asmdef => Speckle.ConnectorUnity.Factories.asmdef} (72%) rename Packages/systems.speckle.speckle-unity/Factories/{Factories.asmdef.meta => Speckle.ConnectorUnity.Factories.asmdef.meta} (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/GetObjectValueByKey@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/GetObjectValueByKey@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/Receiver@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/Receiver@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/Sender@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/Sender@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/StreamList@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/StreamList@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/logo128.png create mode 100644 Packages/systems.speckle.speckle-unity/Gizmos/logo128.png.meta rename Packages/systems.speckle.speckle-unity/NativeCache/Editor/{EditorCaches.asmdef => Speckle.ConnectorUnity.NativeCaches.Editor.asmdef} (60%) rename Packages/systems.speckle.speckle-unity/NativeCache/Editor/{EditorCaches.asmdef.meta => Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta} (100%) rename Packages/systems.speckle.speckle-unity/NativeCache/{NativeCaches.asmdef => Speckle.ConnectorUnity.NativeCaches.asmdef} (88%) rename Packages/systems.speckle.speckle-unity/NativeCache/{NativeCaches.asmdef.meta => Speckle.ConnectorUnity.NativeCaches.asmdef.meta} (100%) rename Packages/systems.speckle.speckle-unity/Wrappers/{Wrappers.asmdef => Speckle.ConnectorUnity.Wrappers.asmdef} (89%) rename Packages/systems.speckle.speckle-unity/Wrappers/{Wrappers.asmdef.meta => Speckle.ConnectorUnity.Wrappers.asmdef.meta} (100%) diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index c46d40c..2adadc8 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -250,6 +250,170 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 +--- !u!43 &16160170 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 3Gon - 1aa08a66f462925aeef377a47267567b + serializedVersion: 10 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 3 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 3 + localAABB: + m_Center: {x: 0, y: 0, z: 0.000000029802322} + m_Extent: {x: 0.86602545, y: 0, z: 0.75} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 1 + m_KeepIndices: 1 + m_IndexFormat: 0 + m_IndexBuffer: 000001000200 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 3 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 12 + format: 0 + dimension: 3 + - stream: 0 + offset: 24 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 40 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 144 + _typelessdata: d8b35dbf00000000000040bf000000000000803f000000000000803f0000000000000000000080bf000000000000000000000000000000000100403f000000000000803f000000000000803f0000000000000000000080bf0000000000000000d8b35d3f00000000feff3fbf000000000000803f000000000000803f0000000000000000000080bf0000000000000000 + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0.000000029802322} + m_Extent: {x: 0.86602545, y: 0, z: 0.75} + m_MeshUsageFlags: 0 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: --- !u!1 &39129898 GameObject: m_ObjectHideFlags: 0 @@ -849,6 +1013,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 160171836} m_CullTransparentMesh: 1 +--- !u!21 &172636256 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Standard (Instance) + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] --- !u!1 &194696812 GameObject: m_ObjectHideFlags: 0 @@ -976,6 +1218,219 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &239243192 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 239243193} + m_Layer: 0 + m_Name: Base - 73d02b0ceadebc15144becb5d5ffcfa9 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &239243193 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 239243192} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1622342827} + - {fileID: 297156582} + - {fileID: 422634215} + - {fileID: 1525231633} + - {fileID: 680084625} + m_Father: {fileID: 2044880247} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!21 &252696807 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Standard (Instance) + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] +--- !u!1 &297156581 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 297156582} + - component: {fileID: 297156584} + - component: {fileID: 297156583} + - component: {fileID: 297156585} + m_Layer: 0 + m_Name: 4Gon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &297156582 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297156581} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 239243193} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &297156583 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297156581} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 252696807} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &297156584 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297156581} + m_Mesh: {fileID: 1423796318} +--- !u!114 &297156585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297156581} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2cb1817d5a3fda645aa9b1b658ad3003, type: 3} + m_Name: + m_EditorClassIdentifier: + _serializedData: '{"totalChildrenCount":0,"applicationId":null,"speckle_type":"Speckle.ConnectorUnity.Wrappers.SpeckleProperties+SpeckleData","id":"c654a738a88de3616bff9515a0119272"}' + _serializedSpeckleType: Speckle.Core.Models.Base, SpeckleCore2, Version=2.1.0.0, + Culture=neutral, PublicKeyToken=null --- !u!1 &310693430 GameObject: m_ObjectHideFlags: 0 @@ -1066,6 +1521,7 @@ GameObject: m_Component: - component: {fileID: 344004931} - component: {fileID: 344004930} + - component: {fileID: 344004933} - component: {fileID: 344004932} m_Layer: 0 m_Name: New Editor Receiver @@ -1098,7 +1554,8 @@ Transform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 1691753947} m_Father: {fileID: 0} m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1111,17 +1568,66 @@ MonoBehaviour: m_GameObject: {fileID: 344004928} m_Enabled: 1 m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b95e704835cc48444b81e33c978f6f7f, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722279309049907 + k__BackingField: + rid: 6366722279309049908 + k__BackingField: + rid: 6366722279309049909 + OnBranchSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnSendProgressAction: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 6366722279309049907 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + - rid: 6366722279309049908 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 50 + k__BackingField: + rid: 6366722279309049907 + - rid: 6366722279309049909 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 30 + k__BackingField: 15 + k__BackingField: + rid: 6366722279309049908 +--- !u!114 &344004933 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344004928} + m_Enabled: 0 + m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} m_Name: m_EditorClassIdentifier: k__BackingField: - rid: 6366722279309049896 + rid: 6366722279309049910 k__BackingField: - rid: 6366722279309049897 + rid: 6366722279309049911 k__BackingField: - rid: 6366722279309049898 + rid: 6366722279309049912 k__BackingField: - rid: 6366722279309049899 + rid: 6366722279309049913 OnCommitSelectionChange: m_PersistentCalls: m_Calls: [] @@ -1140,31 +1646,31 @@ MonoBehaviour: references: version: 2 RefIds: - - rid: 6366722279309049896 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + - rid: 6366722279309049910 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} data: selectedIndex: 0 - - rid: 6366722279309049897 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + - rid: 6366722279309049911 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} data: selectedIndex: 0 k__BackingField: 50 k__BackingField: - rid: 6366722279309049896 - - rid: 6366722279309049898 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + rid: 6366722279309049910 + - rid: 6366722279309049912 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} data: selectedIndex: 0 - k__BackingField: 50 + k__BackingField: 30 k__BackingField: 15 k__BackingField: - rid: 6366722279309049897 - - rid: 6366722279309049899 - type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Wrappers} + rid: 6366722279309049911 + - rid: 6366722279309049913 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} data: selectedIndex: 0 k__BackingField: - rid: 6366722279309049898 + rid: 6366722279309049912 --- !u!1 &407638589 GameObject: m_ObjectHideFlags: 0 @@ -1241,6 +1747,89 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 407638589} m_CullTransparentMesh: 1 +--- !u!1 &422634214 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422634215} + - component: {fileID: 422634217} + - component: {fileID: 422634216} + m_Layer: 0 + m_Name: 3Gon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &422634215 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422634214} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0.24999994} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 239243193} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &422634216 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422634214} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 172636256} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &422634217 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422634214} + m_Mesh: {fileID: 16160170} --- !u!1 &448199408 GameObject: m_ObjectHideFlags: 0 @@ -1693,6 +2282,89 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 641375517} m_CullTransparentMesh: 1 +--- !u!1 &680084624 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 680084625} + - component: {fileID: 680084627} + - component: {fileID: 680084626} + m_Layer: 0 + m_Name: MText_Planar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &680084625 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680084624} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.7249998, y: 0, z: 0.33650002} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 239243193} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &680084626 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680084624} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 1455670315} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &680084627 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680084624} + m_Mesh: {fileID: 1376221775} --- !u!1 &712628247 GameObject: m_ObjectHideFlags: 0 @@ -1971,6 +2643,170 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: path: Assets/Resources +--- !u!43 &828542546 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 5Gon - 91f68eb00682673ef3a2b713c74bd780 + serializedVersion: 10 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 9 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 5 + localAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0.9510565, y: 0, z: 0.90450853} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 1 + m_KeepIndices: 1 + m_IndexFormat: 0 + m_IndexBuffer: 000001000200010003000200030004000200 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 5 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 12 + format: 0 + dimension: 3 + - stream: 0 + offset: 24 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 40 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 240 + _typelessdata: 707873bf000000006ea65a3e000000000000803f000000000000803f0000000000000000000080bf00000000000000000000000000000000df8d673f000000000000803f000000000000803f0000000000000000000080bf0000000000000000107916bf00000000df8d67bf000000000000803f000000000000803f0000000000000000000080bf00000000000000007078733f0000000078a65a3e00000000ffff7f3f000000000000803f0000000000000000000080bf00000000000000002079163f00000000dd8d67bf000000000000803f000000000000803f0000000000000000000080bf0000000000000000 + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0.9510565, y: 0, z: 0.90450853} + m_MeshUsageFlags: 0 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: --- !u!1 &869165413 GameObject: m_ObjectHideFlags: 0 @@ -2199,6 +3035,84 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!21 &950424089 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Standard (Instance) + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] --- !u!1 &1031574851 GameObject: m_ObjectHideFlags: 0 @@ -2362,6 +3276,84 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_IsOn: 1 +--- !u!21 &1088138830 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Standard (Instance) + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] --- !u!1 &1123579265 GameObject: m_ObjectHideFlags: 0 @@ -2895,6 +3887,170 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!43 &1376221775 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MText_Planar - fc0be42f5a10575c74e3bcc77a131031 + serializedVersion: 10 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 1542 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 1542 + localAABB: + m_Center: {x: -0.000000059604645, y: 0, z: 0} + m_Extent: {x: 1.2050002, y: 0, z: 0.34550002} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 0 + m_KeepIndices: 0 + m_IndexFormat: 0 + m_IndexBuffer: 00000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700180019001a001b001c001d001e001f0020002100220023002400250026002700280029002a002b002c002d002e002f0030003100320033003400350036003700380039003a003b003c003d003e003f0040004100420043004400450046004700480049004a004b004c004d004e004f0050005100520053005400550056005700580059005a005b005c005d005e005f0060006100620063006400650066006700680069006a006b006c006d006e006f0070007100720073007400750076007700780079007a007b007c007d007e007f0080008100820083008400850086008700880089008a008b008c008d008e008f0090009100920093009400950096009700980099009a009b009c009d009e009f00a000a100a200a300a400a500a600a700a800a900aa00ab00ac00ad00ae00af00b000b100b200b300b400b500b600b700b800b900ba00bb00bc00bd00be00bf00c000c100c200c300c400c500c600c700c800c900ca00cb00cc00cd00ce00cf00d000d100d200d300d400d500d600d700d800d900da00db00dc00dd00de00df00e000e100e200e300e400e500e600e700e800e900ea00eb00ec00ed00ee00ef00f000f100f200f300f400f500f600f700f800f900fa00fb00fc00fd00fe00ff0000010101020103010401050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f0120012101220123012401250126012701280129012a012b012c012d012e012f0130013101320133013401350136013701380139013a013b013c013d013e013f0140014101420143014401450146014701480149014a014b014c014d014e014f0150015101520153015401550156015701580159015a015b015c015d015e015f0160016101620163016401650166016701680169016a016b016c016d016e016f0170017101720173017401750176017701780179017a017b017c017d017e017f0180018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01ac01ad01ae01af01b001b101b201b301b401b501b601b701b801b901ba01bb01bc01bd01be01bf01c001c101c201c301c401c501c601c701c801c901ca01cb01cc01cd01ce01cf01d001d101d201d301d401d501d601d701d801d901da01db01dc01dd01de01df01e001e101e201e301e401e501e601e701e801e901ea01eb01ec01ed01ee01ef01f001f101f201f301f401f501f601f701f801f901fa01fb01fc01fd01fe01ff0100020102020203020402050206020702080209020a020b020c020d020e020f0210021102120213021402150216021702180219021a021b021c021d021e021f0220022102220223022402250226022702280229022a022b022c022d022e022f0230023102320233023402350236023702380239023a023b023c023d023e023f0240024102420243024402450246024702480249024a024b024c024d024e024f0250025102520253025402550256025702580259025a025b025c025d025e025f0260026102620263026402650266026702680269026a026b026c026d026e026f0270027102720273027402750276027702780279027a027b027c027d027e027f0280028102820283028402850286028702880289028a028b028c028d028e028f0290029102920293029402950296029702980299029a029b029c029d029e029f02a002a102a202a302a402a502a602a702a802a902aa02ab02ac02ad02ae02af02b002b102b202b302b402b502b602b702b802b902ba02bb02bc02bd02be02bf02c002c102c202c302c402c502c602c702c802c902ca02cb02cc02cd02ce02cf02d002d102d202d302d402d502d602d702d802d902da02db02dc02dd02de02df02e002e102e202e302e402e502e602e702e802e902ea02eb02ec02ed02ee02ef02f002f102f202f302f402f502f602f702f802f902fa02fb02fc02fd02fe02ff0200030103020303030403050306030703080309030a030b030c030d030e030f0310031103120313031403150316031703180319031a031b031c031d031e031f0320032103220323032403250326032703280329032a032b032c032d032e032f0330033103320333033403350336033703380339033a033b033c033d033e033f0340034103420343034403450346034703480349034a034b034c034d034e034f0350035103520353035403550356035703580359035a035b035c035d035e035f0360036103620363036403650366036703680369036a036b036c036d036e036f0370037103720373037403750376037703780379037a037b037c037d037e037f0380038103820383038403850386038703880389038a038b038c038d038e038f0390039103920393039403950396039703980399039a039b039c039d039e039f03a003a103a203a303a403a503a603a703a803a903aa03ab03ac03ad03ae03af03b003b103b203b303b403b503b603b703b803b903ba03bb03bc03bd03be03bf03c003c103c203c303c403c503c603c703c803c903ca03cb03cc03cd03ce03cf03d003d103d203d303d403d503d603d703d803d903da03db03dc03dd03de03df03e003e103e203e303e403e503e603e703e803e903ea03eb03ec03ed03ee03ef03f003f103f203f303f403f503f603f703f803f903fa03fb03fc03fd03fe03ff0300040104020403040404050406040704080409040a040b040c040d040e040f0410041104120413041404150416041704180419041a041b041c041d041e041f0420042104220423042404250426042704280429042a042b042c042d042e042f0430043104320433043404350436043704380439043a043b043c043d043e043f0440044104420443044404450446044704480449044a044b044c044d044e044f0450045104520453045404550456045704580459045a045b045c045d045e045f0460046104620463046404650466046704680469046a046b046c046d046e046f0470047104720473047404750476047704780479047a047b047c047d047e047f0480048104820483048404850486048704880489048a048b048c048d048e048f0490049104920493049404950496049704980499049a049b049c049d049e049f04a004a104a204a304a404a504a604a704a804a904aa04ab04ac04ad04ae04af04b004b104b204b304b404b504b604b704b804b904ba04bb04bc04bd04be04bf04c004c104c204c304c404c504c604c704c804c904ca04cb04cc04cd04ce04cf04d004d104d204d304d404d504d604d704d804d904da04db04dc04dd04de04df04e004e104e204e304e404e504e604e704e804e904ea04eb04ec04ed04ee04ef04f004f104f204f304f404f504f604f704f804f904fa04fb04fc04fd04fe04ff0400050105020503050405050506050705080509050a050b050c050d050e050f0510051105120513051405150516051705180519051a051b051c051d051e051f0520052105220523052405250526052705280529052a052b052c052d052e052f0530053105320533053405350536053705380539053a053b053c053d053e053f0540054105420543054405450546054705480549054a054b054c054d054e054f0550055105520553055405550556055705580559055a055b055c055d055e055f0560056105620563056405650566056705680569056a056b056c056d056e056f0570057105720573057405750576057705780579057a057b057c057d057e057f0580058105820583058405850586058705880589058a058b058c058d058e058f0590059105920593059405950596059705980599059a059b059c059d059e059f05a005a105a205a305a405a505a605a705a805a905aa05ab05ac05ad05ae05af05b005b105b205b305b405b505b605b705b805b905ba05bb05bc05bd05be05bf05c005c105c205c305c405c505c605c705c805c905ca05cb05cc05cd05ce05cf05d005d105d205d305d405d505d605d705d805d905da05db05dc05dd05de05df05e005e105e205e305e405e505e605e705e805e905ea05eb05ec05ed05ee05ef05f005f105f205f305f405f505f605f705f805f905fa05fb05fc05fd05fe05ff05000601060206030604060506 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 1542 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 12 + format: 0 + dimension: 3 + - stream: 0 + offset: 24 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 40 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 74016 + _typelessdata: 7f328b3f000000009c68f73d00000000ffff7f3f000000000000803f0000000000000000000080bfd15e423f00000000438b8c3f0000000000d5f83d00000000ffff7f3f000000000000803f0000000000000000000080bf2fa13d3f00000000e9b08d3f00000000041bf83d00000000ffff7f3f000000000000803f0000000000000000000080bf8ee3383f000000007f328b3f000000009c68f73d000000000000803f000000000000803f0000000000000000000080bfd15e423f00000000e9b08d3f00000000041bf83d000000000000803f000000000000803f0000000000000000000080bf8ee3383f0000000063d48e3f00000000d4ebf53d000000000000803f000000000000803f0000000000000000000080bfed25343f0000000041d8893f00000000a813f33d000000000000803f000000000000803f0000000000000000000080bf721c473f000000007f328b3f000000009c68f73d000000000000803f000000000000803f0000000000000000000080bfd15e423f0000000063d48e3f00000000d4ebf53d000000000000803f000000000000803f0000000000000000000080bfed25343f0000000041d8893f00000000a813f33d000000000000803f000000000000803f0000000000000000000080bf721c473f0000000063d48e3f00000000d4ebf53d000000000000803f000000000000803f0000000000000000000080bfed25343f0000000047f68f3f00000000a445f23d000000000000803f000000000000803f0000000000000000000080bf4c682f3f000000006b7c883f0000000078beeb3d00000000ffff7f3f000000000000803f0000000000000000000080bf13da4b3f0000000041d8893f00000000a813f33d00000000ffff7f3f000000000000803f0000000000000000000080bf721c473f0000000047f68f3f00000000a445f23d00000000ffff7f3f000000000000803f0000000000000000000080bf4c682f3f000000006b7c883f0000000078beeb3d000000000000803f000000000000803f0000000000000000000080bf13da4b3f0000000047f68f3f00000000a445f23d000000000000803f000000000000803f0000000000000000000080bf4c682f3f000000002517913f000000009c26ed3d000000000000803f000000000000803f0000000000000000000080bfabaa2a3f000000006b7c883f0000000078beeb3d000000000000803f000000000000803f0000000000000000000080bf13da4b3f000000002517913f000000009c26ed3d000000000000803f000000000000803f0000000000000000000080bfabaa2a3f000000008d37923f00000000f08ce63d000000000000803f000000000000803f0000000000000000000080bf09ed253f00000000df1e873f000000006451e13d000000000000803f000000000000803f0000000000000000000080bfb497503f000000006b7c883f0000000078beeb3d000000000000803f000000000000803f0000000000000000000080bf13da4b3f000000008d37923f00000000f08ce63d000000000000803f000000000000803f0000000000000000000080bf09ed253f00000000df1e873f000000006451e13d000000000000803f000000000000803f0000000000000000000080bfb497503f000000008d37923f00000000f08ce63d000000000000803f000000000000803f0000000000000000000080bf09ed253f000000001358933f00000000c876de3d000000000000803f000000000000803f0000000000000000000080bf682f213f000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c000000001283603f000000006866e63d000000000000803f000000000000803f0000000000000000000080bf0000000000000000c64b773f000000006866e63d000000000000803f000000000000803f0000000000000000000080bf0000803f000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000c64b773f000000006866e63d000000000000803f000000000000803f0000000000000000000080bf0000803f00000000c64b773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bf5f427b3f0000000081bf853f00000000c0b4d33d000000000000803f000000000000803f0000000000000000000080bf5555553f00000000df1e873f000000006451e13d000000000000803f000000000000803f0000000000000000000080bfb497503f000000001358933f00000000c876de3d000000000000803f000000000000803f0000000000000000000080bf682f213f0000000081bf853f00000000c0b4d33d000000000000803f000000000000803f0000000000000000000080bf5555553f000000001358933f00000000c876de3d000000000000803f000000000000803f0000000000000000000080bf682f213f000000004779943f0000000058e2d43d000000000000803f000000000000803f0000000000000000000080bfc7711c3f0000000081bf853f00000000c0b4d33d00000000ffff7f3f000000000000803f0000000000000000000080bf5555553f000000004779943f0000000058e2d43d00000000ffff7f3f000000000000803f0000000000000000000080bfc7711c3f00000000bb9b953f00000000c8cdc93d00000000ffff7f3f000000000000803f0000000000000000000080bf26b4173f00000000355e843f00000000e4d0c23d000000000000803f000000000000803f0000000000000000000080bff7125a3f0000000081bf853f00000000c0b4d33d000000000000803f000000000000803f0000000000000000000080bf5555553f00000000bb9b953f00000000c8cdc93d000000000000803f000000000000803f0000000000000000000080bf26b4173f00000000355e843f00000000e4d0c23d000000000000803f000000000000803f0000000000000000000080bff7125a3f00000000bb9b953f00000000c8cdc93d000000000000803f000000000000803f0000000000000000000080bf26b4173f0000000001c0963f000000004c37bd3d000000000000803f000000000000803f0000000000000000000080bf85f6123f00000000ddfa823f00000000248eae3d00000000ffff7f3f000000000000803f0000000000000000000080bf98d05e3f00000000355e843f00000000e4d0c23d00000000ffff7f3f000000000000803f0000000000000000000080bff7125a3f0000000001c0963f000000004c37bd3d00000000ffff7f3f000000000000803f0000000000000000000080bf85f6123f00000000ddfa823f00000000248eae3d000000000000803f000000000000803f0000000000000000000080bf98d05e3f0000000001c0963f000000004c37bd3d000000000000803f000000000000803f0000000000000000000080bf85f6123f00000000abe6973f000000000c1daf3d000000000000803f000000000000803f0000000000000000000080bfe4380e3f00000000ddfa823f00000000248eae3d000000000000803f000000000000803f0000000000000000000080bf98d05e3f00000000abe6973f000000000c1daf3d000000000000803f000000000000803f0000000000000000000080bfe4380e3f000000004b10993f000000003c7d9f3d000000000000803f000000000000803f0000000000000000000080bf427b093f000000005b95813f00000000d4d4963d000000000000803f000000000000803f0000000000000000000080bf398e633f00000000ddfa823f00000000248eae3d000000000000803f000000000000803f0000000000000000000080bf98d05e3f000000004b10993f000000003c7d9f3d000000000000803f000000000000803f0000000000000000000080bf427b093f000000005b95813f00000000d4d4963d000000000000803f000000000000803f0000000000000000000080bf398e633f000000004b10993f000000003c7d9f3d000000000000803f000000000000803f0000000000000000000080bf427b093f00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f000000005b95813f00000000d4d4963d000000000000803f000000000000803f0000000000000000000080bf398e633f00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f0000000071e88b3f00000000f051083d000000000000803f000000000000803f0000000000000000000080bfabaaaa3e0000000071e88b3f00000000f051083d000000000000803f000000000000803f0000000000000000000080bfabaaaa3e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000f1c78c3f00000000e0e3fc3c000000000000803f000000000000803f0000000000000000000080bfed25b43e00000000f1c78c3f00000000e0e3fc3c000000000000803f000000000000803f0000000000000000000080bfed25b43e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f000000008bb08d3f000000005022e43c000000000000803f000000000000803f0000000000000000000080bf2fa1bd3e000000008bb08d3f000000005022e43c000000000000803f000000000000803f0000000000000000000080bf2fa1bd3e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000bd9f8e3f00000000f0a7c63c000000000000803f000000000000803f0000000000000000000080bf721cc73e00000000bd9f8e3f00000000f0a7c63c000000000000803f000000000000803f0000000000000000000080bf721cc73e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f0000000009938f3f00000000a0bda43c000000000000803f000000000000803f0000000000000000000080bfb497d03e0000000009938f3f00000000a0bda43c000000000000803f000000000000803f0000000000000000000080bfb497d03e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000ed87903f0000000060587d3c000000000000803f000000000000803f0000000000000000000080bff712da3e00000000ed87903f0000000060587d3c000000000000803f000000000000803f0000000000000000000080bff712da3e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000e77b913f00000000e078293c000000000000803f000000000000803f0000000000000000000080bf398ee33e00000000e77b913f00000000e078293c000000000000803f000000000000803f0000000000000000000080bf398ee33e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000776c923f00000000c0dc9c3b000000000000803f000000000000803f0000000000000000000080bf7b09ed3e00000000776c923f00000000c0dc9c3b00000000ffff7f3f000000000000803f0000000000000000000080bf7b09ed3e00000000713d9a3f0000000004568e3d00000000ffff7f3f000000000000803f0000000000000000000080bfa1bd043f000000001d57933f0000000000ac99ba00000000ffff7f3f000000000000803f0000000000000000000080bfbe84f63e000000001d57933f0000000000ac99ba000000000000803f000000000000803f0000000000000000000080bfbe84f63e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f000000005739943f0000000080c2f5bb000000000000803f000000000000803f0000000000000000000080bf0000003f00000000ce867d3f00000000c03f393d000000000000803f000000000000803f0000000000000000000080bf7b096d3f00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f00000000c54e8a3f00000000e0fd133d000000000000803f000000000000803f0000000000000000000080bf26b4973e00000000c54e8a3f00000000e0fd133d000000000000803f000000000000803f0000000000000000000080bf26b4973e00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f000000008d148b3f00000000b88c0f3d000000000000803f000000000000803f0000000000000000000080bf682fa13e000000008d148b3f00000000b88c0f3d000000000000803f000000000000803f0000000000000000000080bf682fa13e00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f0000000071e88b3f00000000f051083d000000000000803f000000000000803f0000000000000000000080bfabaaaa3e0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f00000000ce867d3f00000000c03f393d000000000000803f000000000000803f0000000000000000000080bf7b096d3f000000006daf873f00000000c067103d000000000000803f000000000000803f0000000000000000000080bfa1bd843e000000006daf873f00000000c067103d00000000ffff7f3f000000000000803f0000000000000000000080bfa1bd843e00000000ce867d3f00000000c03f393d00000000ffff7f3f000000000000803f0000000000000000000080bf7b096d3f000000009999893f000000000881153d00000000ffff7f3f000000000000803f0000000000000000000080bfe4388e3e000000009999893f000000000881153d000000000000803f000000000000803f0000000000000000000080bfe4388e3e00000000ce867d3f00000000c03f393d000000000000803f000000000000803f0000000000000000000080bf7b096d3f00000000c54e8a3f00000000e0fd133d000000000000803f000000000000803f0000000000000000000080bf26b4973e0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f000000006daf873f00000000c067103d000000000000803f000000000000803f0000000000000000000080bfa1bd843e00000000fbda853f000000003889013d000000000000803f000000000000803f0000000000000000000080bfbe84763e0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f00000000fbda853f000000003889013d000000000000803f000000000000803f0000000000000000000080bfbe84763e000000004120843f000000007012d33c000000000000803f000000000000803f0000000000000000000080bf398e633e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f000000004120843f000000007012d33c000000000000803f000000000000803f0000000000000000000080bf398e633e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000004120843f000000007012d33c000000000000803f000000000000803f0000000000000000000080bf398e633e000000003983823f000000003017923c000000000000803f000000000000803f0000000000000000000080bfb497503e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000003983823f000000003017923c000000000000803f000000000000803f0000000000000000000080bfb497503e00000000df07813f00000000e0d0023c000000000000803f000000000000803f0000000000000000000080bf2fa13d3e000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000c64b773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bf5f427b3f00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f00000000be75793f00000000385e42bd000000000000803f000000000000803f0000000000000000000080bf398ee33d00000000be75793f00000000385e42bd000000000000803f000000000000803f0000000000000000000080bf398ee33d00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f00000000620f7b3f00000000280601bd000000000000803f000000000000803f0000000000000000000080bfa1bd043e00000000620f7b3f00000000280601bd000000000000803f000000000000803f0000000000000000000080bfa1bd043e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000003e0c7d3f0000000000f189bc000000000000803f000000000000803f0000000000000000000080bf26b4173e000000003e0c7d3f0000000000f189bc000000000000803f000000000000803f0000000000000000000080bf26b4173e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000005a647f3f0000000080916dbb000000000000803f000000000000803f0000000000000000000080bfabaa2a3e000000005a647f3f0000000080916dbb000000000000803f000000000000803f0000000000000000000080bfabaa2a3e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f00000000df07813f00000000e0d0023c000000000000803f000000000000803f0000000000000000000080bf2fa13d3e000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000be75793f00000000385e42bd000000000000803f000000000000803f0000000000000000000080bf398ee33d000000004a47783f000000006c2e84bd000000000000803f000000000000803f0000000000000000000080bf2fa1bd3d000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c000000004a47783f000000006c2e84bd000000000000803f000000000000803f0000000000000000000080bf2fa1bd3d00000000fa8b773f000000001c2fa9bd000000000000803f000000000000803f0000000000000000000080bf26b4973d000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000fa8b773f000000001c2fa9bd000000000000803f000000000000803f0000000000000000000080bf26b4973d00000000c64b773f000000003cdfcfbd000000000000803f000000000000803f0000000000000000000080bf398e633d000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000c64b773f000000003cdfcfbd000000000000803f000000000000803f0000000000000000000080bf398e633d00000000c64b773f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4173d00000000a6900c3f0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e00000000d6a3103f0000000000d5f83d00000000ffff7f3f000000000000803f0000000000000000000080bf7b015b3e00000000d25a163f0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e00000000b2a8083f00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000a6900c3f0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e00000000d25a163f0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e00000000b2a8083f00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000d25a163f0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e00000000ded11b3f00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e0000000086eb043f00000000bc1ef13d00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3e00000000b2a8083f00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000ded11b3f00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e00000000ac58013f00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e0000000086eb043f00000000bc1ef13d000000000000803f000000000000803f0000000000000000000080bf54c36c3e00000000ded11b3f00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e00000000ac58013f00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000ded11b3f00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e00000000eafc203f0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000064dffb3e00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000ac58013f00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000eafc203f0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000064dffb3e00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000eafc203f0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e00000000e6cf253f00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e000000004460f53e0000000024dbd93d00000000ffff7f3f000000000000803f0000000000000000000080bf2e857e3e0000000064dffb3e00000000bc59e33d00000000ffff7f3f000000000000803f0000000000000000000080bfe599783e00000000e6cf253f00000000bcabd83d00000000ffff7f3f000000000000803f0000000000000000000080bf5954433e000000001033ef3e00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e000000004460f53e0000000024dbd93d000000000000803f000000000000803f0000000000000000000080bf2e857e3e00000000e6cf253f00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e000000001033ef3e00000000b89cce3d00000000ffff7f3f000000000000803f0000000000000000000080bf3b38823e00000000e6cf253f00000000bcabd83d00000000ffff7f3f000000000000803f0000000000000000000080bf5954433e00000000c23e2a3f00000000ac48c63d00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3e00000000dc56e93e00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e000000001033ef3e00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000c23e2a3f00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000dc56e93e00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000c23e2a3f00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e000000006e3d2e3f00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000c4cae33e0000000018d9b23d00000000ffff7f3f000000000000803f0000000000000000000080bf8423883e00000000dc56e93e00000000a49cc13d00000000ffff7f3f000000000000803f0000000000000000000080bfdf2d853e000000006e3d2e3f00000000b49daf3d00000000ffff7f3f000000000000803f0000000000000000000080bfc87d373e00000000dc8dde3e000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e00000000c4cae33e0000000018d9b23d000000000000803f000000000000803f0000000000000000000080bf8423883e000000006e3d2e3f00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000dc8dde3e000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e000000006e3d2e3f00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000dcbf313f00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e000000003c9fd93e000000004c00903d00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3e00000000dc8dde3e000000004050a23d00000000ffff7f3f000000000000803f0000000000000000000080bf28198b3e00000000dcbf313f00000000a098943d00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313e000000003c9fd93e000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000dcbf313f00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000003c9fd93e000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000f0fdd43e00000000088115bd000000000000803f000000000000803f0000000000000000000080bf15fa933e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000007891da3e00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e000000007891da3e00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000009847e03e0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e000000009847e03e0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000a81ce63e00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e00000000a81ce63e00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000080dec3e00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000080dec3e00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000001415f23e00000000e074553c000000000000803f000000000000803f0000000000000000000080bf4ac6a23e000000001415f23e00000000e074553c00000000ffff7f3f000000000000803f0000000000000000000080bf4ac6a23e00000000f0fdd43e00000000d8ce773d00000000ffff7f3f000000000000803f0000000000000000000080bf7004913e000000002431f83e00000000a0c4a03c00000000ffff7f3f000000000000803f0000000000000000000080bfeebba53e000000002431f83e00000000a0c4a03c000000000000803f000000000000803f0000000000000000000080bfeebba53e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000985dfe3e00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e00000000985dfe3e00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000644b023f00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000644b023f00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000008a6c053f00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e000000008a6c053f00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000006a90083f0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e000000006a90083f0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e000000006a90083f0000000098a7113d00000000ffff7f3f000000000000803f0000000000000000000080bf7f92b13e00000000fcb9343f00000000704e6a3d00000000ffff7f3f000000000000803f0000000000000000000080bf37a72b3e0000000034b50b3f0000000028a0173d00000000ffff7f3f000000000000803f0000000000000000000080bf2488b43e0000000034b50b3f0000000028a0173d000000000000803f000000000000803f0000000000000000000080bf2488b43e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e0000000016d90e3f000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e0000000016d90e3f000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000be1f373f00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000016d90e3f000000009899193d00000000ffff7f3f000000000000803f0000000000000000000080bfc87db73e00000000be1f373f00000000986e223d00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253e00000000f428123f00000000189d173d00000000ffff7f3f000000000000803f0000000000000000000080bf6c73ba3e00000000f428123f00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e00000000be1f373f00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000182f153f00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e00000000f428123f00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000082eb173f00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e00000000182f153f00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000325e1a3f00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e0000000082eb173f00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000028871c3f000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e00000000325e1a3f00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000064661e3f00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e0000000028871c3f000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000064661e3f00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000eafd393f00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000e6fb1f3f000000004032453c000000000000803f000000000000803f0000000000000000000080bf4635cc3e0000000064661e3f00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e00000000eafd393f00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000ac47213f0000000080a67d3b00000000ffff7f3f000000000000803f0000000000000000000080bfea2acf3e00000000e6fb1f3f000000004032453c00000000ffff7f3f000000000000803f0000000000000000000080bf4635cc3e00000000eafd393f00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000b849223f00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e00000000ac47213f0000000080a67d3b00000000ffff7f3f000000000000803f0000000000000000000080bfea2acf3e00000000eafd393f00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000b849223f00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e00000000eafd393f00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000365e3a3f000000009016d9bc00000000ffff7f3f000000000000803f0000000000000000000080bf15fa133e000000000a02233f0000000090bd84bc000000000000803f000000000000803f0000000000000000000080bf3216d53e00000000b849223f00000000403fb5bb000000000000803f000000000000803f0000000000000000000080bf8e20d23e00000000365e3a3f000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000a270233f0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e000000000a02233f0000000090bd84bc000000000000803f000000000000803f0000000000000000000080bf3216d53e00000000365e3a3f000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000a270233f0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000365e3a3f000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008095233f00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e00000000a270233f0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008095233f00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e000000008095233f00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000285c0f3f00000000ee7cbfbd00000000ffff7f3f000000000000803f0000000000000000000080bfc3ece03e000000008095233f00000000dc2486bd00000000ffff7f3f000000000000803f0000000000000000000080bf1ff7dd3e000000008095233f00000000fa7eeabd00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f000000008095233f00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000a2b70a3f000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e00000000285c0f3f00000000ee7cbfbd000000000000803f000000000000803f0000000000000000000080bfc3ece03e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000040f063f000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e00000000a2b70a3f000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000c876013f0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e00000000040f063f000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000d406fa3e00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000c876013f0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000d406fa3e00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f0000000018c81e3f0000000008d7f7bd000000000000803f000000000000803f0000000000000000000080bf2e857e3f000000008095233f000000005b647bbe000000000000803f000000000000803f0000000000000000000080bf73ba4a3f000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000d406fa3e00000000b00bfabd00000000ffff7f3f000000000000803f0000000000000000000080bf54c3ec3e0000000018c81e3f0000000008d7f7bd00000000ffff7f3f000000000000803f0000000000000000000080bf2e857e3f00000000bc221a3f0000000020b002be00000000ffff7f3f000000000000803f0000000000000000000080bf5c0a7d3f00000000c892f13e000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000d406fa3e00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000bc221a3f0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000c892f13e000000006c1306be00000000ffff7f3f000000000000803f0000000000000000000080bff9b8ef3e00000000bc221a3f0000000020b002be00000000ffff7f3f000000000000803f0000000000000000000080bf5c0a7d3f000000002cb2153f00000000e3a509be00000000ffff7f3f000000000000803f0000000000000000000080bf8a8f7b3f0000000060bae93e000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e00000000c892f13e000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e000000002cb2153f00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f0000000060bae93e000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e000000002cb2153f00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f000000002483113f0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000094a6e23e00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e0000000060bae93e000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e000000002483113f0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000094a6e23e00000000b9c71bbe00000000ffff7f3f000000000000803f0000000000000000000080bf41a4f53e000000002483113f0000000060e510be00000000ffff7f3f000000000000803f0000000000000000000080bfb7147a3f0000000064a20d3f000000002b8718be00000000ffff7f3f000000000000803f0000000000000000000080bfe599783f0000000094a6e23e00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e0000000064a20d3f000000002b8718be000000000000803f000000000000803f0000000000000000000080bfe599783f00000000aa1c0a3f00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000005880dc3e000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e0000000094a6e23e00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e00000000aa1c0a3f00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000005880dc3e000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e00000000aa1c0a3f00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f00000000b4fe063f00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000005880dc3e000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e00000000b4fe063f00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e00000000b4fe063f00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000004055043f0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000004055043f0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f000000000c2d023f00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000000c2d023f00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e000000000c2d023f00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000d892003f00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000d892003f00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f00000000c026ff3e0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000a838d13e0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000c026ff3e0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000a838d13e0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f00000000c026ff3e0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000c876fe3e000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f000000004c62d03e00000000ea2671be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023f00000000a838d13e0000000090a75bbe00000000ffff7f3f000000000000803f0000000000000000000080bf69bd003f00000000c876fe3e000000009cc460be00000000ffff7f3f000000000000803f0000000000000000000080bf263e6e3f000000004c62d03e00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f00000000c876fe3e000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f0000000030bffe3e0000000017ff69be000000000000803f000000000000803f0000000000000000000080bf54c36c3f000000004c62d03e00000000ea2671be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023f0000000030bffe3e0000000017ff69be00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3f000000005893ff3e00000000c5b372be00000000ffff7f3f000000000000803f0000000000000000000080bf82486b3f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f000000004c62d03e00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f000000005893ff3e00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f000000005893ff3e00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f00000000be75003f00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000be75003f00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f00000000f05f013f000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f000000008e09223f00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f000000008095233f000000005b647bbe000000000000803f000000000000803f0000000000000000000080bf73ba4a3f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000f05f013f000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f000000002678203f000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f000000008e09223f00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000f05f013f000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f000000006284023f000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f0000000048e11e3f00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f000000002678203f000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000d27b493f00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b0000000082c04a3f00000000f85383be000000000000803f000000000000803f0000000000000000000080bf000000000000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000048e11e3f00000000bf9f85be00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3f00000000365e3a3f000000000bd783be00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e0e3e0000000062663a3f0000000071e685be00000000ffff7f3f000000000000803f0000000000000000000080bf8423083e000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f000000006284023f000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f0000000038df033f00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000323e483f00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c00000000d27b493f00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f0000000048e11e3f00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f0000000062663a3f0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f0000000062663a3f0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e00000000b27e3a3f000000000abc87be000000000000803f000000000000803f0000000000000000000080bf3b38023e000000003609473f00000000ee7c88be000000000000803f000000000000803f0000000000000000000080bfcc0e8e3c00000000323e483f00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f0000000038df033f00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f0000000038df033f00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000926c053f0000000022438abe000000000000803f000000000000803f0000000000000000000080bf68e2633f00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000b27e3a3f000000000abc87be000000000000803f000000000000803f0000000000000000000080bf3b38023e00000000eea63a3f000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d000000002aa31b3f00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000eea63a3f000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d000000007ade453f0000000058ed89be000000000000803f000000000000803f0000000000000000000080bf1069bd3c000000003609473f00000000ee7c88be000000000000803f000000000000803f0000000000000000000080bfcc0e8e3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000002aa31b3f00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000eea63a3f000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d00000000dede3a3f00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d00000000eafb193f0000000082958bbe00000000ffff7f3f000000000000803f0000000000000000000080bf609b533f000000002aa31b3f00000000b1d489be00000000ffff7f3f000000000000803f0000000000000000000080bf8e20523f00000000dede3a3f00000000f1c28abe00000000ffff7f3f000000000000803f0000000000000000000080bf54c3ec3d0000000092bf443f0000000086378bbe000000000000803f000000000000803f0000000000000000000080bf54c3ec3c000000007ade453f0000000058ed89be000000000000803f000000000000803f0000000000000000000080bf1069bd3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f00000000926c053f0000000022438abe000000000000803f000000000000803f0000000000000000000080bf68e2633f000000009228073f00000000b47c8cbe000000000000803f000000000000803f0000000000000000000080bf9567623f00000000eafb193f0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f00000000dede3a3f00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d0000000046263b3f00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d0000000016ae433f000000001d5a8cbe000000000000803f000000000000803f0000000000000000000080bfcc0e0e3d0000000092bf443f0000000086378bbe000000000000803f000000000000803f0000000000000000000080bf54c3ec3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000eafb193f0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f0000000046263b3f00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f0000000046263b3f00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000ee7c3b3f00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d000000009eab423f00000000be538dbe000000000000803f000000000000803f0000000000000000000080bfeebb253d0000000016ae433f000000001d5a8cbe000000000000803f000000000000803f0000000000000000000080bfcc0e0e3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000986ed43e000000006de78dbe00000000ffff7f3f000000000000803f0000000000000000000080bfb2a8063f000000009228073f00000000b47c8cbe00000000ffff7f3f000000000000803f0000000000000000000080bf9567623f000000005a0f093f0000000096438ebe00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603f00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000ee7c3b3f00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d000000009ae23b3f00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d00000000089d163f0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f000000009ae23b3f00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d00000000c2b9413f000000000c238ebe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3d000000009eab423f00000000be538dbe00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253d0000000082c04a3f00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000089d163f0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f000000009ae23b3f00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d0000000012573c3f00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000005a0f093f0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f000000001ada403f00000000a8c68ebe000000000000803f000000000000803f0000000000000000000080bf3216553d00000000c2b9413f000000000c238ebe000000000000803f000000000000803f0000000000000000000080bf10693d3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000005a0f093f0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f000000000c1d0b3f00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f0000000066e5143f0000000005568fbe00000000ffff7f3f000000000000803f0000000000000000000080bfd70b583f00000000089d163f0000000072588ebe00000000ffff7f3f000000000000803f0000000000000000000080bf0491563f0000000012573c3f00000000487f8ebe00000000ffff7f3f000000000000803f0000000000000000000080bf1069bd3d0000000066e5143f0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000012573c3f00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d000000001ada3c3f0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d000000003e0e403f00000000373d8fbe000000000000803f000000000000803f0000000000000000000080bf54c36c3d000000001ada403f00000000a8c68ebe000000000000803f000000000000803f0000000000000000000080bf3216553d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000066e5143f0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f000000001ada3c3f0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d000000007a6b3d3f0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000c6573f3f000000005a858fbe000000000000803f000000000000803f0000000000000000000080bf3b38823d000000003e0e403f00000000373d8fbe000000000000803f000000000000803f0000000000000000000080bf54c36c3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000066e5143f0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f000000007a6b3d3f0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f000000007a6b3d3f0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000f60a3e3f00000000ef8c8fbe000000000000803f000000000000803f0000000000000000000080bf5de5993d0000000052b83e3f00000000b39d8fbe00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3d00000000c6573f3f000000005a858fbe00000000ffff7f3f000000000000803f0000000000000000000080bf3b38823d0000000082c04a3f00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f00000000f60a3e3f00000000ef8c8fbe000000000000803f000000000000803f0000000000000000000080bf5de5993d0000000052b83e3f00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000000c1d0b3f00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f00000000c84d0d3f00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000052b83e3f00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000c065113f00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000c84d0d3f00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000c065113f00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000704ddb3e000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000704ddb3e000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f0000000054d2203f0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f00000000f8e8233f00000000cb3f9dbe000000000000803f000000000000803f0000000000000000000080bfc036273f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000038dfdf3e000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f00000000704ddb3e000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f0000000054d2203f0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f0000000038dfdf3e000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f0000000054d2203f0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f00000000b24b1e3f000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f000000009ea2243f000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f00000000f8e8233f00000000cb3f9dbe000000000000803f000000000000803f0000000000000000000080bfc036273f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000009ea2243f000000000ac7a0be00000000ffff7f3f000000000000803f0000000000000000000080bf92b1283f0000000082c04a3f00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f000000003640483f000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f0000000038dfdf3e000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f00000000b24b1e3f000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f00000000b24b1e3f000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f0000000082c01b3f0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f000000000a82253f000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f000000009ea2243f000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f000000003640483f000000008c3ba2be000000000000803f000000000000803f0000000000000000000080bfcfc4473f000000000a82253f000000009eefa3be00000000ffff7f3f000000000000803f0000000000000000000080bf652c2a3f000000003640483f000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f000000007af9453f000000007a1aa5be00000000ffff7f3f000000000000803f0000000000000000000080bffd49463f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f0000000082c01b3f0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f000000003a31193f000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000006088263f000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f000000000a82253f000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f000000007af9453f000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f000000007415eb3e00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f000000003a31193f000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000006088263f000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f000000007af9453f000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f000000005ae4433f00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f000000007415eb3e00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000003a31193f000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000004e9e163f0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000c2b6273f00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f000000006088263f000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f000000005ae4433f00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f00000000c2b6273f00000000132ca9be00000000ffff7f3f000000000000803f0000000000000000000080bf09222d3f000000005ae4433f00000000a79ba7be00000000ffff7f3f000000000000803f0000000000000000000080bf2bcf443f00000000def8413f0000000014c4a9be00000000ffff7f3f000000000000803f0000000000000000000080bf5954433f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000007415eb3e00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000004e9e163f0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000004e9e163f0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f000000003208143f000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f00000000540e293f000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f00000000c2b6273f00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f00000000def8413f0000000014c4a9be000000000000803f000000000000803f0000000000000000000080bf5954433f00000000540e293f000000009643abbe00000000ffff7f3f000000000000803f0000000000000000000080bfdb9c2e3f00000000def8413f0000000014c4a9be00000000ffff7f3f000000000000803f0000000000000000000080bf5954433f00000000122f403f00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000003208143f000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f000000005a6f113f00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000003a902a3f00000000b803adbe00000000ffff7f3f000000000000803f0000000000000000000080bfad17303f00000000540e293f000000009643abbe00000000ffff7f3f000000000000803f0000000000000000000080bfdb9c2e3f00000000122f403f00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f000000003a902a3f00000000b803adbe00000000ffff7f3f000000000000803f0000000000000000000080bfad17303f00000000122f403f00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f00000000fa7e3e3f00000000b91eadbe00000000ffff7f3f000000000000803f0000000000000000000080bfb55e403f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000005a6f113f00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000005a6f113f00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000003cd40e3f000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f00000000963d2c3f000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f000000003a902a3f00000000b803adbe000000000000803f000000000000803f0000000000000000000080bfad17303f00000000fa7e3e3f00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000963d2c3f000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f00000000fa7e3e3f00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000a2e03c3f00000000f35aaebe000000000000803f000000000000803f0000000000000000000080bfe2e33e3f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000003cd40e3f000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f000000004c370c3f00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000963d2c3f000000004b6eaebe00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313f00000000a2e03c3f00000000f35aaebe00000000ffff7f3f000000000000803f0000000000000000000080bfe2e33e3f00000000124c3b3f000000007452afbe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3f000000008c172e3f000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000963d2c3f000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f00000000124c3b3f000000007452afbe000000000000803f000000000000803f0000000000000000000080bf10693d3f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000004c370c3f00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f000000008c172e3f000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000124c3b3f000000007452afbe000000000000803f000000000000803f0000000000000000000080bf10693d3f0000000056b9393f000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f000000004c370c3f00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000fe98093f00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f00000000401f303f00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f000000008c172e3f000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f0000000056b9393f000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f00000000401f303f00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f0000000056b9393f000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f000000007620383f000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f00000000fe98093f00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f00000000c8f9063f0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f00000000d455323f00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f00000000401f303f00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f000000007620383f000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f000000001c5a043f0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bf15fa133f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f00000000c8f9063f0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f00000000d455323f00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f000000007620383f000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f000000007a79363f00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f000000006abc343f0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bfc87d373f00000000d455323f00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f000000007a79363f00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f00000000a8371e3e0000000010c6f73d000000000000803f000000000000803f0000000000000000000080bf9224493f0000000008022b3e0000000000d5f83d000000000000803f000000000000803f0000000000000000000080bf4992443f000000000060403e000000006059f63d000000000000803f000000000000803f0000000000000000000080bf0000403f00000000d87b113e00000000bca1f43d000000000000803f000000000000803f0000000000000000000080bfdbb64d3f00000000a8371e3e0000000010c6f73d000000000000803f000000000000803f0000000000000000000080bf9224493f000000000060403e000000006059f63d000000000000803f000000000000803f0000000000000000000080bf0000403f00000000d87b113e00000000bca1f43d000000000000803f000000000000803f0000000000000000000080bfdbb64d3f000000000060403e000000006059f63d000000000000803f000000000000803f0000000000000000000080bf0000403f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f0000000028dd043e00000000c074ef3d000000000000803f000000000000803f0000000000000000000080bf2549523f00000000d87b113e00000000bca1f43d000000000000803f000000000000803f0000000000000000000080bfdbb64d3f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f0000000050d4f03d00000000dc4be83d000000000000803f000000000000803f0000000000000000000080bf6edb563f0000000028dd043e00000000c074ef3d000000000000803f000000000000803f0000000000000000000080bf2549523f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f0000000050d4f03d00000000dc4be83d000000000000803f000000000000803f0000000000000000000080bf6edb563f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f000000003835683e000000000456e23d000000000000803f000000000000803f0000000000000000000080bf6edb363f00000000d062d83d00000000d033df3d000000000000803f000000000000803f0000000000000000000080bfb76d5b3f0000000050d4f03d00000000dc4be83d000000000000803f000000000000803f0000000000000000000080bf6edb563f000000003835683e000000000456e23d000000000000803f000000000000803f0000000000000000000080bf6edb363f0000000080916dbd00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf2549123d0000000080916dbd000000006866e63d000000000000803f000000000000803f0000000000000000000080bf2549923c0000000080f3fd3c000000006866e63d000000000000803f000000000000803f0000000000000000000080bf000000000000000080916dbd00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf2549123d0000000080f3fd3c000000006866e63d00000000ffff7f3f000000000000803f0000000000000000000080bf000000000000000080f3fd3c00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000d062d83d00000000d033df3d000000000000803f000000000000803f0000000000000000000080bfb76d5b3f000000003835683e000000000456e23d000000000000803f000000000000803f0000000000000000000080bf6edb363f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f000000000083c03d000000005839d43d000000000000803f000000000000803f0000000000000000000080bf0000603f00000000d062d83d00000000d033df3d000000000000803f000000000000803f0000000000000000000080bfb76d5b3f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f00000000f051a93d000000003469c73d000000000000803f000000000000803f0000000000000000000080bf4992643f000000000083c03d000000005839d43d000000000000803f000000000000803f0000000000000000000080bf0000603f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f00000000f051a93d000000003469c73d000000000000803f000000000000803f0000000000000000000080bf4992643f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f00000000547b853e00000000a4edb93d000000000000803f000000000000803f0000000000000000000080bfdbb62d3f00000000c0ec923d0000000024d0b83d000000000000803f000000000000803f0000000000000000000080bf9224693f00000000f051a93d000000003469c73d000000000000803f000000000000803f0000000000000000000080bf4992643f00000000547b853e00000000a4edb93d000000000000803f000000000000803f0000000000000000000080bfdbb62d3f00000000c0ec923d0000000024d0b83d000000000000803f000000000000803f0000000000000000000080bf9224693f00000000547b853e00000000a4edb93d000000000000803f000000000000803f0000000000000000000080bfdbb62d3f00000000f0fd8c3e00000000b4f39d3d000000000000803f000000000000803f0000000000000000000080bf9224293f0000000020e17a3d00000000e07aa83d00000000ffff7f3f000000000000803f0000000000000000000080bfdbb66d3f00000000c0ec923d0000000024d0b83d00000000ffff7f3f000000000000803f0000000000000000000080bf9224693f00000000f0fd8c3e00000000b4f39d3d00000000ffff7f3f000000000000803f0000000000000000000080bf9224293f0000000000f5513d000000002c76963d000000000000803f000000000000803f0000000000000000000080bf2549723f0000000020e17a3d00000000e07aa83d000000000000803f000000000000803f0000000000000000000080bfdbb66d3f00000000f0fd8c3e00000000b4f39d3d000000000000803f000000000000803f0000000000000000000080bf9224293f0000000000f5513d000000002c76963d000000000000803f000000000000803f0000000000000000000080bf2549723f00000000f0fd8c3e00000000b4f39d3d000000000000803f000000000000803f0000000000000000000080bf9224293f000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000804f2b3d00000000c4ce823d000000000000803f000000000000803f0000000000000000000080bf6edb763f0000000000f5513d000000002c76963d000000000000803f000000000000803f0000000000000000000080bf2549723f000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000804f2b3d00000000c4ce823d000000000000803f000000000000803f0000000000000000000080bf6edb763f000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f000000007498933e000000009074793d00000000ffff7f3f000000000000803f0000000000000000000080bf4992243f00000000986e123e0000000018d94e3d00000000ffff7f3f000000000000803f0000000000000000000080bf2549923e00000000986e123e0000000018d94e3d000000000000803f000000000000803f0000000000000000000080bf2549923e000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f0000000080916dbd00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf2549123d0000000080f3fd3c00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f0000000080916dbd00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf2549123d00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f0000000080f3fd3c0000000060916dbc000000000000803f000000000000803f0000000000000000000080bf2549923d0000000080f3fd3c0000000060916dbc00000000ffff7f3f000000000000803f0000000000000000000080bf2549923d00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f000000000017293d0000000080665bbb00000000ffff7f3f000000000000803f0000000000000000000080bf6edbb63d000000000017293d0000000080665bbb000000000000803f000000000000803f0000000000000000000080bf6edbb63d00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000e098513d000000004064d93b000000000000803f000000000000803f0000000000000000000080bfb76ddb3d00000000e098513d000000004064d93b000000000000803f000000000000803f0000000000000000000080bfb76ddb3d00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f0000000080c4783d0000000040b27d3c000000000000803f000000000000803f0000000000000000000080bf0000003e0000000080c4783d0000000040b27d3c000000000000803f000000000000803f0000000000000000000080bf0000003e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000806f8f3d000000006063be3c000000000000803f000000000000803f0000000000000000000080bf2549123e00000000806f8f3d000000006063be3c000000000000803f000000000000803f0000000000000000000080bf2549123e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000d016a23d000000000048f53c000000000000803f000000000000803f0000000000000000000080bf4992243e00000000d016a23d000000000048f53c000000000000803f000000000000803f0000000000000000000080bf4992243e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000d07ab43d0000000088eb113d000000000000803f000000000000803f0000000000000000000080bf6edb363e00000000d07ab43d0000000088eb113d000000000000803f000000000000803f0000000000000000000080bf6edb363e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f0000000000bec63d000000005830253d000000000000803f000000000000803f0000000000000000000080bf9224493e0000000000bec63d000000005830253d000000000000803f000000000000803f0000000000000000000080bf9224493e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f000000000003d93d00000000789a343d000000000000803f000000000000803f0000000000000000000080bfb76d5b3e000000000003d93d00000000789a343d000000000000803f000000000000803f0000000000000000000080bfb76d5b3e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000706ceb3d00000000f851403d000000000000803f000000000000803f0000000000000000000080bfdbb66d3e00000000706ceb3d00000000f851403d000000000000803f000000000000803f0000000000000000000080bfdbb66d3e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000e01cfe3d00000000e07e483d000000000000803f000000000000803f0000000000000000000080bf0000803e00000000e01cfe3d00000000e07e483d00000000ffff7f3f000000000000803f0000000000000000000080bf0000803e00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f00000000709b083e0000000040494d3d00000000ffff7f3f000000000000803f0000000000000000000080bf9224893e00000000709b083e0000000040494d3d000000000000803f000000000000803f0000000000000000000080bf9224893e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000986e123e0000000018d94e3d000000000000803f000000000000803f0000000000000000000080bf2549923e0000000030d21f3e00000000e0394b3d000000000000803f000000000000803f0000000000000000000080bfb76d9b3e00000000986e123e0000000018d94e3d000000000000803f000000000000803f0000000000000000000080bf2549923e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f00000000984e2c3e00000000c88c403d000000000000803f000000000000803f0000000000000000000080bf4992a43e0000000030d21f3e00000000e0394b3d000000000000803f000000000000803f0000000000000000000080bfb76d9b3e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f0000000010d7373e00000000a01a2f3d000000000000803f000000000000803f0000000000000000000080bfdbb6ad3e00000000984e2c3e00000000c88c403d000000000000803f000000000000803f0000000000000000000080bf4992a43e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f00000000d85e423e00000000382c173d000000000000803f000000000000803f0000000000000000000080bf6edbb63e0000000010d7373e00000000a01a2f3d000000000000803f000000000000803f0000000000000000000080bfdbb6ad3e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f00000000d85e423e00000000382c173d000000000000803f000000000000803f0000000000000000000080bf6edbb63e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f0000000030d94b3e00000000c014f23c000000000000803f000000000000803f0000000000000000000080bf0000c03e00000000d85e423e00000000382c173d000000000000803f000000000000803f0000000000000000000080bf6edbb63e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f000000006039543e00000000e0fba93c000000000000803f000000000000803f0000000000000000000080bf9224c93e0000000030d94b3e00000000c014f23c000000000000803f000000000000803f0000000000000000000080bf0000c03e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f00000000a8725b3e00000000e03e2d3c000000000000803f000000000000803f0000000000000000000080bf2549d23e000000006039543e00000000e0fba93c000000000000803f000000000000803f0000000000000000000080bf9224c93e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f00000000a8725b3e00000000e03e2d3c000000000000803f000000000000803f0000000000000000000080bf2549d23e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f000000003c0fa13e0000000000cb5dbb000000000000803f000000000000803f0000000000000000000080bf6edb163f000000004878613e0000000000e06dba00000000ffff7f3f000000000000803f0000000000000000000080bfb76ddb3e00000000a8725b3e00000000e03e2d3c00000000ffff7f3f000000000000803f0000000000000000000080bf2549d23e000000003c0fa13e0000000000cb5dbb00000000ffff7f3f000000000000803f0000000000000000000080bf6edb163f00000000803d663e00000000803b5fbc000000000000803f000000000000803f0000000000000000000080bf4992e43e000000004878613e0000000000e06dba000000000000803f000000000000803f0000000000000000000080bfb76ddb3e000000003c0fa13e0000000000cb5dbb000000000000803f000000000000803f0000000000000000000080bf6edb163f00000000803d663e00000000803b5fbc000000000000803f000000000000803f0000000000000000000080bf4992e43e000000003c0fa13e0000000000cb5dbb000000000000803f000000000000803f0000000000000000000080bf6edb163f000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f0000000090b5693e00000000205be1bc000000000000803f000000000000803f0000000000000000000080bfdbb6ed3e00000000803d663e00000000803b5fbc000000000000803f000000000000803f0000000000000000000080bf4992e43e000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f0000000080916dbd00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf2549123d0000000080f3fd3c0000000060916dbc000000000000803f000000000000803f0000000000000000000080bf2549923d0000000080f3fd3c00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bfb76d5b3d00000000c0d36b3e00000000c80a2ebd000000000000803f000000000000803f0000000000000000000080bf6edbf63e0000000090b5693e00000000205be1bc000000000000803f000000000000803f0000000000000000000080bfdbb6ed3e000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f00000000c0d36b3e00000000c80a2ebd000000000000803f000000000000803f0000000000000000000080bf6edbf63e000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f0000000008d7a33e0000000048b673bd000000000000803f000000000000803f0000000000000000000080bfdbb60d3f00000000408b6c3e00000000b09d6fbd000000000000803f000000000000803f0000000000000000000080bf0000003f00000000c0d36b3e00000000c80a2ebd000000000000803f000000000000803f0000000000000000000080bf6edbf63e0000000008d7a33e0000000048b673bd000000000000803f000000000000803f0000000000000000000080bfdbb60d3f00000000408b6c3e00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf4992043f00000000408b6c3e00000000b09d6fbd00000000ffff7f3f000000000000803f0000000000000000000080bf0000003f0000000008d7a33e0000000048b673bd00000000ffff7f3f000000000000803f0000000000000000000080bfdbb60d3f00000000408b6c3e00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf4992043f0000000008d7a33e0000000048b673bd000000000000803f000000000000803f0000000000000000000080bfdbb60d3f0000000008d7a33e00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf9224093f00000000747ec1be0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e000000001458b9be0000000000d5f83d00000000ffff7f3f000000000000803f0000000000000000000080bf7b015b3e000000001ceaadbe0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e000000005c4ec9be00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000747ec1be0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e000000001ceaadbe0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e000000005c4ec9be00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e000000001ceaadbe0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e0000000004fca2be00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e00000000b8c8d0be00000000bc1ef13d00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3e000000005c4ec9be00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e0000000004fca2be00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e000000006ceed7be00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000b8c8d0be00000000bc1ef13d000000000000803f000000000000803f0000000000000000000080bf54c36c3e0000000004fca2be00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e000000006ceed7be00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e0000000004fca2be00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e00000000eca598be0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000060c0debe00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e000000006ceed7be00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000eca598be0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000060c0debe00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000eca598be0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000803fe5be0000000024dbd93d000000000000803f000000000000803f0000000000000000000080bf2e857e3e0000000060c0debe00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000b46cebbe00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000803fe5be0000000024dbd93d000000000000803f000000000000803f0000000000000000000080bf2e857e3e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000b46cebbe00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000402286be00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000e848f1be00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000b46cebbe00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000402286be00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000e848f1be00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000402286be00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e0000000004d5f6be0000000018d9b23d000000000000803f000000000000803f0000000000000000000080bf8423883e00000000e848f1be00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000ec11fcbe000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e0000000004d5f6be0000000018d9b23d000000000000803f000000000000803f0000000000000000000080bf8423883e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000ec11fcbe000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e0000000018406ebe00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000468000bf000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000ec11fcbe000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e0000000018406ebe00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000468000bf000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e0000000018406ebe00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000468000bf000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000e6d002bf00000000088115bd000000000000803f000000000000803f0000000000000000000080bf15fa933e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000220700bf00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e00000000220700bf00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000002858fabe0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e000000002858fabe0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000001483f4be00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e000000001483f4be00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000b492eebe00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000b492eebe00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000ac8ae8be00000000e074553c000000000000803f000000000000803f0000000000000000000080bf4ac6a23e00000000ac8ae8be00000000e074553c000000000000803f000000000000803f0000000000000000000080bf4ac6a23e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000009c6ee2be00000000a0c4a03c000000000000803f000000000000803f0000000000000000000080bfeebba53e000000009c6ee2be00000000a0c4a03c000000000000803f000000000000803f0000000000000000000080bfeebba53e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000002c42dcbe00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e000000002c42dcbe00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000f808d6be00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000f808d6be00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000acc6cfbe00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e00000000acc6cfbe00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000ec7ec9be0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000ec7ec9be0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000ec7ec9be0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e000000005435c3be0000000028a0173d000000000000803f000000000000803f0000000000000000000080bf2488b43e000000005435c3be0000000028a0173d000000000000803f000000000000803f0000000000000000000080bf2488b43e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e0000000094edbcbe000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e0000000094edbcbe000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e0000000090c058be00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000094edbcbe000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e0000000090c058be00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e00000000d84db6be00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e00000000d84db6be00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e0000000090c058be00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e000000008c41b0be00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e00000000d84db6be00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000bcc8aabe00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e000000008c41b0be00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e000000005ce3a5be00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e00000000bcc8aabe00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e000000006c91a1be000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e000000005ce3a5be00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000f8d29dbe00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e000000006c91a1be000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000f8d29dbe00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000e0474dbe00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000f4a79abe000000004032453c000000000000803f000000000000803f0000000000000000000080bf4635cc3e00000000f8d29dbe00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e00000000e0474dbe00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e000000006c1098be0000000080a67d3b000000000000803f000000000000803f0000000000000000000080bfea2acf3e00000000f4a79abe000000004032453c000000000000803f000000000000803f0000000000000000000080bf4635cc3e00000000e0474dbe00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000540c96be00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e000000006c1098be0000000080a67d3b00000000ffff7f3f000000000000803f0000000000000000000080bfea2acf3e00000000e0474dbe00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000540c96be00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e00000000e0474dbe00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000b0c64bbe000000009016d9bc00000000ffff7f3f000000000000803f0000000000000000000080bf15fa133e00000000ac9b94be0000000090bd84bc000000000000803f000000000000803f0000000000000000000080bf3216d53e00000000540c96be00000000403fb5bb000000000000803f000000000000803f0000000000000000000080bf8e20d23e00000000b0c64bbe000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e0000000080be93be0000000040dde6bc00000000ffff7f3f000000000000803f0000000000000000000080bfd70bd83e00000000ac9b94be0000000090bd84bc00000000ffff7f3f000000000000803f0000000000000000000080bf3216d53e00000000b0c64bbe000000009016d9bc00000000ffff7f3f000000000000803f0000000000000000000080bf15fa133e0000000080be93be0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000b0c64bbe000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000c07493be00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e0000000080be93be0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000c07493be00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e00000000c07493be00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e0000000070e7bbbe00000000ee7cbfbd00000000ffff7f3f000000000000803f0000000000000000000080bfc3ece03e00000000c07493be00000000dc2486bd00000000ffff7f3f000000000000803f0000000000000000000080bf1ff7dd3e00000000c07493be00000000fa7eeabd00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000c07493be00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000007c30c5be000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e0000000070e7bbbe00000000ee7cbfbd000000000000803f000000000000803f0000000000000000000080bfc3ece03e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000b881cebe000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e000000007c30c5be000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f0000000030b2d7be0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e00000000b881cebe000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e0000000030b2d7be0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000940f9dbe0000000008d7f7bd000000000000803f000000000000803f0000000000000000000080bf2e857e3f00000000c07493be000000005b647bbe00000000ffff7f3f000000000000803f0000000000000000000080bf73ba4a3f00000000c07493be00000000fa7eeabd00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000b0c64bbe000000000bd783be00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e0e3e00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000940f9dbe0000000008d7f7bd000000000000803f000000000000803f0000000000000000000080bf2e857e3f00000000485aa6be0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000fc0ce9be000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000485aa6be0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000fc0ce9be000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000485aa6be0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000683bafbe00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f0000000064e5f0be000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e00000000fc0ce9be000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000683bafbe00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f0000000064e5f0be000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e00000000683bafbe00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f000000007499b7be0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e0000000064e5f0be000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e000000007499b7be0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e000000007499b7be0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f00000000f45abfbe000000002b8718be000000000000803f000000000000803f0000000000000000000080bfe599783f0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e00000000f45abfbe000000002b8718be000000000000803f000000000000803f0000000000000000000080bfe599783f000000006c66c6be00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000006c1ffebe000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e000000006c66c6be00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000006c1ffebe000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e000000006c66c6be00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f0000000054a2ccbe00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000006c1ffebe000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e0000000054a2ccbe00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e0000000054a2ccbe00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000003cf5d1be0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000003cf5d1be0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f00000000a445d6be00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e00000000a445d6be00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000a445d6be00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000107ad9be00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000107ad9be00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f000000000079dbbe0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f000000008cb304bf0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e000000000079dbbe0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f000000008cb304bf0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f000000000079dbbe0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000fc28dcbe000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f00000000ba1e05bf00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f000000008cb304bf0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f00000000fc28dcbe000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f00000000ba1e05bf00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f00000000fc28dcbe000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f000000008ce0dbbe0000000017ff69be000000000000803f000000000000803f0000000000000000000080bf54c36c3f00000000ba1e05bf00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f000000008ce0dbbe0000000017ff69be000000000000803f000000000000803f0000000000000000000080bf54c36c3f00000000640cdbbe00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f000000007ce304bf0000000042d87fbe00000000ffff7f3f000000000000803f0000000000000000000080bf0db3033f00000000ba1e05bf00000000ea2671be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023f00000000640cdbbe00000000c5b372be00000000ffff7f3f000000000000803f0000000000000000000080bf82486b3f000000007ce304bf0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000640cdbbe00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f000000003cb4d9be00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f000000007ce304bf0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f000000003cb4d9be00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f00000000dcdfd7be000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f00000000a48c96be00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f00000000c07493be000000005b647bbe000000000000803f000000000000803f0000000000000000000080bf73ba4a3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f000000007ce304bf0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000dcdfd7be000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f0000000074af99be000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f00000000a48c96be00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000dcdfd7be000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f00000000f896d5be000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f0000000034dd9cbe00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f0000000074af99be000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e0000000038500fbe00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b00000000783d0abe00000000f85383be000000000000803f000000000000803f0000000000000000000080bf0000000000000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000034dd9cbe00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e0000000008a64bbe0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000f896d5be000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f000000004ce1d2be00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000c04614be00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c0000000038500fbe00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000dc15a0be0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f0000000034dd9cbe00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f0000000008a64bbe0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e00000000dc15a0be0000000058d787be00000000ffff7f3f000000000000803f0000000000000000000080bfbca5503f0000000008a64bbe0000000071e685be00000000ffff7f3f000000000000803f0000000000000000000080bf8423083e00000000c8444bbe000000000abc87be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023e00000000b01a19be00000000ee7c88be000000000000803f000000000000803f0000000000000000000080bfcc0e8e3c00000000c04614be00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f000000004ce1d2be00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000961803bf000000006de78dbe00000000ffff7f3f000000000000803f0000000000000000000080bfb2a8063f000000004ce1d2be00000000b29d87be00000000ffff7f3f000000000000803f0000000000000000000080bf3a5d653f000000009cc6cfbe0000000022438abe00000000ffff7f3f000000000000803f0000000000000000000080bf68e2633f00000000dc15a0be0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000c8444bbe000000000abc87be000000000000803f000000000000803f0000000000000000000080bf3b38023e00000000d0a34abe000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d000000007459a3be00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000dc15a0be0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000d0a34abe000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d00000000a8c51dbe0000000058ed89be00000000ffff7f3f000000000000803f0000000000000000000080bf1069bd3c00000000b01a19be00000000ee7c88be00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3c00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f000000007459a3be00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000d0a34abe000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d0000000010c449be00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d00000000f4a7a6be0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f000000007459a3be00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f0000000010c449be00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d00000000484122be0000000086378bbe00000000ffff7f3f000000000000803f0000000000000000000080bf54c3ec3c00000000a8c51dbe0000000058ed89be00000000ffff7f3f000000000000803f0000000000000000000080bf1069bd3c00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000009cc6cfbe0000000022438abe000000000000803f000000000000803f0000000000000000000080bf68e2633f000000009c4eccbe00000000b47c8cbe000000000000803f000000000000803f0000000000000000000080bf9567623f00000000f4a7a6be0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f0000000010c449be00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d0000000068a648be00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000388726be000000001d5a8cbe000000000000803f000000000000803f0000000000000000000080bfcc0e0e3d00000000484122be0000000086378bbe000000000000803f000000000000803f0000000000000000000080bf54c3ec3c00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000f4a7a6be0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f0000000068a648be00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f0000000068a648be00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000c04b47be00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d0000000018912abe00000000be538dbe00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253d00000000388726be000000001d5a8cbe00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e0e3d00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000009c4eccbe00000000b47c8cbe000000000000803f000000000000803f0000000000000000000080bf9567623f000000000c81c8be0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000c04b47be00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d0000000008b545be00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d00000000bc65adbe0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f0000000008b545be00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d0000000080582ebe000000000c238ebe000000000000803f000000000000803f0000000000000000000080bf10693d3d0000000018912abe00000000be538dbe000000000000803f000000000000803f0000000000000000000080bfeebb253d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000bc65adbe0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f0000000008b545be00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d0000000028e343be00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000000c81c8be0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f0000000018d731be00000000a8c68ebe00000000ffff7f3f000000000000803f0000000000000000000080bf3216553d0000000080582ebe000000000c238ebe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3d00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000000c81c8be0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f00000000a865c4be00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f00000000bc65adbe0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f0000000028e343be00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000028e343be00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d0000000008d741be0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d00000000800635be00000000373d8fbe000000000000803f000000000000803f0000000000000000000080bf54c36c3d0000000018d731be00000000a8c68ebe000000000000803f000000000000803f0000000000000000000080bf3216553d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000008d741be0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d0000000090913fbe0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d0000000058e037be000000005a858fbe00000000ffff7f3f000000000000803f0000000000000000000080bf3b38823d00000000800635be00000000373d8fbe00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3d00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000090913fbe0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000090913fbe0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000a8133dbe00000000ef8c8fbe000000000000803f000000000000803f0000000000000000000080bf5de5993d00000000385e3abe00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d0000000058e037be000000005a858fbe000000000000803f000000000000803f0000000000000000000080bf3b38823d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000344fb4be00000000f50d90be00000000ffff7f3f000000000000803f0000000000000000000080bfa986593f00000000a8133dbe00000000ef8c8fbe00000000ffff7f3f000000000000803f0000000000000000000080bf5de5993d00000000385e3abe00000000b39d8fbe00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3d00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000a865c4be00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f000000003004c0be00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f00000000385e3abe00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000054d4b7be00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000003004c0be00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f0000000054d4b7be00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000005052ffbe000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f000000005052ffbe000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f0000000018fb98be0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f00000000cccd92be00000000cb3f9dbe00000000ffff7f3f000000000000803f0000000000000000000080bfc036273f00000000d4f793be00000000115899be00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253f00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f0000000084c0fabe000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f000000005052ffbe000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f0000000018fb98be0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f0000000084c0fabe000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f0000000018fb98be0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f000000005c089ebe000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f00000000845a91be000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f00000000cccd92be00000000cb3f9dbe000000000000803f000000000000803f0000000000000000000080bfc036273f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000845a91be000000000ac7a0be00000000ffff7f3f000000000000803f0000000000000000000080bf92b1283f00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000a83e14be000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f0000000084c0fabe000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f000000005c089ebe000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f000000005c089ebe000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f00000000bc1ea3be0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f00000000ac9b8fbe000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f00000000845a91be000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f00000000a83e14be000000008c3ba2be000000000000803f000000000000803f0000000000000000000080bfcfc4473f00000000ac9b8fbe000000009eefa3be00000000ffff7f3f000000000000803f0000000000000000000080bf652c2a3f00000000a83e14be000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f0000000098591dbe000000007a1aa5be00000000ffff7f3f000000000000803f0000000000000000000080bffd49463f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f00000000bc1ea3be0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f00000000503da8be000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f00000000008f8dbe000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f00000000ac9b8fbe000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f0000000098591dbe000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f000000004c8aefbe00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f00000000503da8be000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f00000000008f8dbe000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f0000000098591dbe000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f0000000018ae25be00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f000000004c8aefbe00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f00000000503da8be000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000002c63adbe0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f000000003c328bbe00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f00000000008f8dbe000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f0000000018ae25be00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f000000003c328bbe00000000132ca9be00000000ffff7f3f000000000000803f0000000000000000000080bf09222d3f0000000018ae25be00000000a79ba7be00000000ffff7f3f000000000000803f0000000000000000000080bf2bcf443f00000000085c2dbe0000000014c4a9be00000000ffff7f3f000000000000803f0000000000000000000080bf5954433f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000004c8aefbe00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000002c63adbe0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000002c63adbe0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000648fb2be000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f00000000188388be000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f000000003c328bbe00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f00000000085c2dbe0000000014c4a9be000000000000803f000000000000803f0000000000000000000080bf5954433f00000000188388be000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f00000000085c2dbe0000000014c4a9be000000000000803f000000000000803f0000000000000000000080bf5954433f00000000408334be00000000c598abbe000000000000803f000000000000803f0000000000000000000080bf87d9413f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f00000000648fb2be000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f0000000010c1b7be00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000004c7f85be00000000b803adbe000000000000803f000000000000803f0000000000000000000080bfad17303f00000000188388be000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f00000000408334be00000000c598abbe000000000000803f000000000000803f0000000000000000000080bf87d9413f000000004c7f85be00000000b803adbe00000000ffff7f3f000000000000803f0000000000000000000080bfad17303f00000000408334be00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f0000000098433bbe00000000b91eadbe00000000ffff7f3f000000000000803f0000000000000000000080bfb55e403f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f0000000010c1b7be00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f0000000010c1b7be00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000004cf7bcbe000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f00000000942482be000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f000000004c7f85be00000000b803adbe000000000000803f000000000000803f0000000000000000000080bfad17303f0000000098433bbe00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000942482be000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f0000000098433bbe00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000f8bc41be00000000f35aaebe000000000000803f000000000000803f0000000000000000000080bfe2e33e3f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000004cf7bcbe000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f000000002c31c2be00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000942482be000000004b6eaebe00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313f00000000f8bc41be00000000f35aaebe00000000ffff7f3f000000000000803f0000000000000000000080bfe2e33e3f00000000300f48be000000007452afbe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3f0000000050e17cbe000000002085afbe00000000ffff7f3f000000000000803f0000000000000000000080bf510d333f00000000942482be000000004b6eaebe00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313f00000000300f48be000000007452afbe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000002c31c2be00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f0000000050e17cbe000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000300f48be000000007452afbe000000000000803f000000000000803f0000000000000000000080bf10693d3f00000000205a4ebe000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f000000002c31c2be00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000c46dc7be00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f0000000080c274be00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f0000000050e17cbe000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000205a4ebe000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f0000000080c274be00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f00000000205a4ebe000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f00000000a8bd54be000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f00000000c46dc7be00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f0000000034acccbe0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f0000000030e86bbe00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f0000000080c274be00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f00000000a8bd54be000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f0000000088ebd1be0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bf15fa133f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f0000000034acccbe0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f0000000030e86bbe00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f00000000a8bd54be000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f0000000098595bbe00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f00000000d84d62be0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bfc87d373f0000000030e86bbe00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f0000000098595bbe00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f00000000363333bf00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bfabaa2a3f00000000363333bf0000000061e5b03e00000000ffff7f3f000000000000803f0000000000000000000080bfabaaaa3e00000000826a1cbf0000000061e5b03e00000000ffff7f3f000000000000803f0000000000000000000080bf0000000000000000363333bf00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bfabaa2a3f00000000826a1cbf0000000061e5b03e00000000ffff7f3f000000000000803f0000000000000000000080bf0000000000000000826a1cbf00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c00000000723d9abf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bf00000000000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000723d9abf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bf0000000000000000baf37dbf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bfc853023f000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000baf37dbf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bfc853023f000000009ad874bf000000003dfaaf3e000000000000803f000000000000803f0000000000000000000080bf7058fb3e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000009ad874bf000000003dfaaf3e000000000000803f000000000000803f0000000000000000000080bf7058fb3e00000000b6976cbf00000000734dad3e000000000000803f000000000000803f0000000000000000000080bf4f09f23e000000002fb28dbf000000000bd7833e00000000ffff7f3f000000000000803f0000000000000000000080bf58fb063f00000000b6976cbf00000000734dad3e00000000ffff7f3f000000000000803f0000000000000000000080bf4f09f23e00000000162e65bf00000000f5fda83e00000000ffff7f3f000000000000803f0000000000000000000080bf2fbae83e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000162e65bf00000000f5fda83e000000000000803f000000000000803f0000000000000000000080bf2fbae83e00000000c6985ebf00000000b52aa33e000000000000803f000000000000803f0000000000000000000080bf0e6bdf3e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000c6985ebf00000000b52aa33e000000000000803f000000000000803f0000000000000000000080bf0e6bdf3e00000000d0d458bf00000000a7f29b3e000000000000803f000000000000803f0000000000000000000080bfed1bd63e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000d0d458bf00000000a7f29b3e000000000000803f000000000000803f0000000000000000000080bfed1bd63e000000003edf53bf00000000bd74933e000000000000803f000000000000803f0000000000000000000080bfcdcccc3e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000003edf53bf00000000bd74933e000000000000803f000000000000803f0000000000000000000080bfcdcccc3e000000001cb54fbf00000000e9cf893e000000000000803f000000000000803f0000000000000000000080bfac7dc33e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000001cb54fbf00000000e9cf893e000000000000803f000000000000803f0000000000000000000080bfac7dc33e00000000baf37dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bfe9a20b3f00000000baf37dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bfe9a20b3f000000001cb54fbf00000000e9cf893e000000000000803f000000000000803f0000000000000000000080bfac7dc33e0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000002fb28dbf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf0000803f00000000de9478bf00000000fd47833e000000000000803f000000000000803f0000000000000000000080bf794a103f00000000baf37dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bfe9a20b3f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e000000005ad773bf000000006bac813e000000000000803f000000000000803f0000000000000000000080bf09f2143f00000000de9478bf00000000fd47833e000000000000803f000000000000803f0000000000000000000080bf794a103f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e0000000036b36fbf00000000723d7e3e000000000000803f000000000000803f0000000000000000000080bf9a99193f000000005ad773bf000000006bac813e000000000000803f000000000000803f0000000000000000000080bf09f2143f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e0000000036b36fbf00000000723d7e3e000000000000803f000000000000803f0000000000000000000080bf9a99193f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e000000007a206cbf000000009e72773e000000000000803f000000000000803f0000000000000000000080bf2a411e3f0000000036b36fbf00000000723d7e3e000000000000803f000000000000803f0000000000000000000080bf9a99193f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000301769bf00000000222d6f3e000000000000803f000000000000803f0000000000000000000080bfbae8223f000000007a206cbf000000009e72773e000000000000803f000000000000803f0000000000000000000080bf2a411e3f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000608f66bf00000000caa1653e000000000000803f000000000000803f0000000000000000000080bf4a90273f00000000301769bf00000000222d6f3e000000000000803f000000000000803f0000000000000000000080bfbae8223f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000608f66bf00000000caa1653e000000000000803f000000000000803f0000000000000000000080bf4a90273f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e00000000128164bf0000000062055b3e000000000000803f000000000000803f0000000000000000000080bfdb372c3f00000000608f66bf00000000caa1653e000000000000803f000000000000803f0000000000000000000080bf4a90273f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e0000000054e462bf00000000b28c4f3e000000000000803f000000000000803f0000000000000000000080bf6bdf303f00000000128164bf0000000062055b3e000000000000803f000000000000803f0000000000000000000080bfdb372c3f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e000000002ab161bf000000008a6c433e000000000000803f000000000000803f0000000000000000000080bffb86353f0000000054e462bf00000000b28c4f3e000000000000803f000000000000803f0000000000000000000080bf6bdf303f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e000000002ab161bf000000008a6c433e000000000000803f000000000000803f0000000000000000000080bffb86353f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e00000000c0c346bf00000000e244343e000000000000803f000000000000803f0000000000000000000080bf2a419e3e00000000a0df60bf00000000b2d9363e000000000000803f000000000000803f0000000000000000000080bf8c2e3a3f000000002ab161bf000000008a6c433e000000000000803f000000000000803f0000000000000000000080bffb86353f00000000c0c346bf00000000e244343e000000000000803f000000000000803f0000000000000000000080bf2a419e3e00000000be6760bf00000000f2082a3e000000000000803f000000000000803f0000000000000000000080bf1cd63e3f00000000a0df60bf00000000b2d9363e000000000000803f000000000000803f0000000000000000000080bf8c2e3a3f00000000c0c346bf00000000e244343e000000000000803f000000000000803f0000000000000000000080bf2a419e3e00000000be6760bf00000000f2082a3e00000000ffff7f3f000000000000803f0000000000000000000080bf1cd63e3f00000000c0c346bf00000000e244343e00000000ffff7f3f000000000000803f0000000000000000000080bf2a419e3e000000006a6646bf000000008816193e00000000ffff7f3f000000000000803f0000000000000000000080bf09f2943e000000008c4160bf000000001a2f1d3e000000000000803f000000000000803f0000000000000000000080bfac7d433f00000000be6760bf00000000f2082a3e000000000000803f000000000000803f0000000000000000000080bf1cd63e3f000000006a6646bf000000008816193e000000000000803f000000000000803f0000000000000000000080bf09f2943e00000000ec8060bf000000008c660c3e000000000000803f000000000000803f0000000000000000000080bf3d25483f000000008c4160bf000000001a2f1d3e000000000000803f000000000000803f0000000000000000000080bfac7d433f000000006a6646bf000000008816193e000000000000803f000000000000803f0000000000000000000080bf09f2943e00000000ec8060bf000000008c660c3e000000000000803f000000000000803f0000000000000000000080bf3d25483f000000006a6646bf000000008816193e000000000000803f000000000000803f0000000000000000000080bf09f2943e0000000042c946bf000000001872fc3d000000000000803f000000000000803f0000000000000000000080bfe9a28b3e00000000dc3b61bf00000000b4c7f93d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3f00000000ec8060bf000000008c660c3e000000000000803f000000000000803f0000000000000000000080bf3d25483f0000000042c946bf000000001872fc3d000000000000803f000000000000803f0000000000000000000080bfe9a28b3e00000000dc3b61bf00000000b4c7f93d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3f0000000042c946bf000000001872fc3d000000000000803f000000000000803f0000000000000000000080bfe9a28b3e00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e00000000966d62bf000000003c60dd3d000000000000803f000000000000803f0000000000000000000080bf5d74513f00000000dc3b61bf00000000b4c7f93d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3f00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e000000004e1164bf00000000e8a8c33d000000000000803f000000000000803f0000000000000000000080bfed1b563f00000000966d62bf000000003c60dd3d000000000000803f000000000000803f0000000000000000000080bf5d74513f00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e000000004e1164bf00000000e8a8c33d000000000000803f000000000000803f0000000000000000000080bfed1b563f00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e00000000422266bf00000000e8b3ac3d000000000000803f000000000000803f0000000000000000000080bf7ec35a3f000000004e1164bf00000000e8a8c33d000000000000803f000000000000803f0000000000000000000080bfed1b563f000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e00000000aa9b68bf000000007093983d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3f00000000422266bf00000000e8b3ac3d000000000000803f000000000000803f0000000000000000000080bf7ec35a3f000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e00000000aa9b68bf000000007093983d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3f000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000bc786bbf00000000b859873d000000000000803f000000000000803f0000000000000000000080bf9e12643f00000000aa9b68bf000000007093983d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000b2b46ebf00000000e031723d000000000000803f000000000000803f0000000000000000000080bf2fba683f00000000bc786bbf00000000b859873d000000000000803f000000000000803f0000000000000000000080bf9e12643f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000c44a72bf00000000a0c65b3d000000000000803f000000000000803f0000000000000000000080bfbf616d3f00000000b2b46ebf00000000e031723d000000000000803f000000000000803f0000000000000000000080bf2fba683f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e000000002c3676bf0000000018964b3d000000000000803f000000000000803f0000000000000000000080bf4f09723f00000000c44a72bf00000000a0c65b3d000000000000803f000000000000803f0000000000000000000080bfbf616d3f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e000000002c3676bf0000000018964b3d000000000000803f000000000000803f0000000000000000000080bf4f09723f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e0000000022727abf00000000a8c4413d000000000000803f000000000000803f0000000000000000000080bfdfb0763f000000002c3676bf0000000018964b3d000000000000803f000000000000803f0000000000000000000080bf4f09723f00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e00000000def97ebf00000000c8763e3d00000000ffff7f3f000000000000803f0000000000000000000080bf70587b3f0000000022727abf00000000a8c4413d00000000ffff7f3f000000000000803f0000000000000000000080bfdfb0763f00000000624250bf0000000020a7033d00000000ffff7f3f000000000000803f0000000000000000000080bfcdcc4c3e00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c000000002fb28dbf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf0000803f000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000002fb28dbf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf0000803f00000000def97ebf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf70587b3f000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000def97ebf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf70587b3f00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e000000000cac54bf000000000054633c000000000000803f000000000000803f0000000000000000000080bf8c2e3a3e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000000cac54bf000000000054633c000000000000803f000000000000803f0000000000000000000080bf8c2e3a3e000000006eed59bf0000000080ba0dbb000000000000803f000000000000803f0000000000000000000080bf4a90273e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000006eed59bf0000000080ba0dbb000000000000803f000000000000803f0000000000000000000080bf4a90273e00000000ba0960bf00000000901981bc000000000000803f000000000000803f0000000000000000000080bf09f2143e000000002fb28dbf00000000e8fb29bd00000000ffff7f3f000000000000803f0000000000000000000080bf0e6b5f3d00000000ba0960bf00000000901981bc00000000ffff7f3f000000000000803f0000000000000000000080bf09f2143e000000001c0467bf0000000080c0dabc00000000ffff7f3f000000000000803f0000000000000000000080bfc853023e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000001c0467bf0000000080c0dabc000000000000803f000000000000803f0000000000000000000080bfc853023e00000000c6df6ebf0000000000780ebd000000000000803f000000000000803f0000000000000000000080bf0e6bdf3d000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000c6df6ebf0000000000780ebd000000000000803f000000000000803f0000000000000000000080bf0e6bdf3d00000000e89f77bf00000000e8f522bd000000000000803f000000000000803f0000000000000000000080bf8c2eba3d000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000e89f77bf00000000e8f522bd000000000000803f000000000000803f0000000000000000000080bf8c2eba3d00000000d9a380bf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf09f2943d00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000002fb28dbf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2143d00000000 + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: -0.000000059604645, y: 0, z: 0} + m_Extent: {x: 1.2050002, y: 0, z: 0.34550002} + m_MeshUsageFlags: 0 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: --- !u!114 &1390840085 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3011,6 +4167,248 @@ MonoBehaviour: - {fileID: 1852085904} - {fileID: 816671309} - {fileID: 1390840085} +--- !u!43 &1423796318 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 4Gon - 9ed4e71095511e76473fe88ad70ec7ef + serializedVersion: 10 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 6 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 4 + localAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 1, y: 0, z: 1} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 1 + m_KeepIndices: 1 + m_IndexFormat: 0 + m_IndexBuffer: 000001000200010003000200 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 4 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 12 + format: 0 + dimension: 3 + - stream: 0 + offset: 24 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 40 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 192 + _typelessdata: 000080bf000000002ebd3bb3000000000000803f000000000000803f0000000000000000000080bf000000000000000000000000000000000000803f000000000000803f000000000000803f0000000000000000000080bf00000000000000000000000000000000000080bf000000000000803f000000000000803f0000000000000000000080bf00000000000000000000803f000000002ede4c32000000000000803f000000000000803f0000000000000000000080bf0000000000000000 + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 1, y: 0, z: 1} + m_MeshUsageFlags: 0 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: +--- !u!21 &1455670315 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Standard (Instance) + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] --- !u!1 &1464556211 GameObject: m_ObjectHideFlags: 0 @@ -3248,6 +4646,89 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1506703863} m_CullTransparentMesh: 1 +--- !u!1 &1525231632 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1525231633} + - component: {fileID: 1525231635} + - component: {fileID: 1525231634} + m_Layer: 0 + m_Name: 6Gon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1525231633 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525231632} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -13, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 239243193} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1525231634 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525231632} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 950424089} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1525231635 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525231632} + m_Mesh: {fileID: 1888238522} --- !u!1 &1527997981 GameObject: m_ObjectHideFlags: 0 @@ -3457,6 +4938,137 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1622342826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1622342827} + - component: {fileID: 1622342829} + - component: {fileID: 1622342828} + - component: {fileID: 1622342830} + m_Layer: 0 + m_Name: 5Gon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1622342827 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622342826} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -10, y: 0, z: 0.09549147} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 239243193} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1622342828 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622342826} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 1088138830} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1622342829 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622342826} + m_Mesh: {fileID: 828542546} +--- !u!114 &1622342830 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622342826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2cb1817d5a3fda645aa9b1b658ad3003, type: 3} + m_Name: + m_EditorClassIdentifier: + _serializedData: '{"totalChildrenCount":0,"applicationId":null,"speckle_type":"Speckle.ConnectorUnity.Wrappers.SpeckleProperties+SpeckleData","id":"c654a738a88de3616bff9515a0119272"}' + _serializedSpeckleType: Speckle.Core.Models.Base, SpeckleCore2, Version=2.1.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!1 &1691753946 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1691753947} + m_Layer: 0 + m_Name: da5ba55774 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1691753947 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1691753946} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2044880247} + m_Father: {fileID: 344004931} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1707872729 GameObject: m_ObjectHideFlags: 0 @@ -3817,6 +5429,170 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1885647142} m_CullTransparentMesh: 1 +--- !u!43 &1888238522 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 6Gon - 0cc6cb2bdc0872b08446a749a5b3b679 + serializedVersion: 10 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 12 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 6 + localAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0.8660259, y: 0, z: 1} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 1 + m_KeepIndices: 1 + m_IndexFormat: 0 + m_IndexBuffer: 000001000200010003000200030004000200040005000200 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 6 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 12 + format: 0 + dimension: 3 + - stream: 0 + offset: 24 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 40 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 288 + _typelessdata: e0b35dbf00000000ffffff3e000000000000803f000000000000803f0000000000000000000080bf000000000000000000000000000000000000803f000000000000803f000000000000803f0000000000000000000080bf0000000000000000d0b35dbf00000000010000bf000000000000803f000000000000803f0000000000000000000080bf0000000000000000e0b35d3f00000000fdffff3e000000000000803f000000000000803f0000000000000000000080bf0000000000000000e0b35d3f00000000fdffffbe00000000ffff7f3f000000000000803f0000000000000000000080bf00000000000000000000000000000000000080bf000000000000803f000000000000803f0000000000000000000080bf0000000000000000 + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0.8660259, y: 0, z: 1} + m_MeshUsageFlags: 0 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: --- !u!1 &1903332497 GameObject: m_ObjectHideFlags: 0 @@ -4148,6 +5924,38 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &2044880246 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2044880247} + m_Layer: 0 + m_Name: Collection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2044880247 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044880246} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 239243193} + m_Father: {fileID: 1691753947} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2052145309 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef similarity index 91% rename from Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef rename to Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef index 1e5b8d0..e5cd450 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef @@ -1,5 +1,5 @@ { - "name": "Speckle.Connector.Editor", + "name": "Speckle.ConnectorUnity.Components.Editor", "rootNamespace": "Speckle.ConnectorUnity", "references": [ "GUID:eed1b8b83e2c0074d9e5de2348e3ff72", diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.Connector.Editor.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs similarity index 94% rename from Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs rename to Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs index a49a14d..422b5cc 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Linq; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using Speckle.Core.Api; @@ -18,13 +19,12 @@ namespace Speckle.ConnectorUnity.Components.Editor private bool foldOutStatus = true; private Texture2D? previewImage; - private CancellationTokenSource? tokenSource; - public void OnEnable() { var speckleReceiver = (SpeckleReceiver) target; UpdatePreviewImage(); speckleReceiver.OnCommitSelectionChange.AddListener(_ => UpdatePreviewImage()); + Debug.Log(Assembly.GetAssembly(typeof(SpeckleReceiverEditor)).FullName); } private void UpdatePreviewImage() @@ -58,14 +58,13 @@ namespace Speckle.ConnectorUnity.Components.Editor public async Task Receive(SpeckleReceiver speckleReceiver) { - tokenSource?.Cancel(); + speckleReceiver.CancellationTokenSource?.Cancel(); if (!speckleReceiver.GetSelection(out Client? client, out _, out Commit? commit, out string? error)) { Debug.LogWarning($"Not ready to receive: {error}", speckleReceiver); return null; } - - tokenSource = new CancellationTokenSource(); + Base? commitObject = await ReceiveCommit(speckleReceiver, client.ServerUrl); if (commitObject == null) return null; @@ -141,7 +140,7 @@ namespace Speckle.ConnectorUnity.Components.Editor speckleReceiver.OnTotalChildrenCountKnown.AddListener(OnTotalChildrenKnown); speckleReceiver.OnReceiveProgressAction.AddListener(OnProgress); speckleReceiver.OnErrorAction.AddListener(OnError); - commitObject = await speckleReceiver.ReceiveAsync(tokenSource?.Token ?? CancellationToken.None); + commitObject = await speckleReceiver.ReceiveAsync(); if (commitObject == null) { Debug.LogWarning($"Receive warning: Receive operation returned null", speckleReceiver); @@ -160,13 +159,8 @@ namespace Speckle.ConnectorUnity.Components.Editor private void CancelReceive() { - tokenSource?.Cancel(); + ((SpeckleReceiver)target).CancellationTokenSource?.Cancel(); EditorApplication.delayCall += EditorUtility.ClearProgressBar; } - - private void OnDestroy() - { - tokenSource?.Cancel(); - } } } diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiver.Editor.cs.meta rename to Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs new file mode 100644 index 0000000..22096cf --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs @@ -0,0 +1,111 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.ComponentModel; +using System.Threading.Tasks; +using Speckle.Core.Models; +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using Component = UnityEngine.Component; + +#nullable enable +namespace Speckle.ConnectorUnity.Components.Editor +{ + + public enum SelectionFilter + { + [Tooltip("Convert all children of this GameObject")] + Children, + [Tooltip("Convert GameObjects currently selected in the hierarchy (consider padlocking this inspector)")] + Selection, + [InspectorName("All (excl. disabled)")] + [Tooltip("Convert all GameObjects (excluding disabled) in the active scene")] + Enabled, + [Tooltip("Convert all GameObjects (including disabled) in the active scene")] + [InspectorName("All (incl. disabled)")] + All, + } + + [CustomEditor(typeof(SpeckleSender))] + [CanEditMultipleObjects] + public class SpeckleSendEditor : UnityEditor.Editor + { + + private SelectionFilter selectedFilter = SelectionFilter.Children; + + public override async void OnInspectorGUI() + { + //Draw events in a collapsed region + DrawDefaultInspector(); + + selectedFilter = (SelectionFilter)EditorGUILayout.EnumPopup(selectedFilter); + bool shouldSend = GUILayout.Button("Send!"); + + if (shouldSend) + { + await ConvertAndSend(); + } + } + + public async Task ConvertAndSend() + { + var speckleSender = (SpeckleSender) target; + + if (!speckleSender.GetSelection(out _, out _, out _, out string? error)) + { + Debug.LogWarning($"Not ready to send: {error}", speckleSender); + return null; + } + + RecursiveConverter converter = speckleSender.Converter; + Base data = selectedFilter switch + { + SelectionFilter.All => ConvertAll(converter), + SelectionFilter.Enabled => ConvertEnabled(converter), + SelectionFilter.Children => ConvertChildren(converter), + SelectionFilter.Selection => ConvertSelection(converter), + _ => throw new InvalidEnumArgumentException(nameof(selectedFilter), (int) selectedFilter, selectedFilter.GetType()), + }; + + //TODO onError action? + + return await speckleSender.SendDataAsync(data, true); + } + + private Base ConvertChildren(RecursiveConverter converter) + { + return converter.RecursivelyConvertToSpeckle( + new []{((Component)target).gameObject}, + _ => true); + } + + private Base ConvertSelection(RecursiveConverter converter) + { + ISet selection = Selection.GetFiltered(SelectionMode.Deep).ToImmutableHashSet(); + return converter.RecursivelyConvertToSpeckle( + SceneManager.GetActiveScene().GetRootGameObjects(), + go => selection.Contains(go)); + } + + private Base ConvertAll(RecursiveConverter converter) + { + return converter.RecursivelyConvertToSpeckle( + SceneManager.GetActiveScene().GetRootGameObjects(), + _ => true); + } + + private Base ConvertEnabled(RecursiveConverter converter) + { + return converter.RecursivelyConvertToSpeckle( + SceneManager.GetActiveScene().GetRootGameObjects(), + go => go.activeInHierarchy); + } + + private void CancelSend() + { + ((SpeckleReceiver)target).CancellationTokenSource?.Cancel(); + EditorApplication.delayCall += EditorUtility.ClearProgressBar; + } + + } +} diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs.meta new file mode 100644 index 0000000..2f183f6 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9924a7d67cb7de24ea0c7f60ef1e0bdf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs index 8d94bc7..cc36d36 100644 --- a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs +++ b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs @@ -25,7 +25,7 @@ namespace Speckle.ConnectorUnity.Components /// /// GameObject parent = ... /// ISet selection = ... - /// Base b = RecursivelyConvertToSpeckle(parent, o => selection.contains(o)); + /// Base b = RecursivelyConvertToSpeckle(parent, o => selection.Contains(o)); /// /// /// Root objects of a tree diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta index 1f027df..6ddf98c 100644 --- a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta +++ b/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta @@ -5,7 +5,7 @@ MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 - icon: {instanceID: 0} + icon: {fileID: 2800000, guid: 5dd4c01168f890c49859afd36640b0a9, type: 3} userData: assetBundleName: assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components/Components.asmdef b/Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef similarity index 92% rename from Packages/systems.speckle.speckle-unity/Components/Components.asmdef rename to Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef index 773c4f3..920e120 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Components.asmdef +++ b/Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef @@ -1,5 +1,5 @@ { - "name": "Components", + "name": "Speckle.ConnectorUnity.Components", "rootNamespace": "Speckle.ConnectorUnity", "references": [ "GUID:05078f9b6da40444fbd72ec600449925", diff --git a/Packages/systems.speckle.speckle-unity/Components/Components.asmdef.meta b/Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Components.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs index 9f3da72..684bbd7 100644 --- a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs +++ b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using Speckle.ConnectorUnity.Wrappers.Selection; @@ -13,6 +14,7 @@ using Speckle.Core.Transports; using UnityEngine; using UnityEngine.Events; +[assembly: InternalsVisibleTo("Speckle.ConnectorUnity.Components.Editor")] namespace Speckle.ConnectorUnity.Components { [ExecuteAlways] @@ -21,22 +23,21 @@ namespace Speckle.ConnectorUnity.Components public class SpeckleReceiver : MonoBehaviour, ISerializationCallbackReceiver { [field: SerializeReference] - public AccountSelection Account { get; protected set; } + public AccountSelection Account { get; private set; } [field: SerializeReference] - public StreamSelection Stream { get; protected set; } + public StreamSelection Stream { get; private set; } [field: SerializeReference] - public BranchSelection Branch { get; protected set; } + public BranchSelection Branch { get; private set; } [field: SerializeReference] - public CommitSelection Commit { get; protected set; } + public CommitSelection Commit { get; private set; } - public RecursiveConverter Converter { get; protected set; } + public RecursiveConverter Converter { get; private set; } - private CancellationTokenSource cancellationTokenSource; - - [Header("Events"), HideInInspector] + [Header("Events")] + [HideInInspector] public UnityEvent OnCommitSelectionChange; [HideInInspector] public UnityEvent> OnReceiveProgressAction; @@ -48,46 +49,23 @@ namespace Speckle.ConnectorUnity.Components public UnityEvent OnComplete; #nullable enable - - public void Awake() - { - Initialise(true); - Converter = GetComponent(); - cancellationTokenSource = new CancellationTokenSource(); - - } - - protected void Initialise(bool forceRefresh = false) - { - Account ??= new AccountSelection(); - Stream ??= new StreamSelection(Account); - Branch ??= new BranchSelection(Stream); - Commit ??= new CommitSelection(Branch); - Stream.Initialise(); - Branch.Initialise(); - Commit.Initialise(); - Commit.OnSelectionChange = () => OnCommitSelectionChange.Invoke(Commit.Selected); - if(Account.Options is not {Length: > 0} || forceRefresh) - Account.RefreshOptions(); - - } - - - - + protected internal CancellationTokenSource? CancellationTokenSource { get; private set; } + /// /// Receives the selected commit object using async Task /// - /// /// Awaitable commit object /// thrown when selection is incomplete - public async Task ReceiveAsync(CancellationToken token) + public async Task ReceiveAsync() { + CancellationTokenSource?.Cancel(); + CancellationTokenSource?.Dispose(); + CancellationTokenSource = new CancellationTokenSource(); if(!GetSelection(out Client? client, out Stream? stream, out Commit? commit, out string? error)) throw new SpeckleException(error); return await ReceiveAsync( - token: token, + token: CancellationTokenSource.Token, client: client, streamId: stream.id, objectId: commit.referencedObject, @@ -272,10 +250,32 @@ namespace Speckle.ConnectorUnity.Components return true; } + + public void Awake() + { + Converter = GetComponent(); + Initialise(true); + } + + protected void Initialise(bool forceRefresh = false) + { + Account ??= new AccountSelection(); + Stream ??= new StreamSelection(Account); + Branch ??= new BranchSelection(Stream); + Commit ??= new CommitSelection(Branch); + Stream.Initialise(); + Branch.Initialise(); + Commit.Initialise(); + Commit.OnSelectionChange = () => OnCommitSelectionChange.Invoke(Commit.Selected); + if(Account.Options is not {Length: > 0} || forceRefresh) + Account.RefreshOptions(); + + } + public void OnDestroy() { - cancellationTokenSource?.Cancel(); - cancellationTokenSource?.Dispose(); + CancellationTokenSource?.Cancel(); + CancellationTokenSource?.Dispose(); } public void OnBeforeSerialize() diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta index b92935d..3ece3da 100644 --- a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta +++ b/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta @@ -5,7 +5,7 @@ MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 - icon: {instanceID: 0} + icon: {fileID: 2800000, guid: 4e64a121cf44e1846907649ee8b15dd3, type: 3} userData: assetBundleName: assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs b/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs new file mode 100644 index 0000000..dfcd2f0 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using System.Threading.Tasks; +using Speckle.ConnectorUnity.Wrappers.Selection; +using Speckle.Core.Api; +using Speckle.Core.Credentials; +using Speckle.Core.Kits; +using Speckle.Core.Logging; +using Speckle.Core.Models; +using Speckle.Core.Transports; +using UnityEngine; +using UnityEngine.Events; + +namespace Speckle.ConnectorUnity.Components +{ + [ExecuteAlways] + [AddComponentMenu("Speckle/Speckle Sender")] + [RequireComponent(typeof(RecursiveConverter))] + public class SpeckleSender : MonoBehaviour, ISerializationCallbackReceiver + { + [field: SerializeReference] + public AccountSelection Account { get; private set; } + + [field: SerializeReference] + public StreamSelection Stream { get; private set; } + + [field: SerializeReference] + public BranchSelection Branch { get; private set; } + + public RecursiveConverter Converter { get; private set; } + + [Header("Events")] + [HideInInspector] + public UnityEvent OnBranchSelectionChange; + [HideInInspector] + public UnityEvent OnErrorAction; + [HideInInspector] + public UnityEvent> OnSendProgressAction; +#nullable enable + protected internal CancellationTokenSource? CancellationTokenSource { get; private set; } + + public async Task SendDataAsync(Base data, bool createCommit) + { + CancellationTokenSource?.Cancel(); + CancellationTokenSource?.Dispose(); + CancellationTokenSource = new CancellationTokenSource(); + if(!GetSelection(out Client? client, out Stream? stream, out Branch? branch, out string? error)) + throw new SpeckleException(error); + + ServerTransport transport = new ServerTransport(client.Account, stream.id); + transport.CancellationToken = CancellationTokenSource.Token; + + return await SendDataAsync(transport, + data: data, + client: client, + branchName: branch.name, + createCommit: createCommit, + cancellationToken: CancellationTokenSource.Token, + onProgressAction: dict => OnSendProgressAction.Invoke(dict), + onErrorAction: (m, e) => OnErrorAction.Invoke(m, e) + ); + } + + + public static async Task SendDataAsync(ServerTransport remoteTransport, + Base data, + Client client, + string branchName, + bool createCommit, + CancellationToken cancellationToken, + Action>? onProgressAction = null, + Action? onErrorAction = null) + { + string res = await Operations.Send( + data, + cancellationToken: cancellationToken, + new List{remoteTransport}, + useDefaultCache: true, + disposeTransports: true, + onProgressAction: onProgressAction, + onErrorAction: onErrorAction + ); + + Analytics.TrackEvent(client.Account, Analytics.Events.Send); + + if (createCommit && !cancellationToken.IsCancellationRequested) + { + string streamId = remoteTransport.StreamId; + string commitId = await CreateCommit(data, client, cancellationToken, streamId, branchName, res); + string url = $"{client.ServerUrl}/streams/{streamId}/commits/{commitId}"; + Debug.Log($"Data successfully sent to {url}"); + } + + return res; + } + + public static async Task CreateCommit(Base data, Client client, CancellationToken cancellationToken, string streamId, string branchName, string objectId, string? message = null) + { + long count = data.GetTotalChildrenCount(); + string commitId = await client.CommitCreate(cancellationToken, + new CommitCreateInput + { + streamId = streamId, + branchName = branchName, + objectId = objectId, + message = message ?? $"Sent {count} objects from Unity", + sourceApplication = HostApplications.Unity.Name, + totalChildrenCount = (int)count, + }); + + return commitId; + } + + public bool GetSelection( + [NotNullWhen(true)] out Client? client, + [NotNullWhen(true)] out Stream? stream, + [NotNullWhen(true)] out Branch? branch, + [NotNullWhen(false)] out string? error) + { + Account? account = Account.Selected; + stream = Stream.Selected; + branch = Branch.Selected; + + if (account == null) + { + error = "Selected Account is null"; + client = null; + return false; + } + client = Account.Client ?? new Client(account); + + if (stream == null) + { + error = "Selected Stream is null"; + return false; + } + + if (branch == null) + { + error = "Selected Branch is null"; + return false; + } + error = null; + return true; + } + + + public void Awake() + { + Initialise(true); + Converter = GetComponent(); + } + + protected void Initialise(bool forceRefresh = false) + { + Account ??= new AccountSelection(); + Stream ??= new StreamSelection(Account); + Branch ??= new BranchSelection(Stream); + Stream.Initialise(); + Branch.Initialise(); + Branch.OnSelectionChange = () => OnBranchSelectionChange.Invoke(Branch.Selected); + if(Account.Options is not {Length: > 0} || forceRefresh) + Account.RefreshOptions(); + } + + public void OnDestroy() + { + CancellationTokenSource?.Cancel(); + CancellationTokenSource?.Dispose(); + } + + public void OnBeforeSerialize() + { + //pass + } + public void OnAfterDeserialize() + { + Initialise(); + } + + } +} diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs.meta b/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs.meta new file mode 100644 index 0000000..c376e45 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b95e704835cc48444b81e33c978f6f7f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 165f717696d10fb4e82b83c3d7bc9e7c, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef b/Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef rename to Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef.meta b/Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/Objects.Converter.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs index 6a03e8d..f4f60fe 100644 --- a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs +++ b/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs @@ -30,10 +30,11 @@ namespace Objects.Converter.Unity public virtual List? MeshToSpeckle(MeshFilter meshFilter) { - Material[]? materials = meshFilter.GetComponent()?.materials; #if UNITY_EDITOR + Material[]? materials = meshFilter.GetComponent()?.sharedMaterials; var nativeMesh = meshFilter.sharedMesh; #else + Material[]? materials = meshFilter.GetComponent()?.materials; var nativeMesh = meshFilter.mesh; #endif if (nativeMesh == null) return null; diff --git a/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef b/Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef similarity index 72% rename from Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef rename to Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef index 5097837..89fb098 100644 --- a/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef +++ b/Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef @@ -1,7 +1,9 @@ { - "name": "Factories", + "name": "Speckle.ConnectorUnity.Factories", "rootNamespace": "Speckle.ConnectorUnity", - "references": ["GUID:7383cd71541a2aa48a7baf23f74b4d5f"], + "references": [ + "GUID:7383cd71541a2aa48a7baf23f74b4d5f" + ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, diff --git a/Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef.meta b/Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Factories/Factories.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Gizmos.meta b/Packages/systems.speckle.speckle-unity/Gizmos.meta new file mode 100644 index 0000000..fc68698 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Gizmos.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37a8e1a00bd8afb44b1296830afb15c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/GetObjectValueByKey@128.png b/Packages/systems.speckle.speckle-unity/Gizmos/GetObjectValueByKey@128.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce959c45d114d813e776c7cf2958f26498ce492 GIT binary patch literal 7534 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 O07~-e?`vc&BL4^XFaM$d literal 0 HcmV?d00001 diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/Receiver@128.png.meta b/Packages/systems.speckle.speckle-unity/Gizmos/Receiver@128.png.meta new file mode 100644 index 0000000..f8aa48e --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Gizmos/Receiver@128.png.meta @@ -0,0 +1,159 @@ +fileFormatVersion: 2 +guid: 4e64a121cf44e1846907649ee8b15dd3 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/Sender@128.png b/Packages/systems.speckle.speckle-unity/Gizmos/Sender@128.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa94f25f20b568d0be9c6a36534b79e1c0d75ab GIT binary patch literal 8553 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 P00000NkvXXu0mjfaGVD! literal 0 HcmV?d00001 diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png.meta b/Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png.meta new file mode 100644 index 0000000..0f86406 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png.meta @@ -0,0 +1,159 @@ +fileFormatVersion: 2 +guid: 5dd4c01168f890c49859afd36640b0a9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png b/Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png new file mode 100644 index 0000000000000000000000000000000000000000..25dfaeb382bc9bde659a63969b29358862399339 GIT binary patch literal 8999 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 N002ovPDHLkV1k5Wv zeS5;M0|1fO01FFeqU&jMB^xUXw7xMKtz&@F2S775ER}_{bdhN@z1q&Z>*?v)7~hu! zH>`3wg$Vqcsrd$dgtg^-WMX;5ns&C)94SouXH&xD!Mwm1NvC(9(!!izkdbEy`@skJ`A-f?AIP4ohe_K z64Y$8W<0mBqVOLEWt( zq*|tCd(5jPvd3P$qvM->k^9oSdx2vvs}F7 zl~P{y50(X|TQPP~3T4o`^#uYa$zna&nAPSQ5nQ^JP6K2r`{RnQWoLWJq|B{%6a2_s zlm|s6;kY1Up4S@mIs`Y}4U z?R@9SSoQTUj(Hqb^^Zrzo0~h4?yPto7VQMay)6}q2sx0avNebyrxKz6m;n*wW zLFxl+g-#p7LJb=cqw$6LvA`0|&EN3)io~8BlG*BX>(>YyZ4Q zZ)ys^D8;Z&my!ghOZ<69qEZS>P1MP@T_nK#6s5KO*+W$CJGULi5bvWIP5HWeWbWp( z#_vzZ_zgE*5Y?MpTg&zbjV?M-)#nr#fuL<6l4hIT zW99{8{MU&op9@#8N7swHj7{FjlVwZ&E53vl51VE}6L_Xg!T5Q0sBc(zH(#E-FD*-} zL4IaD%b3Pr5B-+tgvz<8ckN@ENc7nknb|&)H&+V2U8*yZMxJ9agN~$@kA5KYouYpLg^s5(KozwSDoLzBw9!Bt=+g=!6e~@?)6Wm1Vo#Rwv zP8%^Z+5v^_8%78zN3(~tKMMjR2DqDY_pPPrw+8@;bs9~4s6FfNylr>esO%EqitR6rncbA^bp8u zlm5r8HAk7Xz9Eo9y*pQhQgJ7?w1nL1SGj|?@S!n*l_hSf7^{LIXNR3W>J-BsPrvC8 zxbx4dknZYvnn`Mii7qsg9CL%6_#HB>8L#mul(>BFMcH2EuKexA_*yvR_hb>VHV}Uq zwCIB|I5}A2I;?z$O2kR{THY=ajKM=seO#^g~Ll+l=2t7bA2z+_9M@Za2>q%^3$T-khpJO*n zsXGXVHZ9nVErLfPjWdw~G<6pq)QNIK(>c26z1-sfh(SgHsY^G(4vav#{vpW@cu4WY zn~s^9cFNqf>CE$md1+Uq8CiOK+_r0-1h?*KD#Al|&Pz62j-iI7a`f{ER}cWi#|l#~ z!eZ&z1rMd5&{{WSE`NaSL literal 0 HcmV?d00001 diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/logo128.png.meta b/Packages/systems.speckle.speckle-unity/Gizmos/logo128.png.meta new file mode 100644 index 0000000..261265b --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Gizmos/logo128.png.meta @@ -0,0 +1,159 @@ +fileFormatVersion: 2 +guid: ee2ed9d8fff3a1d4db5590491978062e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/EditorCaches.asmdef b/Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef similarity index 60% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor/EditorCaches.asmdef rename to Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef index 2127985..3c6b219 100644 --- a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/EditorCaches.asmdef +++ b/Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef @@ -1,7 +1,9 @@ { - "name": "EditorCaches", - "rootNamespace": "Speckle.ConnectorUnity", - "references": ["GUID:05078f9b6da40444fbd72ec600449925"], + "name": "Speckle.ConnectorUnity.NativeCaches.Editor", + "rootNamespace": "Speckle.ConnectorUnity.NativeCaches", + "references": [ + "GUID:05078f9b6da40444fbd72ec600449925" + ], "includePlatforms": [ "Editor" ], diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/EditorCaches.asmdef.meta b/Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor/EditorCaches.asmdef.meta rename to Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/NativeCaches.asmdef b/Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef similarity index 88% rename from Packages/systems.speckle.speckle-unity/NativeCache/NativeCaches.asmdef rename to Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef index a1c0368..4cc6dc8 100644 --- a/Packages/systems.speckle.speckle-unity/NativeCache/NativeCaches.asmdef +++ b/Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef @@ -1,5 +1,5 @@ { - "name": "NativeCaches", + "name": "Speckle.ConnectorUnity.NativeCache", "rootNamespace": "Speckle.ConnectorUnity", "references": [], "includePlatforms": [], diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/NativeCaches.asmdef.meta b/Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/NativeCaches.asmdef.meta rename to Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef b/Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef similarity index 89% rename from Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef rename to Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef index dc10065..4ba7255 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef +++ b/Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef @@ -1,5 +1,5 @@ { - "name": "Wrappers", + "name": "Speckle.ConnectorUnity.Wrappers", "rootNamespace": "Speckle.ConnectorUnity", "references": [ "GUID:24f666972ea7e9149abddaae766b9c1d" diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef.meta b/Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Wrappers.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta b/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta index 23a8d1b..e2dea90 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta +++ b/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta @@ -5,7 +5,7 @@ MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 - icon: {instanceID: 0} + icon: {fileID: 2800000, guid: fca1a9810bab51c4fbb3028f1ab6e637, type: 3} userData: assetBundleName: assetBundleVariant: From 69c5c62a45fb0e3c1fc77e8b56eb371fa420fa1e Mon Sep 17 00:00:00 2001 From: JR-Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Thu, 10 Nov 2022 17:59:02 +0000 Subject: [PATCH 5/7] Restructured editor assemblies --- Assets/SpecklePlayground.unity | 1766 +---------------- Assets/Tests/Editor/Editor.asmdef | 3 +- Assets/Tests/Editor/PerformanceTest.cs | 31 +- .../Core/SpeckleCore2.pdb | Bin 91584 -> 0 bytes .../Core/SpeckleCore2.pdb.meta | 7 - .../{Components => }/Editor.meta | 2 +- .../Editor.meta => Editor/Components.meta} | 2 +- ...le.ConnectorUnity.Components.Editor.asmdef | 0 ...nnectorUnity.Components.Editor.asmdef.meta | 0 .../Components}/SpeckleReceiverEditor.cs | 6 +- .../Components}/SpeckleReceiverEditor.cs.meta | 0 .../Components}/SpeckleSendEditor.cs | 6 + .../Components}/SpeckleSendEditor.cs.meta | 0 .../Components}/StreamManagerEditor.cs | 0 .../Components}/StreamManagerEditor.cs.meta | 0 .../Editor.meta => Editor/NativeCache.meta} | 2 +- .../NativeCache}/AssetDBNativeCache.cs | 0 .../NativeCache}/AssetDBNativeCache.cs.meta | 0 ....ConnectorUnity.NativeCaches.Editor.asmdef | 0 ...ectorUnity.NativeCaches.Editor.asmdef.meta | 0 .../Editor.meta => Editor/Wrappers.meta} | 2 +- .../Editor/Wrappers/Selection.meta | 8 + .../Selection}/StreamSelectionEditor.cs | 0 .../Selection}/StreamSelectionEditor.cs.meta | 0 ...kle.ConnectorUnity.Wrappers.Editor.asmdef} | 6 +- ...onnectorUnity.Wrappers.Editor.asmdef.meta} | 0 .../Wrappers}/SpecklePropertiesEditor.cs | 0 .../Wrappers}/SpecklePropertiesEditor.cs.meta | 0 .../Objects/Objects.pdb | Bin 141504 -> 0 bytes .../Runtime.meta | 8 + .../{ => Runtime}/Components.meta | 0 .../{ => Runtime}/Components/Receiver.cs | 0 .../{ => Runtime}/Components/Receiver.cs.meta | 0 .../Components/RecursiveConverter.ToNative.cs | 0 .../RecursiveConverter.ToNative.cs.meta | 0 .../RecursiveConverter.ToSpeckle.cs | 0 .../RecursiveConverter.ToSpeckle.cs.meta | 0 .../Components/RecursiveConverter.cs | 0 .../Components/RecursiveConverter.cs.meta | 0 .../{ => Runtime}/Components/Sender.cs | 0 .../{ => Runtime}/Components/Sender.cs.meta | 0 .../Speckle.ConnectorUnity.Components.asmdef | 0 ...ckle.ConnectorUnity.Components.asmdef.meta | 0 .../Components/SpeckleReceiver.cs | 290 +-- .../Components/SpeckleReceiver.cs.meta | 0 .../{ => Runtime}/Components/SpeckleSender.cs | 24 +- .../Components/SpeckleSender.cs.meta | 0 .../{ => Runtime}/Components/StreamManager.cs | 0 .../Components/StreamManager.cs.meta | 0 .../{ => Runtime}/Converter.meta | 0 .../{ => Runtime}/Converter/Unity.meta | 0 .../Converter/Unity/Converter.asmdef | 0 .../Converter/Unity/Converter.asmdef.meta | 0 .../Unity/ConverterUnity.BuiltElements.cs | 0 .../ConverterUnity.BuiltElements.cs.meta | 0 .../Unity/ConverterUnity.Geometry.cs | 0 .../Unity/ConverterUnity.Geometry.cs.meta | 0 .../Converter/Unity/ConverterUnity.Mesh.cs | 0 .../Unity/ConverterUnity.Mesh.cs.meta | 0 .../Converter/Unity/ConverterUnity.Units.cs | 0 .../Unity/ConverterUnity.Units.cs.meta | 0 .../Converter/Unity/ConverterUnity.cs | 0 .../Converter/Unity/ConverterUnity.cs.meta | 0 .../{ => Runtime}/Core.meta | 0 .../GraphQL.Client.Abstractions.Websocket.dll | Bin ...hQL.Client.Abstractions.Websocket.dll.meta | 0 .../Core/GraphQL.Client.Abstractions.dll | Bin .../Core/GraphQL.Client.Abstractions.dll.meta | 0 .../{ => Runtime}/Core/GraphQL.Client.dll | Bin .../Core/GraphQL.Client.dll.meta | 0 .../{ => Runtime}/Core/GraphQL.Primitives.dll | Bin .../Core/GraphQL.Primitives.dll.meta | 0 .../Core/Microsoft.Bcl.AsyncInterfaces.dll | Bin .../Microsoft.Bcl.AsyncInterfaces.dll.meta | 0 .../Core/Microsoft.Data.Sqlite.dll | Bin .../Core/Microsoft.Data.Sqlite.dll.meta | 0 .../Core/SQLitePCLRaw.batteries_v2.dll | Bin .../Core/SQLitePCLRaw.batteries_v2.dll.meta | 0 .../{ => Runtime}/Core/SQLitePCLRaw.core.dll | Bin .../Core/SQLitePCLRaw.core.dll.meta | 0 .../Core/SQLitePCLRaw.provider.e_sqlite3.dll | Bin .../SQLitePCLRaw.provider.e_sqlite3.dll.meta | 0 .../{ => Runtime}/Core/Sentry.dll | Bin .../{ => Runtime}/Core/Sentry.dll.meta | 0 .../Core/Speckle.Newtonsoft.Json.dll | Bin .../Core/Speckle.Newtonsoft.Json.dll.meta | 0 .../{ => Runtime}/Core/SpeckleCore2.deps.json | 0 .../Core/SpeckleCore2.deps.json.meta | 0 .../{ => Runtime}/Core/SpeckleCore2.dll | Bin .../{ => Runtime}/Core/SpeckleCore2.dll.meta | 0 .../{ => Runtime}/Core/SpeckleCore2.xml | 0 .../{ => Runtime}/Core/SpeckleCore2.xml.meta | 0 .../{ => Runtime}/Core/System.Buffers.dll | Bin .../Core/System.Buffers.dll.meta | 0 .../Core/System.Collections.Immutable.dll | Bin .../System.Collections.Immutable.dll.meta | 0 .../{ => Runtime}/Core/System.Memory.dll | Bin .../{ => Runtime}/Core/System.Memory.dll.meta | 0 .../Core/System.Numerics.Vectors.dll | Bin .../Core/System.Numerics.Vectors.dll.meta | 0 .../{ => Runtime}/Core/System.Reactive.dll | Bin .../Core/System.Reactive.dll.meta | 0 .../Core/System.Reflection.Metadata.dll | Bin .../Core/System.Reflection.Metadata.dll.meta | 0 ...System.Runtime.CompilerServices.Unsafe.dll | Bin ...m.Runtime.CompilerServices.Unsafe.dll.meta | 0 .../Core/System.Text.Encodings.Web.dll | Bin .../Core/System.Text.Encodings.Web.dll.meta | 0 .../{ => Runtime}/Core/System.Text.Json.dll | Bin .../Core/System.Text.Json.dll.meta | 0 .../System.Threading.Tasks.Extensions.dll | Bin ...System.Threading.Tasks.Extensions.dll.meta | 0 .../{ => Runtime}/Core/linux-arm.meta | 0 .../{ => Runtime}/Core/linux-arm/native.meta | 0 .../Core/linux-arm/native/libe_sqlite3.so | Bin .../linux-arm/native/libe_sqlite3.so.meta | 0 .../{ => Runtime}/Core/linux-arm64.meta | 0 .../Core/linux-arm64/native.meta | 0 .../Core/linux-arm64/native/libe_sqlite3.so | Bin .../linux-arm64/native/libe_sqlite3.so.meta | 0 .../{ => Runtime}/Core/linux-x64.meta | 0 .../{ => Runtime}/Core/linux-x64/native.meta | 0 .../Core/linux-x64/native/libe_sqlite3.so | Bin .../linux-x64/native/libe_sqlite3.so.meta | 0 .../{ => Runtime}/Core/osx-arm64.meta | 0 .../{ => Runtime}/Core/osx-arm64/native.meta | 0 .../Core/osx-arm64/native/libe_sqlite3.dylib | Bin .../osx-arm64/native/libe_sqlite3.dylib.meta | 0 .../{ => Runtime}/Core/osx-x64.meta | 0 .../{ => Runtime}/Core/osx-x64/native.meta | 0 .../Core/osx-x64/native/libe_sqlite3.dylib | Bin .../osx-x64/native/libe_sqlite3.dylib.meta | 0 .../{ => Runtime}/Core/win-x64.meta | 0 .../{ => Runtime}/Core/win-x64/native.meta | 0 .../Core/win-x64/native/e_sqlite3.dll | Bin .../Core/win-x64/native/e_sqlite3.dll.meta | 0 .../{ => Runtime}/Core/win-x86.meta | 0 .../{ => Runtime}/Core/win-x86/native.meta | 0 .../Core/win-x86/native/e_sqlite3.dll | Bin .../Core/win-x86/native/e_sqlite3.dll.meta | 0 .../{ => Runtime}/Dispatcher.cs | 0 .../{ => Runtime}/Dispatcher.cs.meta | 0 .../{ => Runtime}/Factories.meta | 0 .../Factories/ConverterFactory.cs | 0 .../Factories/ConverterFactory.cs.meta | 0 .../Speckle.ConnectorUnity.Factories.asmdef | 0 ...eckle.ConnectorUnity.Factories.asmdef.meta | 0 .../{ => Runtime}/NativeCache.meta | 0 .../NativeCache/AbstractNativeCache.cs | 0 .../NativeCache/AbstractNativeCache.cs.meta | 0 .../NativeCache/AggregateNativeCache.cs | 0 .../NativeCache/AggregateNativeCache.cs.meta | 0 .../NativeCache/MemoryNativeCache.cs | 0 .../NativeCache/MemoryNativeCache.cs.meta | 0 .../NativeCache/ResourcesNativeCache.cs | 0 .../NativeCache/ResourcesNativeCache.cs.meta | 0 ...Speckle.ConnectorUnity.NativeCaches.asmdef | 0 ...le.ConnectorUnity.NativeCaches.asmdef.meta | 0 .../{ => Runtime}/NativeCacheFactory.cs | 0 .../{ => Runtime}/NativeCacheFactory.cs.meta | 0 .../{ => Runtime}/Objects.meta | 0 .../{ => Runtime}/Objects/Objects.deps.json | 0 .../Objects/Objects.deps.json.meta | 0 .../{ => Runtime}/Objects/Objects.dll | Bin .../{ => Runtime}/Objects/Objects.dll.meta | 0 .../{ => Runtime}/Objects/Objects.xml | 0 .../{ => Runtime}/Objects/Objects.xml.meta | 0 .../{ => Runtime}/Parallel Extensions.meta | 0 .../CoordinationDataStructures.meta | 0 .../ObservableConcurrentDictionary.cs | 0 .../ObservableConcurrentDictionary.cs.meta | 0 .../Runtime/Parallel Extensions/LICENSE.txt | 20 + .../Parallel Extensions/LICENSE.txt.meta} | 4 +- .../ParallelExtensionsExtras.asmdef | 0 .../ParallelExtensionsExtras.asmdef.meta | 0 .../{ => Runtime}/Speckle.Connector.asmdef | 0 .../Speckle.Connector.asmdef.meta | 0 .../{ => Runtime}/Streams.cs | 0 .../{ => Runtime}/Streams.cs.meta | 0 .../{ => Runtime}/Utils.meta | 0 .../{ => Runtime}/Utils/CoreUtils.cs | 0 .../{ => Runtime}/Utils/CoreUtils.cs.meta | 0 .../{ => Runtime}/Utils/ObjectExtensions.cs | 0 .../Utils/ObjectExtensions.cs.meta | 0 .../{ => Runtime}/Utils/Utils.asmdef | 0 .../{ => Runtime}/Utils/Utils.asmdef.meta | 0 .../{ => Runtime}/Utils/Utils.cs | 7 +- .../{ => Runtime}/Utils/Utils.cs.meta | 0 .../{ => Runtime}/Wrappers.meta | 0 .../{ => Runtime}/Wrappers/Selection.meta | 0 .../Wrappers/Selection/AccountSelection.cs | 0 .../Selection/AccountSelection.cs.meta | 0 .../Wrappers/Selection/BranchSelection.cs | 0 .../Selection/BranchSelection.cs.meta | 0 .../Wrappers/Selection/CommitSelection.cs | 0 .../Selection/CommitSelection.cs.meta | 0 .../Wrappers/Selection/OptionSelection.cs | 0 .../Selection/OptionSelection.cs.meta | 0 .../Wrappers/Selection/StreamSelection.cs | 0 .../Selection/StreamSelection.cs.meta | 0 .../Speckle.ConnectorUnity.Wrappers.asmdef | 0 ...peckle.ConnectorUnity.Wrappers.asmdef.meta | 0 .../Wrappers/SpeckleProperties.cs | 0 .../Wrappers/SpeckleProperties.cs.meta | 0 204 files changed, 144 insertions(+), 2050 deletions(-) delete mode 100644 Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb delete mode 100644 Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb.meta rename Packages/systems.speckle.speckle-unity/{Components => }/Editor.meta (77%) rename Packages/systems.speckle.speckle-unity/{NativeCache/Editor.meta => Editor/Components.meta} (77%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/Speckle.ConnectorUnity.Components.Editor.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/Speckle.ConnectorUnity.Components.Editor.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/SpeckleReceiverEditor.cs (96%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/SpeckleReceiverEditor.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/SpeckleSendEditor.cs (94%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/SpeckleSendEditor.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/StreamManagerEditor.cs (100%) rename Packages/systems.speckle.speckle-unity/{Components/Editor => Editor/Components}/StreamManagerEditor.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Editor.meta => Editor/NativeCache.meta} (77%) rename Packages/systems.speckle.speckle-unity/{NativeCache/Editor => Editor/NativeCache}/AssetDBNativeCache.cs (100%) rename Packages/systems.speckle.speckle-unity/{NativeCache/Editor => Editor/NativeCache}/AssetDBNativeCache.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{NativeCache/Editor => Editor/NativeCache}/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{NativeCache/Editor => Editor/NativeCache}/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Selection/Editor.meta => Editor/Wrappers.meta} (77%) create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection.meta rename Packages/systems.speckle.speckle-unity/{Wrappers/Selection/Editor => Editor/Wrappers/Selection}/StreamSelectionEditor.cs (100%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Selection/Editor => Editor/Wrappers/Selection}/StreamSelectionEditor.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Editor/Wrappers.Editor.asmdef => Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef} (72%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Editor/Wrappers.Editor.asmdef.meta => Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef.meta} (100%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Editor => Editor/Wrappers}/SpecklePropertiesEditor.cs (100%) rename Packages/systems.speckle.speckle-unity/{Wrappers/Editor => Editor/Wrappers}/SpecklePropertiesEditor.cs.meta (100%) delete mode 100644 Packages/systems.speckle.speckle-unity/Objects/Objects.pdb create mode 100644 Packages/systems.speckle.speckle-unity/Runtime.meta rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/Receiver.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/Receiver.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/RecursiveConverter.ToNative.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/RecursiveConverter.ToNative.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/RecursiveConverter.ToSpeckle.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/RecursiveConverter.ToSpeckle.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/RecursiveConverter.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/RecursiveConverter.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/Sender.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/Sender.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/Speckle.ConnectorUnity.Components.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/Speckle.ConnectorUnity.Components.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/SpeckleReceiver.cs (51%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/SpeckleReceiver.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/SpeckleSender.cs (88%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/SpeckleSender.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/StreamManager.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Components/StreamManager.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/Converter.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/Converter.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.BuiltElements.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.BuiltElements.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.Geometry.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.Geometry.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.Mesh.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.Mesh.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.Units.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.Units.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Converter/Unity/ConverterUnity.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Client.Abstractions.Websocket.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Client.Abstractions.Websocket.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Client.Abstractions.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Client.Abstractions.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Client.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Client.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Primitives.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/GraphQL.Primitives.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Microsoft.Bcl.AsyncInterfaces.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Microsoft.Bcl.AsyncInterfaces.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Microsoft.Data.Sqlite.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Microsoft.Data.Sqlite.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SQLitePCLRaw.batteries_v2.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SQLitePCLRaw.batteries_v2.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SQLitePCLRaw.core.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SQLitePCLRaw.core.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SQLitePCLRaw.provider.e_sqlite3.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SQLitePCLRaw.provider.e_sqlite3.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Sentry.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Sentry.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Speckle.Newtonsoft.Json.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/Speckle.Newtonsoft.Json.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SpeckleCore2.deps.json (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SpeckleCore2.deps.json.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SpeckleCore2.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SpeckleCore2.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SpeckleCore2.xml (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/SpeckleCore2.xml.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Buffers.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Buffers.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Collections.Immutable.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Collections.Immutable.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Memory.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Memory.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Numerics.Vectors.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Numerics.Vectors.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Reactive.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Reactive.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Reflection.Metadata.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Reflection.Metadata.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Runtime.CompilerServices.Unsafe.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Runtime.CompilerServices.Unsafe.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Text.Encodings.Web.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Text.Encodings.Web.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Text.Json.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Text.Json.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Threading.Tasks.Extensions.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/System.Threading.Tasks.Extensions.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm/native/libe_sqlite3.so (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm/native/libe_sqlite3.so.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm64.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm64/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm64/native/libe_sqlite3.so (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-arm64/native/libe_sqlite3.so.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-x64.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-x64/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-x64/native/libe_sqlite3.so (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/linux-x64/native/libe_sqlite3.so.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-arm64.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-arm64/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-arm64/native/libe_sqlite3.dylib (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-arm64/native/libe_sqlite3.dylib.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-x64.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-x64/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-x64/native/libe_sqlite3.dylib (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/osx-x64/native/libe_sqlite3.dylib.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x64.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x64/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x64/native/e_sqlite3.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x64/native/e_sqlite3.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x86.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x86/native.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x86/native/e_sqlite3.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Core/win-x86/native/e_sqlite3.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Dispatcher.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Dispatcher.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Factories.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Factories/ConverterFactory.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Factories/ConverterFactory.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Factories/Speckle.ConnectorUnity.Factories.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/AbstractNativeCache.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/AbstractNativeCache.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/AggregateNativeCache.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/AggregateNativeCache.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/MemoryNativeCache.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/MemoryNativeCache.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/ResourcesNativeCache.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/ResourcesNativeCache.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCacheFactory.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/NativeCacheFactory.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects/Objects.deps.json (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects/Objects.deps.json.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects/Objects.dll (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects/Objects.dll.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects/Objects.xml (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Objects/Objects.xml.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Parallel Extensions.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Parallel Extensions/CoordinationDataStructures.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt rename Packages/systems.speckle.speckle-unity/{Objects/Objects.pdb.meta => Runtime/Parallel Extensions/LICENSE.txt.meta} (62%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Parallel Extensions/ParallelExtensionsExtras.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Parallel Extensions/ParallelExtensionsExtras.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Speckle.Connector.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Speckle.Connector.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Streams.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Streams.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/CoreUtils.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/CoreUtils.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/ObjectExtensions.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/ObjectExtensions.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/Utils.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/Utils.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/Utils.cs (91%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Utils/Utils.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/AccountSelection.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/AccountSelection.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/BranchSelection.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/BranchSelection.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/CommitSelection.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/CommitSelection.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/OptionSelection.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/OptionSelection.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/StreamSelection.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Selection/StreamSelection.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/SpeckleProperties.cs (100%) rename Packages/systems.speckle.speckle-unity/{ => Runtime}/Wrappers/SpeckleProperties.cs.meta (100%) diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index 2adadc8..6798aad 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -250,170 +250,6 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 ---- !u!43 &16160170 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 3Gon - 1aa08a66f462925aeef377a47267567b - serializedVersion: 10 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 3 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 3 - localAABB: - m_Center: {x: 0, y: 0, z: 0.000000029802322} - m_Extent: {x: 0.86602545, y: 0, z: 0.75} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: [] - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_BonesAABB: [] - m_VariableBoneCountWeights: - m_Data: - m_MeshCompression: 0 - m_IsReadable: 1 - m_KeepVertices: 1 - m_KeepIndices: 1 - m_IndexFormat: 0 - m_IndexBuffer: 000001000200 - m_VertexData: - serializedVersion: 3 - m_VertexCount: 3 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 24 - format: 0 - dimension: 4 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 40 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - m_DataSize: 144 - _typelessdata: d8b35dbf00000000000040bf000000000000803f000000000000803f0000000000000000000080bf000000000000000000000000000000000100403f000000000000803f000000000000803f0000000000000000000080bf0000000000000000d8b35d3f00000000feff3fbf000000000000803f000000000000803f0000000000000000000080bf0000000000000000 - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: 0, y: 0, z: 0.000000029802322} - m_Extent: {x: 0.86602545, y: 0, z: 0.75} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimizationFlags: 1 - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: --- !u!1 &39129898 GameObject: m_ObjectHideFlags: 0 @@ -1013,84 +849,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 160171836} m_CullTransparentMesh: 1 ---- !u!21 &172636256 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Standard (Instance) - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] --- !u!1 &194696812 GameObject: m_ObjectHideFlags: 0 @@ -1218,219 +976,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &239243192 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 239243193} - m_Layer: 0 - m_Name: Base - 73d02b0ceadebc15144becb5d5ffcfa9 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &239243193 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 239243192} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1622342827} - - {fileID: 297156582} - - {fileID: 422634215} - - {fileID: 1525231633} - - {fileID: 680084625} - m_Father: {fileID: 2044880247} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!21 &252696807 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Standard (Instance) - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] ---- !u!1 &297156581 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 297156582} - - component: {fileID: 297156584} - - component: {fileID: 297156583} - - component: {fileID: 297156585} - m_Layer: 0 - m_Name: 4Gon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &297156582 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 297156581} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -7, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 239243193} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &297156583 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 297156581} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 252696807} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &297156584 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 297156581} - m_Mesh: {fileID: 1423796318} ---- !u!114 &297156585 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 297156581} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2cb1817d5a3fda645aa9b1b658ad3003, type: 3} - m_Name: - m_EditorClassIdentifier: - _serializedData: '{"totalChildrenCount":0,"applicationId":null,"speckle_type":"Speckle.ConnectorUnity.Wrappers.SpeckleProperties+SpeckleData","id":"c654a738a88de3616bff9515a0119272"}' - _serializedSpeckleType: Speckle.Core.Models.Base, SpeckleCore2, Version=2.1.0.0, - Culture=neutral, PublicKeyToken=null --- !u!1 &310693430 GameObject: m_ObjectHideFlags: 0 @@ -1526,7 +1071,7 @@ GameObject: m_Layer: 0 m_Name: New Editor Receiver m_TagString: Untagged - m_Icon: {fileID: 0} + m_Icon: {fileID: 2800000, guid: 4e64a121cf44e1846907649ee8b15dd3, type: 3} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 @@ -1554,8 +1099,7 @@ Transform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1691753947} + m_Children: [] m_Father: {fileID: 0} m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1653,7 +1197,7 @@ MonoBehaviour: - rid: 6366722279309049911 type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} data: - selectedIndex: 0 + selectedIndex: 4 k__BackingField: 50 k__BackingField: rid: 6366722279309049910 @@ -1668,7 +1212,7 @@ MonoBehaviour: - rid: 6366722279309049913 type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} data: - selectedIndex: 0 + selectedIndex: 2 k__BackingField: rid: 6366722279309049912 --- !u!1 &407638589 @@ -1747,89 +1291,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 407638589} m_CullTransparentMesh: 1 ---- !u!1 &422634214 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 422634215} - - component: {fileID: 422634217} - - component: {fileID: 422634216} - m_Layer: 0 - m_Name: 3Gon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &422634215 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 422634214} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -4, y: 0, z: 0.24999994} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 239243193} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &422634216 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 422634214} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 172636256} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &422634217 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 422634214} - m_Mesh: {fileID: 16160170} --- !u!1 &448199408 GameObject: m_ObjectHideFlags: 0 @@ -2282,89 +1743,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 641375517} m_CullTransparentMesh: 1 ---- !u!1 &680084624 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 680084625} - - component: {fileID: 680084627} - - component: {fileID: 680084626} - m_Layer: 0 - m_Name: MText_Planar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &680084625 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 680084624} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.7249998, y: 0, z: 0.33650002} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 239243193} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &680084626 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 680084624} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 1455670315} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &680084627 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 680084624} - m_Mesh: {fileID: 1376221775} --- !u!1 &712628247 GameObject: m_ObjectHideFlags: 0 @@ -2643,170 +2021,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: path: Assets/Resources ---- !u!43 &828542546 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 5Gon - 91f68eb00682673ef3a2b713c74bd780 - serializedVersion: 10 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 9 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 5 - localAABB: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 0.9510565, y: 0, z: 0.90450853} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: [] - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_BonesAABB: [] - m_VariableBoneCountWeights: - m_Data: - m_MeshCompression: 0 - m_IsReadable: 1 - m_KeepVertices: 1 - m_KeepIndices: 1 - m_IndexFormat: 0 - m_IndexBuffer: 000001000200010003000200030004000200 - m_VertexData: - serializedVersion: 3 - m_VertexCount: 5 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 24 - format: 0 - dimension: 4 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 40 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - m_DataSize: 240 - _typelessdata: 707873bf000000006ea65a3e000000000000803f000000000000803f0000000000000000000080bf00000000000000000000000000000000df8d673f000000000000803f000000000000803f0000000000000000000080bf0000000000000000107916bf00000000df8d67bf000000000000803f000000000000803f0000000000000000000080bf00000000000000007078733f0000000078a65a3e00000000ffff7f3f000000000000803f0000000000000000000080bf00000000000000002079163f00000000dd8d67bf000000000000803f000000000000803f0000000000000000000080bf0000000000000000 - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 0.9510565, y: 0, z: 0.90450853} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimizationFlags: 1 - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: --- !u!1 &869165413 GameObject: m_ObjectHideFlags: 0 @@ -3035,84 +2249,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!21 &950424089 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Standard (Instance) - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] --- !u!1 &1031574851 GameObject: m_ObjectHideFlags: 0 @@ -3276,84 +2412,6 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_IsOn: 1 ---- !u!21 &1088138830 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Standard (Instance) - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] --- !u!1 &1123579265 GameObject: m_ObjectHideFlags: 0 @@ -3887,170 +2945,6 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 ---- !u!43 &1376221775 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: MText_Planar - fc0be42f5a10575c74e3bcc77a131031 - serializedVersion: 10 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 1542 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 1542 - localAABB: - m_Center: {x: -0.000000059604645, y: 0, z: 0} - m_Extent: {x: 1.2050002, y: 0, z: 0.34550002} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: [] - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_BonesAABB: [] - m_VariableBoneCountWeights: - m_Data: - m_MeshCompression: 0 - m_IsReadable: 1 - m_KeepVertices: 0 - m_KeepIndices: 0 - m_IndexFormat: 0 - m_IndexBuffer: 00000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700180019001a001b001c001d001e001f0020002100220023002400250026002700280029002a002b002c002d002e002f0030003100320033003400350036003700380039003a003b003c003d003e003f0040004100420043004400450046004700480049004a004b004c004d004e004f0050005100520053005400550056005700580059005a005b005c005d005e005f0060006100620063006400650066006700680069006a006b006c006d006e006f0070007100720073007400750076007700780079007a007b007c007d007e007f0080008100820083008400850086008700880089008a008b008c008d008e008f0090009100920093009400950096009700980099009a009b009c009d009e009f00a000a100a200a300a400a500a600a700a800a900aa00ab00ac00ad00ae00af00b000b100b200b300b400b500b600b700b800b900ba00bb00bc00bd00be00bf00c000c100c200c300c400c500c600c700c800c900ca00cb00cc00cd00ce00cf00d000d100d200d300d400d500d600d700d800d900da00db00dc00dd00de00df00e000e100e200e300e400e500e600e700e800e900ea00eb00ec00ed00ee00ef00f000f100f200f300f400f500f600f700f800f900fa00fb00fc00fd00fe00ff0000010101020103010401050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f0120012101220123012401250126012701280129012a012b012c012d012e012f0130013101320133013401350136013701380139013a013b013c013d013e013f0140014101420143014401450146014701480149014a014b014c014d014e014f0150015101520153015401550156015701580159015a015b015c015d015e015f0160016101620163016401650166016701680169016a016b016c016d016e016f0170017101720173017401750176017701780179017a017b017c017d017e017f0180018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01ac01ad01ae01af01b001b101b201b301b401b501b601b701b801b901ba01bb01bc01bd01be01bf01c001c101c201c301c401c501c601c701c801c901ca01cb01cc01cd01ce01cf01d001d101d201d301d401d501d601d701d801d901da01db01dc01dd01de01df01e001e101e201e301e401e501e601e701e801e901ea01eb01ec01ed01ee01ef01f001f101f201f301f401f501f601f701f801f901fa01fb01fc01fd01fe01ff0100020102020203020402050206020702080209020a020b020c020d020e020f0210021102120213021402150216021702180219021a021b021c021d021e021f0220022102220223022402250226022702280229022a022b022c022d022e022f0230023102320233023402350236023702380239023a023b023c023d023e023f0240024102420243024402450246024702480249024a024b024c024d024e024f0250025102520253025402550256025702580259025a025b025c025d025e025f0260026102620263026402650266026702680269026a026b026c026d026e026f0270027102720273027402750276027702780279027a027b027c027d027e027f0280028102820283028402850286028702880289028a028b028c028d028e028f0290029102920293029402950296029702980299029a029b029c029d029e029f02a002a102a202a302a402a502a602a702a802a902aa02ab02ac02ad02ae02af02b002b102b202b302b402b502b602b702b802b902ba02bb02bc02bd02be02bf02c002c102c202c302c402c502c602c702c802c902ca02cb02cc02cd02ce02cf02d002d102d202d302d402d502d602d702d802d902da02db02dc02dd02de02df02e002e102e202e302e402e502e602e702e802e902ea02eb02ec02ed02ee02ef02f002f102f202f302f402f502f602f702f802f902fa02fb02fc02fd02fe02ff0200030103020303030403050306030703080309030a030b030c030d030e030f0310031103120313031403150316031703180319031a031b031c031d031e031f0320032103220323032403250326032703280329032a032b032c032d032e032f0330033103320333033403350336033703380339033a033b033c033d033e033f0340034103420343034403450346034703480349034a034b034c034d034e034f0350035103520353035403550356035703580359035a035b035c035d035e035f0360036103620363036403650366036703680369036a036b036c036d036e036f0370037103720373037403750376037703780379037a037b037c037d037e037f0380038103820383038403850386038703880389038a038b038c038d038e038f0390039103920393039403950396039703980399039a039b039c039d039e039f03a003a103a203a303a403a503a603a703a803a903aa03ab03ac03ad03ae03af03b003b103b203b303b403b503b603b703b803b903ba03bb03bc03bd03be03bf03c003c103c203c303c403c503c603c703c803c903ca03cb03cc03cd03ce03cf03d003d103d203d303d403d503d603d703d803d903da03db03dc03dd03de03df03e003e103e203e303e403e503e603e703e803e903ea03eb03ec03ed03ee03ef03f003f103f203f303f403f503f603f703f803f903fa03fb03fc03fd03fe03ff0300040104020403040404050406040704080409040a040b040c040d040e040f0410041104120413041404150416041704180419041a041b041c041d041e041f0420042104220423042404250426042704280429042a042b042c042d042e042f0430043104320433043404350436043704380439043a043b043c043d043e043f0440044104420443044404450446044704480449044a044b044c044d044e044f0450045104520453045404550456045704580459045a045b045c045d045e045f0460046104620463046404650466046704680469046a046b046c046d046e046f0470047104720473047404750476047704780479047a047b047c047d047e047f0480048104820483048404850486048704880489048a048b048c048d048e048f0490049104920493049404950496049704980499049a049b049c049d049e049f04a004a104a204a304a404a504a604a704a804a904aa04ab04ac04ad04ae04af04b004b104b204b304b404b504b604b704b804b904ba04bb04bc04bd04be04bf04c004c104c204c304c404c504c604c704c804c904ca04cb04cc04cd04ce04cf04d004d104d204d304d404d504d604d704d804d904da04db04dc04dd04de04df04e004e104e204e304e404e504e604e704e804e904ea04eb04ec04ed04ee04ef04f004f104f204f304f404f504f604f704f804f904fa04fb04fc04fd04fe04ff0400050105020503050405050506050705080509050a050b050c050d050e050f0510051105120513051405150516051705180519051a051b051c051d051e051f0520052105220523052405250526052705280529052a052b052c052d052e052f0530053105320533053405350536053705380539053a053b053c053d053e053f0540054105420543054405450546054705480549054a054b054c054d054e054f0550055105520553055405550556055705580559055a055b055c055d055e055f0560056105620563056405650566056705680569056a056b056c056d056e056f0570057105720573057405750576057705780579057a057b057c057d057e057f0580058105820583058405850586058705880589058a058b058c058d058e058f0590059105920593059405950596059705980599059a059b059c059d059e059f05a005a105a205a305a405a505a605a705a805a905aa05ab05ac05ad05ae05af05b005b105b205b305b405b505b605b705b805b905ba05bb05bc05bd05be05bf05c005c105c205c305c405c505c605c705c805c905ca05cb05cc05cd05ce05cf05d005d105d205d305d405d505d605d705d805d905da05db05dc05dd05de05df05e005e105e205e305e405e505e605e705e805e905ea05eb05ec05ed05ee05ef05f005f105f205f305f405f505f605f705f805f905fa05fb05fc05fd05fe05ff05000601060206030604060506 - m_VertexData: - serializedVersion: 3 - m_VertexCount: 1542 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 24 - format: 0 - dimension: 4 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 40 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - m_DataSize: 74016 - _typelessdata: 7f328b3f000000009c68f73d00000000ffff7f3f000000000000803f0000000000000000000080bfd15e423f00000000438b8c3f0000000000d5f83d00000000ffff7f3f000000000000803f0000000000000000000080bf2fa13d3f00000000e9b08d3f00000000041bf83d00000000ffff7f3f000000000000803f0000000000000000000080bf8ee3383f000000007f328b3f000000009c68f73d000000000000803f000000000000803f0000000000000000000080bfd15e423f00000000e9b08d3f00000000041bf83d000000000000803f000000000000803f0000000000000000000080bf8ee3383f0000000063d48e3f00000000d4ebf53d000000000000803f000000000000803f0000000000000000000080bfed25343f0000000041d8893f00000000a813f33d000000000000803f000000000000803f0000000000000000000080bf721c473f000000007f328b3f000000009c68f73d000000000000803f000000000000803f0000000000000000000080bfd15e423f0000000063d48e3f00000000d4ebf53d000000000000803f000000000000803f0000000000000000000080bfed25343f0000000041d8893f00000000a813f33d000000000000803f000000000000803f0000000000000000000080bf721c473f0000000063d48e3f00000000d4ebf53d000000000000803f000000000000803f0000000000000000000080bfed25343f0000000047f68f3f00000000a445f23d000000000000803f000000000000803f0000000000000000000080bf4c682f3f000000006b7c883f0000000078beeb3d00000000ffff7f3f000000000000803f0000000000000000000080bf13da4b3f0000000041d8893f00000000a813f33d00000000ffff7f3f000000000000803f0000000000000000000080bf721c473f0000000047f68f3f00000000a445f23d00000000ffff7f3f000000000000803f0000000000000000000080bf4c682f3f000000006b7c883f0000000078beeb3d000000000000803f000000000000803f0000000000000000000080bf13da4b3f0000000047f68f3f00000000a445f23d000000000000803f000000000000803f0000000000000000000080bf4c682f3f000000002517913f000000009c26ed3d000000000000803f000000000000803f0000000000000000000080bfabaa2a3f000000006b7c883f0000000078beeb3d000000000000803f000000000000803f0000000000000000000080bf13da4b3f000000002517913f000000009c26ed3d000000000000803f000000000000803f0000000000000000000080bfabaa2a3f000000008d37923f00000000f08ce63d000000000000803f000000000000803f0000000000000000000080bf09ed253f00000000df1e873f000000006451e13d000000000000803f000000000000803f0000000000000000000080bfb497503f000000006b7c883f0000000078beeb3d000000000000803f000000000000803f0000000000000000000080bf13da4b3f000000008d37923f00000000f08ce63d000000000000803f000000000000803f0000000000000000000080bf09ed253f00000000df1e873f000000006451e13d000000000000803f000000000000803f0000000000000000000080bfb497503f000000008d37923f00000000f08ce63d000000000000803f000000000000803f0000000000000000000080bf09ed253f000000001358933f00000000c876de3d000000000000803f000000000000803f0000000000000000000080bf682f213f000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c000000001283603f000000006866e63d000000000000803f000000000000803f0000000000000000000080bf0000000000000000c64b773f000000006866e63d000000000000803f000000000000803f0000000000000000000080bf0000803f000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000c64b773f000000006866e63d000000000000803f000000000000803f0000000000000000000080bf0000803f00000000c64b773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bf5f427b3f0000000081bf853f00000000c0b4d33d000000000000803f000000000000803f0000000000000000000080bf5555553f00000000df1e873f000000006451e13d000000000000803f000000000000803f0000000000000000000080bfb497503f000000001358933f00000000c876de3d000000000000803f000000000000803f0000000000000000000080bf682f213f0000000081bf853f00000000c0b4d33d000000000000803f000000000000803f0000000000000000000080bf5555553f000000001358933f00000000c876de3d000000000000803f000000000000803f0000000000000000000080bf682f213f000000004779943f0000000058e2d43d000000000000803f000000000000803f0000000000000000000080bfc7711c3f0000000081bf853f00000000c0b4d33d00000000ffff7f3f000000000000803f0000000000000000000080bf5555553f000000004779943f0000000058e2d43d00000000ffff7f3f000000000000803f0000000000000000000080bfc7711c3f00000000bb9b953f00000000c8cdc93d00000000ffff7f3f000000000000803f0000000000000000000080bf26b4173f00000000355e843f00000000e4d0c23d000000000000803f000000000000803f0000000000000000000080bff7125a3f0000000081bf853f00000000c0b4d33d000000000000803f000000000000803f0000000000000000000080bf5555553f00000000bb9b953f00000000c8cdc93d000000000000803f000000000000803f0000000000000000000080bf26b4173f00000000355e843f00000000e4d0c23d000000000000803f000000000000803f0000000000000000000080bff7125a3f00000000bb9b953f00000000c8cdc93d000000000000803f000000000000803f0000000000000000000080bf26b4173f0000000001c0963f000000004c37bd3d000000000000803f000000000000803f0000000000000000000080bf85f6123f00000000ddfa823f00000000248eae3d00000000ffff7f3f000000000000803f0000000000000000000080bf98d05e3f00000000355e843f00000000e4d0c23d00000000ffff7f3f000000000000803f0000000000000000000080bff7125a3f0000000001c0963f000000004c37bd3d00000000ffff7f3f000000000000803f0000000000000000000080bf85f6123f00000000ddfa823f00000000248eae3d000000000000803f000000000000803f0000000000000000000080bf98d05e3f0000000001c0963f000000004c37bd3d000000000000803f000000000000803f0000000000000000000080bf85f6123f00000000abe6973f000000000c1daf3d000000000000803f000000000000803f0000000000000000000080bfe4380e3f00000000ddfa823f00000000248eae3d000000000000803f000000000000803f0000000000000000000080bf98d05e3f00000000abe6973f000000000c1daf3d000000000000803f000000000000803f0000000000000000000080bfe4380e3f000000004b10993f000000003c7d9f3d000000000000803f000000000000803f0000000000000000000080bf427b093f000000005b95813f00000000d4d4963d000000000000803f000000000000803f0000000000000000000080bf398e633f00000000ddfa823f00000000248eae3d000000000000803f000000000000803f0000000000000000000080bf98d05e3f000000004b10993f000000003c7d9f3d000000000000803f000000000000803f0000000000000000000080bf427b093f000000005b95813f00000000d4d4963d000000000000803f000000000000803f0000000000000000000080bf398e633f000000004b10993f000000003c7d9f3d000000000000803f000000000000803f0000000000000000000080bf427b093f00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f000000005b95813f00000000d4d4963d000000000000803f000000000000803f0000000000000000000080bf398e633f00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f0000000071e88b3f00000000f051083d000000000000803f000000000000803f0000000000000000000080bfabaaaa3e0000000071e88b3f00000000f051083d000000000000803f000000000000803f0000000000000000000080bfabaaaa3e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000f1c78c3f00000000e0e3fc3c000000000000803f000000000000803f0000000000000000000080bfed25b43e00000000f1c78c3f00000000e0e3fc3c000000000000803f000000000000803f0000000000000000000080bfed25b43e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f000000008bb08d3f000000005022e43c000000000000803f000000000000803f0000000000000000000080bf2fa1bd3e000000008bb08d3f000000005022e43c000000000000803f000000000000803f0000000000000000000080bf2fa1bd3e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000bd9f8e3f00000000f0a7c63c000000000000803f000000000000803f0000000000000000000080bf721cc73e00000000bd9f8e3f00000000f0a7c63c000000000000803f000000000000803f0000000000000000000080bf721cc73e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f0000000009938f3f00000000a0bda43c000000000000803f000000000000803f0000000000000000000080bfb497d03e0000000009938f3f00000000a0bda43c000000000000803f000000000000803f0000000000000000000080bfb497d03e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000ed87903f0000000060587d3c000000000000803f000000000000803f0000000000000000000080bff712da3e00000000ed87903f0000000060587d3c000000000000803f000000000000803f0000000000000000000080bff712da3e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000e77b913f00000000e078293c000000000000803f000000000000803f0000000000000000000080bf398ee33e00000000e77b913f00000000e078293c000000000000803f000000000000803f0000000000000000000080bf398ee33e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f00000000776c923f00000000c0dc9c3b000000000000803f000000000000803f0000000000000000000080bf7b09ed3e00000000776c923f00000000c0dc9c3b00000000ffff7f3f000000000000803f0000000000000000000080bf7b09ed3e00000000713d9a3f0000000004568e3d00000000ffff7f3f000000000000803f0000000000000000000080bfa1bd043f000000001d57933f0000000000ac99ba00000000ffff7f3f000000000000803f0000000000000000000080bfbe84f63e000000001d57933f0000000000ac99ba000000000000803f000000000000803f0000000000000000000080bfbe84f63e00000000713d9a3f0000000004568e3d000000000000803f000000000000803f0000000000000000000080bfa1bd043f000000005739943f0000000080c2f5bb000000000000803f000000000000803f0000000000000000000080bf0000003f00000000ce867d3f00000000c03f393d000000000000803f000000000000803f0000000000000000000080bf7b096d3f00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f00000000c54e8a3f00000000e0fd133d000000000000803f000000000000803f0000000000000000000080bf26b4973e00000000c54e8a3f00000000e0fd133d000000000000803f000000000000803f0000000000000000000080bf26b4973e00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f000000008d148b3f00000000b88c0f3d000000000000803f000000000000803f0000000000000000000080bf682fa13e000000008d148b3f00000000b88c0f3d000000000000803f000000000000803f0000000000000000000080bf682fa13e00000000932d803f00000000981a773d000000000000803f000000000000803f0000000000000000000080bfda4b683f0000000071e88b3f00000000f051083d000000000000803f000000000000803f0000000000000000000080bfabaaaa3e0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f00000000ce867d3f00000000c03f393d000000000000803f000000000000803f0000000000000000000080bf7b096d3f000000006daf873f00000000c067103d000000000000803f000000000000803f0000000000000000000080bfa1bd843e000000006daf873f00000000c067103d00000000ffff7f3f000000000000803f0000000000000000000080bfa1bd843e00000000ce867d3f00000000c03f393d00000000ffff7f3f000000000000803f0000000000000000000080bf7b096d3f000000009999893f000000000881153d00000000ffff7f3f000000000000803f0000000000000000000080bfe4388e3e000000009999893f000000000881153d000000000000803f000000000000803f0000000000000000000080bfe4388e3e00000000ce867d3f00000000c03f393d000000000000803f000000000000803f0000000000000000000080bf7b096d3f00000000c54e8a3f00000000e0fd133d000000000000803f000000000000803f0000000000000000000080bf26b4973e0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f000000006daf873f00000000c067103d000000000000803f000000000000803f0000000000000000000080bfa1bd843e00000000fbda853f000000003889013d000000000000803f000000000000803f0000000000000000000080bfbe84763e0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f00000000fbda853f000000003889013d000000000000803f000000000000803f0000000000000000000080bfbe84763e000000004120843f000000007012d33c000000000000803f000000000000803f0000000000000000000080bf398e633e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f0000000076ad7a3f00000000a0d3e73c000000000000803f000000000000803f0000000000000000000080bf1cc7713f000000004120843f000000007012d33c000000000000803f000000000000803f0000000000000000000080bf398e633e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000004120843f000000007012d33c000000000000803f000000000000803f0000000000000000000080bf398e633e000000003983823f000000003017923c000000000000803f000000000000803f0000000000000000000080bfb497503e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000003983823f000000003017923c000000000000803f000000000000803f0000000000000000000080bfb497503e00000000df07813f00000000e0d0023c000000000000803f000000000000803f0000000000000000000080bf2fa13d3e000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000c64b773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bf5f427b3f00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f00000000be75793f00000000385e42bd000000000000803f000000000000803f0000000000000000000080bf398ee33d00000000be75793f00000000385e42bd000000000000803f000000000000803f0000000000000000000080bf398ee33d00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f00000000620f7b3f00000000280601bd000000000000803f000000000000803f0000000000000000000080bfa1bd043e00000000620f7b3f00000000280601bd000000000000803f000000000000803f0000000000000000000080bfa1bd043e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000003e0c7d3f0000000000f189bc000000000000803f000000000000803f0000000000000000000080bf26b4173e000000003e0c7d3f0000000000f189bc000000000000803f000000000000803f0000000000000000000080bf26b4173e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f000000005a647f3f0000000080916dbb000000000000803f000000000000803f0000000000000000000080bfabaa2a3e000000005a647f3f0000000080916dbb000000000000803f000000000000803f0000000000000000000080bfabaa2a3e00000000dace773f00000000e0a51b3c000000000000803f000000000000803f0000000000000000000080bfbe84763f00000000df07813f00000000e0d0023c000000000000803f000000000000803f0000000000000000000080bf2fa13d3e000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000be75793f00000000385e42bd000000000000803f000000000000803f0000000000000000000080bf398ee33d000000004a47783f000000006c2e84bd000000000000803f000000000000803f0000000000000000000080bf2fa1bd3d000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c000000004a47783f000000006c2e84bd000000000000803f000000000000803f0000000000000000000080bf2fa1bd3d00000000fa8b773f000000001c2fa9bd000000000000803f000000000000803f0000000000000000000080bf26b4973d000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000fa8b773f000000001c2fa9bd000000000000803f000000000000803f0000000000000000000080bf26b4973d00000000c64b773f000000003cdfcfbd000000000000803f000000000000803f0000000000000000000080bf398e633d000000001283603f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4973c00000000c64b773f000000003cdfcfbd000000000000803f000000000000803f0000000000000000000080bf398e633d00000000c64b773f00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf26b4173d00000000a6900c3f0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e00000000d6a3103f0000000000d5f83d00000000ffff7f3f000000000000803f0000000000000000000080bf7b015b3e00000000d25a163f0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e00000000b2a8083f00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000a6900c3f0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e00000000d25a163f0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e00000000b2a8083f00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000d25a163f0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e00000000ded11b3f00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e0000000086eb043f00000000bc1ef13d00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3e00000000b2a8083f00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000ded11b3f00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e00000000ac58013f00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e0000000086eb043f00000000bc1ef13d000000000000803f000000000000803f0000000000000000000080bf54c36c3e00000000ded11b3f00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e00000000ac58013f00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000ded11b3f00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e00000000eafc203f0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000064dffb3e00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000ac58013f00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000eafc203f0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000064dffb3e00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000eafc203f0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e00000000e6cf253f00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e000000004460f53e0000000024dbd93d00000000ffff7f3f000000000000803f0000000000000000000080bf2e857e3e0000000064dffb3e00000000bc59e33d00000000ffff7f3f000000000000803f0000000000000000000080bfe599783e00000000e6cf253f00000000bcabd83d00000000ffff7f3f000000000000803f0000000000000000000080bf5954433e000000001033ef3e00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e000000004460f53e0000000024dbd93d000000000000803f000000000000803f0000000000000000000080bf2e857e3e00000000e6cf253f00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e000000001033ef3e00000000b89cce3d00000000ffff7f3f000000000000803f0000000000000000000080bf3b38823e00000000e6cf253f00000000bcabd83d00000000ffff7f3f000000000000803f0000000000000000000080bf5954433e00000000c23e2a3f00000000ac48c63d00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3e00000000dc56e93e00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e000000001033ef3e00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000c23e2a3f00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000dc56e93e00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000c23e2a3f00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e000000006e3d2e3f00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000c4cae33e0000000018d9b23d00000000ffff7f3f000000000000803f0000000000000000000080bf8423883e00000000dc56e93e00000000a49cc13d00000000ffff7f3f000000000000803f0000000000000000000080bfdf2d853e000000006e3d2e3f00000000b49daf3d00000000ffff7f3f000000000000803f0000000000000000000080bfc87d373e00000000dc8dde3e000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e00000000c4cae33e0000000018d9b23d000000000000803f000000000000803f0000000000000000000080bf8423883e000000006e3d2e3f00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000dc8dde3e000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e000000006e3d2e3f00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000dcbf313f00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e000000003c9fd93e000000004c00903d00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3e00000000dc8dde3e000000004050a23d00000000ffff7f3f000000000000803f0000000000000000000080bf28198b3e00000000dcbf313f00000000a098943d00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313e000000003c9fd93e000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000dcbf313f00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000003c9fd93e000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000f0fdd43e00000000088115bd000000000000803f000000000000803f0000000000000000000080bf15fa933e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000007891da3e00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e000000007891da3e00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000009847e03e0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e000000009847e03e0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000a81ce63e00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e00000000a81ce63e00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000080dec3e00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000080dec3e00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000001415f23e00000000e074553c000000000000803f000000000000803f0000000000000000000080bf4ac6a23e000000001415f23e00000000e074553c00000000ffff7f3f000000000000803f0000000000000000000080bf4ac6a23e00000000f0fdd43e00000000d8ce773d00000000ffff7f3f000000000000803f0000000000000000000080bf7004913e000000002431f83e00000000a0c4a03c00000000ffff7f3f000000000000803f0000000000000000000080bfeebba53e000000002431f83e00000000a0c4a03c000000000000803f000000000000803f0000000000000000000080bfeebba53e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000985dfe3e00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e00000000985dfe3e00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000644b023f00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000644b023f00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000008a6c053f00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e000000008a6c053f00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000006a90083f0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e000000006a90083f0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000f0fdd43e00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e000000006a90083f0000000098a7113d00000000ffff7f3f000000000000803f0000000000000000000080bf7f92b13e00000000fcb9343f00000000704e6a3d00000000ffff7f3f000000000000803f0000000000000000000080bf37a72b3e0000000034b50b3f0000000028a0173d00000000ffff7f3f000000000000803f0000000000000000000080bf2488b43e0000000034b50b3f0000000028a0173d000000000000803f000000000000803f0000000000000000000080bf2488b43e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e0000000016d90e3f000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e0000000016d90e3f000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e00000000fcb9343f00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000be1f373f00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000016d90e3f000000009899193d00000000ffff7f3f000000000000803f0000000000000000000080bfc87db73e00000000be1f373f00000000986e223d00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253e00000000f428123f00000000189d173d00000000ffff7f3f000000000000803f0000000000000000000080bf6c73ba3e00000000f428123f00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e00000000be1f373f00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000182f153f00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e00000000f428123f00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000082eb173f00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e00000000182f153f00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000325e1a3f00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e0000000082eb173f00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000028871c3f000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e00000000325e1a3f00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000064661e3f00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e0000000028871c3f000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e0000000064661e3f00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e0000000012e5383f00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000eafd393f00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000e6fb1f3f000000004032453c000000000000803f000000000000803f0000000000000000000080bf4635cc3e0000000064661e3f00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e00000000eafd393f00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000ac47213f0000000080a67d3b00000000ffff7f3f000000000000803f0000000000000000000080bfea2acf3e00000000e6fb1f3f000000004032453c00000000ffff7f3f000000000000803f0000000000000000000080bf4635cc3e00000000eafd393f00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000b849223f00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e00000000ac47213f0000000080a67d3b00000000ffff7f3f000000000000803f0000000000000000000080bfea2acf3e00000000eafd393f00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000b849223f00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e00000000eafd393f00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000365e3a3f000000009016d9bc00000000ffff7f3f000000000000803f0000000000000000000080bf15fa133e000000000a02233f0000000090bd84bc000000000000803f000000000000803f0000000000000000000080bf3216d53e00000000b849223f00000000403fb5bb000000000000803f000000000000803f0000000000000000000080bf8e20d23e00000000365e3a3f000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000a270233f0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e000000000a02233f0000000090bd84bc000000000000803f000000000000803f0000000000000000000080bf3216d53e00000000365e3a3f000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000a270233f0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000365e3a3f000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008095233f00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e00000000a270233f0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008095233f00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e000000008095233f00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000285c0f3f00000000ee7cbfbd00000000ffff7f3f000000000000803f0000000000000000000080bfc3ece03e000000008095233f00000000dc2486bd00000000ffff7f3f000000000000803f0000000000000000000080bf1ff7dd3e000000008095233f00000000fa7eeabd00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f000000008095233f00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000a2b70a3f000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e00000000285c0f3f00000000ee7cbfbd000000000000803f000000000000803f0000000000000000000080bfc3ece03e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000040f063f000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e00000000a2b70a3f000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000c876013f0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e00000000040f063f000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000d406fa3e00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000c876013f0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000d406fa3e00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f0000000018c81e3f0000000008d7f7bd000000000000803f000000000000803f0000000000000000000080bf2e857e3f000000008095233f000000005b647bbe000000000000803f000000000000803f0000000000000000000080bf73ba4a3f000000008095233f00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000d406fa3e00000000b00bfabd00000000ffff7f3f000000000000803f0000000000000000000080bf54c3ec3e0000000018c81e3f0000000008d7f7bd00000000ffff7f3f000000000000803f0000000000000000000080bf2e857e3f00000000bc221a3f0000000020b002be00000000ffff7f3f000000000000803f0000000000000000000080bf5c0a7d3f00000000c892f13e000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000d406fa3e00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000bc221a3f0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000c892f13e000000006c1306be00000000ffff7f3f000000000000803f0000000000000000000080bff9b8ef3e00000000bc221a3f0000000020b002be00000000ffff7f3f000000000000803f0000000000000000000080bf5c0a7d3f000000002cb2153f00000000e3a509be00000000ffff7f3f000000000000803f0000000000000000000080bf8a8f7b3f0000000060bae93e000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e00000000c892f13e000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e000000002cb2153f00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f0000000060bae93e000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e000000002cb2153f00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f000000002483113f0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000094a6e23e00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e0000000060bae93e000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e000000002483113f0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000094a6e23e00000000b9c71bbe00000000ffff7f3f000000000000803f0000000000000000000080bf41a4f53e000000002483113f0000000060e510be00000000ffff7f3f000000000000803f0000000000000000000080bfb7147a3f0000000064a20d3f000000002b8718be00000000ffff7f3f000000000000803f0000000000000000000080bfe599783f0000000094a6e23e00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e0000000064a20d3f000000002b8718be000000000000803f000000000000803f0000000000000000000080bfe599783f00000000aa1c0a3f00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000005880dc3e000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e0000000094a6e23e00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e00000000aa1c0a3f00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000005880dc3e000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e00000000aa1c0a3f00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f00000000b4fe063f00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000005880dc3e000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e00000000b4fe063f00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e00000000b4fe063f00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000004055043f0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000004055043f0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f000000000c2d023f00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000a470d73e0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000000c2d023f00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e000000000c2d023f00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000d892003f00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000d892003f00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f00000000c026ff3e0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000a838d13e0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f000000006ca0d33e00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000c026ff3e0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000a838d13e0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f00000000c026ff3e0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000c876fe3e000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f000000004c62d03e00000000ea2671be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023f00000000a838d13e0000000090a75bbe00000000ffff7f3f000000000000803f0000000000000000000080bf69bd003f00000000c876fe3e000000009cc460be00000000ffff7f3f000000000000803f0000000000000000000080bf263e6e3f000000004c62d03e00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f00000000c876fe3e000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f0000000030bffe3e0000000017ff69be000000000000803f000000000000803f0000000000000000000080bf54c36c3f000000004c62d03e00000000ea2671be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023f0000000030bffe3e0000000017ff69be00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3f000000005893ff3e00000000c5b372be00000000ffff7f3f000000000000803f0000000000000000000080bf82486b3f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f000000004c62d03e00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f000000005893ff3e00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f000000005893ff3e00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f00000000be75003f00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000be75003f00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f00000000f05f013f000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f000000008e09223f00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f000000008095233f000000005b647bbe000000000000803f000000000000803f0000000000000000000080bf73ba4a3f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000c8d8d03e0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000f05f013f000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f000000002678203f000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f000000008e09223f00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000f05f013f000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f000000006284023f000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f0000000048e11e3f00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f000000002678203f000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f00000000365e3a3f000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000d27b493f00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b0000000082c04a3f00000000f85383be000000000000803f000000000000803f0000000000000000000080bf000000000000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000048e11e3f00000000bf9f85be00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3f00000000365e3a3f000000000bd783be00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e0e3e0000000062663a3f0000000071e685be00000000ffff7f3f000000000000803f0000000000000000000080bf8423083e000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f000000006284023f000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f0000000038df033f00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000323e483f00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c00000000d27b493f00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f0000000048e11e3f00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f0000000062663a3f0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f0000000062663a3f0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e00000000b27e3a3f000000000abc87be000000000000803f000000000000803f0000000000000000000080bf3b38023e000000003609473f00000000ee7c88be000000000000803f000000000000803f0000000000000000000080bfcc0e8e3c00000000323e483f00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000008c35d23e00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f0000000038df033f00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f0000000038df033f00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000926c053f0000000022438abe000000000000803f000000000000803f0000000000000000000080bf68e2633f00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000b27e3a3f000000000abc87be000000000000803f000000000000803f0000000000000000000080bf3b38023e00000000eea63a3f000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d000000002aa31b3f00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000f4441d3f0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000eea63a3f000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d000000007ade453f0000000058ed89be000000000000803f000000000000803f0000000000000000000080bf1069bd3c000000003609473f00000000ee7c88be000000000000803f000000000000803f0000000000000000000080bfcc0e8e3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000002aa31b3f00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000eea63a3f000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d00000000dede3a3f00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d00000000eafb193f0000000082958bbe00000000ffff7f3f000000000000803f0000000000000000000080bf609b533f000000002aa31b3f00000000b1d489be00000000ffff7f3f000000000000803f0000000000000000000080bf8e20523f00000000dede3a3f00000000f1c28abe00000000ffff7f3f000000000000803f0000000000000000000080bf54c3ec3d0000000092bf443f0000000086378bbe000000000000803f000000000000803f0000000000000000000080bf54c3ec3c000000007ade453f0000000058ed89be000000000000803f000000000000803f0000000000000000000080bf1069bd3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f00000000926c053f0000000022438abe000000000000803f000000000000803f0000000000000000000080bf68e2633f000000009228073f00000000b47c8cbe000000000000803f000000000000803f0000000000000000000080bf9567623f00000000eafb193f0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f00000000dede3a3f00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d0000000046263b3f00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d0000000016ae433f000000001d5a8cbe000000000000803f000000000000803f0000000000000000000080bfcc0e0e3d0000000092bf443f0000000086378bbe000000000000803f000000000000803f0000000000000000000080bf54c3ec3c0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000eafb193f0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f0000000046263b3f00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f0000000046263b3f00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000ee7c3b3f00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d000000009eab423f00000000be538dbe000000000000803f000000000000803f0000000000000000000080bfeebb253d0000000016ae433f000000001d5a8cbe000000000000803f000000000000803f0000000000000000000080bfcc0e0e3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000986ed43e000000006de78dbe00000000ffff7f3f000000000000803f0000000000000000000080bfb2a8063f000000009228073f00000000b47c8cbe00000000ffff7f3f000000000000803f0000000000000000000080bf9567623f000000005a0f093f0000000096438ebe00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603f00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000ee7c3b3f00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d000000009ae23b3f00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d00000000089d163f0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f00000000344f183f0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f000000009ae23b3f00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d00000000c2b9413f000000000c238ebe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3d000000009eab423f00000000be538dbe00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253d0000000082c04a3f00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000089d163f0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f000000009ae23b3f00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d0000000012573c3f00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000986ed43e000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000005a0f093f0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f000000001ada403f00000000a8c68ebe000000000000803f000000000000803f0000000000000000000080bf3216553d00000000c2b9413f000000000c238ebe000000000000803f000000000000803f0000000000000000000080bf10693d3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000005a0f093f0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f000000000c1d0b3f00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f0000000066e5143f0000000005568fbe00000000ffff7f3f000000000000803f0000000000000000000080bfd70b583f00000000089d163f0000000072588ebe00000000ffff7f3f000000000000803f0000000000000000000080bf0491563f0000000012573c3f00000000487f8ebe00000000ffff7f3f000000000000803f0000000000000000000080bf1069bd3d0000000066e5143f0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000012573c3f00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d000000001ada3c3f0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d000000003e0e403f00000000373d8fbe000000000000803f000000000000803f0000000000000000000080bf54c36c3d000000001ada403f00000000a8c68ebe000000000000803f000000000000803f0000000000000000000080bf3216553d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000066e5143f0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f000000001ada3c3f0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d000000007a6b3d3f0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000c6573f3f000000005a858fbe000000000000803f000000000000803f0000000000000000000080bf3b38823d000000003e0e403f00000000373d8fbe000000000000803f000000000000803f0000000000000000000080bf54c36c3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000066e5143f0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f000000007a6b3d3f0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f000000007a6b3d3f0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000f60a3e3f00000000ef8c8fbe000000000000803f000000000000803f0000000000000000000080bf5de5993d0000000052b83e3f00000000b39d8fbe00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3d00000000c6573f3f000000005a858fbe00000000ffff7f3f000000000000803f0000000000000000000080bf3b38823d0000000082c04a3f00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f00000000f60a3e3f00000000ef8c8fbe000000000000803f000000000000803f0000000000000000000080bf5de5993d0000000052b83e3f00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000000c1d0b3f00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f00000000c84d0d3f00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000052b83e3f00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000c065113f00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f000000004e28133f00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000c84d0d3f00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000c065113f00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000b29d0f3f00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000704ddb3e000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000e479d73e000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000704ddb3e000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f0000000054d2203f0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f00000000f8e8233f00000000cb3f9dbe000000000000803f000000000000803f0000000000000000000080bfc036273f00000000f653233f00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000038dfdf3e000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f00000000704ddb3e000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f0000000054d2203f0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f0000000038dfdf3e000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f0000000054d2203f0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f00000000b24b1e3f000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f000000009ea2243f000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f00000000f8e8233f00000000cb3f9dbe000000000000803f000000000000803f0000000000000000000080bfc036273f0000000082c04a3f00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000009ea2243f000000000ac7a0be00000000ffff7f3f000000000000803f0000000000000000000080bf92b1283f0000000082c04a3f00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f000000003640483f000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f0000000038dfdf3e000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f00000000b24b1e3f000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f00000000b24b1e3f000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f0000000082c01b3f0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f000000000a82253f000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f000000009ea2243f000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f000000003640483f000000008c3ba2be000000000000803f000000000000803f0000000000000000000080bfcfc4473f000000000a82253f000000009eefa3be00000000ffff7f3f000000000000803f0000000000000000000080bf652c2a3f000000003640483f000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f000000007af9453f000000007a1aa5be00000000ffff7f3f000000000000803f0000000000000000000080bffd49463f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f0000000082c01b3f0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f000000003a31193f000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000006088263f000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f000000000a82253f000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f000000007af9453f000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f000000007415eb3e00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000003c25e53e00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f000000003a31193f000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000006088263f000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f000000007af9453f000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f000000005ae4433f00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f000000007415eb3e00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000003a31193f000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000004e9e163f0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000c2b6273f00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f000000006088263f000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f000000005ae4433f00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f00000000c2b6273f00000000132ca9be00000000ffff7f3f000000000000803f0000000000000000000080bf09222d3f000000005ae4433f00000000a79ba7be00000000ffff7f3f000000000000803f0000000000000000000080bf2bcf443f00000000def8413f0000000014c4a9be00000000ffff7f3f000000000000803f0000000000000000000080bf5954433f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000007415eb3e00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000004e9e163f0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000004e9e163f0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f000000003208143f000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f00000000540e293f000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f00000000c2b6273f00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f00000000def8413f0000000014c4a9be000000000000803f000000000000803f0000000000000000000080bf5954433f00000000540e293f000000009643abbe00000000ffff7f3f000000000000803f0000000000000000000080bfdb9c2e3f00000000def8413f0000000014c4a9be00000000ffff7f3f000000000000803f0000000000000000000080bf5954433f00000000122f403f00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000003208143f000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f000000005a6f113f00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000003a902a3f00000000b803adbe00000000ffff7f3f000000000000803f0000000000000000000080bfad17303f00000000540e293f000000009643abbe00000000ffff7f3f000000000000803f0000000000000000000080bfdb9c2e3f00000000122f403f00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f000000003a902a3f00000000b803adbe00000000ffff7f3f000000000000803f0000000000000000000080bfad17303f00000000122f403f00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f00000000fa7e3e3f00000000b91eadbe00000000ffff7f3f000000000000803f0000000000000000000080bfb55e403f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f00000000e0a5f13e00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000005a6f113f00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000005a6f113f00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000003cd40e3f000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f00000000963d2c3f000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f000000003a902a3f00000000b803adbe000000000000803f000000000000803f0000000000000000000080bfad17303f00000000fa7e3e3f00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000963d2c3f000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f00000000fa7e3e3f00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000a2e03c3f00000000f35aaebe000000000000803f000000000000803f0000000000000000000080bfe2e33e3f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000003cd40e3f000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f000000004c370c3f00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000963d2c3f000000004b6eaebe00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313f00000000a2e03c3f00000000f35aaebe00000000ffff7f3f000000000000803f0000000000000000000080bfe2e33e3f00000000124c3b3f000000007452afbe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3f000000008c172e3f000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000963d2c3f000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f00000000124c3b3f000000007452afbe000000000000803f000000000000803f0000000000000000000080bf10693d3f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f000000007cccf83e0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000004c370c3f00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f000000008c172e3f000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000124c3b3f000000007452afbe000000000000803f000000000000803f0000000000000000000080bf10693d3f0000000056b9393f000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f000000004c370c3f00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000fe98093f00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f00000000401f303f00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f000000008c172e3f000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f0000000056b9393f000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f00000000401f303f00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f0000000056b9393f000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f000000007620383f000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f00000000fe98093f00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f00000000c8f9063f0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f00000000d455323f00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f00000000401f303f00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f000000007620383f000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f000000001c5a043f0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bf15fa133f00000000a23f003f00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f00000000c8f9063f0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f00000000d455323f00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f000000007620383f000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f000000007a79363f00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f000000006abc343f0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bfc87d373f00000000d455323f00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f000000007a79363f00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f00000000a8371e3e0000000010c6f73d000000000000803f000000000000803f0000000000000000000080bf9224493f0000000008022b3e0000000000d5f83d000000000000803f000000000000803f0000000000000000000080bf4992443f000000000060403e000000006059f63d000000000000803f000000000000803f0000000000000000000080bf0000403f00000000d87b113e00000000bca1f43d000000000000803f000000000000803f0000000000000000000080bfdbb64d3f00000000a8371e3e0000000010c6f73d000000000000803f000000000000803f0000000000000000000080bf9224493f000000000060403e000000006059f63d000000000000803f000000000000803f0000000000000000000080bf0000403f00000000d87b113e00000000bca1f43d000000000000803f000000000000803f0000000000000000000080bfdbb64d3f000000000060403e000000006059f63d000000000000803f000000000000803f0000000000000000000080bf0000403f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f0000000028dd043e00000000c074ef3d000000000000803f000000000000803f0000000000000000000080bf2549523f00000000d87b113e00000000bca1f43d000000000000803f000000000000803f0000000000000000000080bfdbb64d3f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f0000000050d4f03d00000000dc4be83d000000000000803f000000000000803f0000000000000000000080bf6edb563f0000000028dd043e00000000c074ef3d000000000000803f000000000000803f0000000000000000000080bf2549523f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f0000000050d4f03d00000000dc4be83d000000000000803f000000000000803f0000000000000000000080bf6edb563f00000000e0d5543e00000000f4ddee3d000000000000803f000000000000803f0000000000000000000080bfb76d3b3f000000003835683e000000000456e23d000000000000803f000000000000803f0000000000000000000080bf6edb363f00000000d062d83d00000000d033df3d000000000000803f000000000000803f0000000000000000000080bfb76d5b3f0000000050d4f03d00000000dc4be83d000000000000803f000000000000803f0000000000000000000080bf6edb563f000000003835683e000000000456e23d000000000000803f000000000000803f0000000000000000000080bf6edb363f0000000080916dbd00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf2549123d0000000080916dbd000000006866e63d000000000000803f000000000000803f0000000000000000000080bf2549923c0000000080f3fd3c000000006866e63d000000000000803f000000000000803f0000000000000000000080bf000000000000000080916dbd00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf2549123d0000000080f3fd3c000000006866e63d00000000ffff7f3f000000000000803f0000000000000000000080bf000000000000000080f3fd3c00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000d062d83d00000000d033df3d000000000000803f000000000000803f0000000000000000000080bfb76d5b3f000000003835683e000000000456e23d000000000000803f000000000000803f0000000000000000000080bf6edb363f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f000000000083c03d000000005839d43d000000000000803f000000000000803f0000000000000000000080bf0000603f00000000d062d83d00000000d033df3d000000000000803f000000000000803f0000000000000000000080bfb76d5b3f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f00000000f051a93d000000003469c73d000000000000803f000000000000803f0000000000000000000080bf4992643f000000000083c03d000000005839d43d000000000000803f000000000000803f0000000000000000000080bf0000603f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f00000000f051a93d000000003469c73d000000000000803f000000000000803f0000000000000000000080bf4992643f00000000a04f7a3e00000000d4b4d03d000000000000803f000000000000803f0000000000000000000080bf2549323f00000000547b853e00000000a4edb93d000000000000803f000000000000803f0000000000000000000080bfdbb62d3f00000000c0ec923d0000000024d0b83d000000000000803f000000000000803f0000000000000000000080bf9224693f00000000f051a93d000000003469c73d000000000000803f000000000000803f0000000000000000000080bf4992643f00000000547b853e00000000a4edb93d000000000000803f000000000000803f0000000000000000000080bfdbb62d3f00000000c0ec923d0000000024d0b83d000000000000803f000000000000803f0000000000000000000080bf9224693f00000000547b853e00000000a4edb93d000000000000803f000000000000803f0000000000000000000080bfdbb62d3f00000000f0fd8c3e00000000b4f39d3d000000000000803f000000000000803f0000000000000000000080bf9224293f0000000020e17a3d00000000e07aa83d00000000ffff7f3f000000000000803f0000000000000000000080bfdbb66d3f00000000c0ec923d0000000024d0b83d00000000ffff7f3f000000000000803f0000000000000000000080bf9224693f00000000f0fd8c3e00000000b4f39d3d00000000ffff7f3f000000000000803f0000000000000000000080bf9224293f0000000000f5513d000000002c76963d000000000000803f000000000000803f0000000000000000000080bf2549723f0000000020e17a3d00000000e07aa83d000000000000803f000000000000803f0000000000000000000080bfdbb66d3f00000000f0fd8c3e00000000b4f39d3d000000000000803f000000000000803f0000000000000000000080bf9224293f0000000000f5513d000000002c76963d000000000000803f000000000000803f0000000000000000000080bf2549723f00000000f0fd8c3e00000000b4f39d3d000000000000803f000000000000803f0000000000000000000080bf9224293f000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000804f2b3d00000000c4ce823d000000000000803f000000000000803f0000000000000000000080bf6edb763f0000000000f5513d000000002c76963d000000000000803f000000000000803f0000000000000000000080bf2549723f000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000804f2b3d00000000c4ce823d000000000000803f000000000000803f0000000000000000000080bf6edb763f000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f000000007498933e000000009074793d00000000ffff7f3f000000000000803f0000000000000000000080bf4992243f00000000986e123e0000000018d94e3d00000000ffff7f3f000000000000803f0000000000000000000080bf2549923e00000000986e123e0000000018d94e3d000000000000803f000000000000803f0000000000000000000080bf2549923e000000007498933e000000009074793d000000000000803f000000000000803f0000000000000000000080bf4992243f00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f0000000080916dbd00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf2549123d0000000080f3fd3c00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f0000000080916dbd00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf2549123d00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f0000000080f3fd3c0000000060916dbc000000000000803f000000000000803f0000000000000000000080bf2549923d0000000080f3fd3c0000000060916dbc00000000ffff7f3f000000000000803f0000000000000000000080bf2549923d00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f000000000017293d0000000080665bbb00000000ffff7f3f000000000000803f0000000000000000000080bf6edbb63d000000000017293d0000000080665bbb000000000000803f000000000000803f0000000000000000000080bf6edbb63d00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000e098513d000000004064d93b000000000000803f000000000000803f0000000000000000000080bfb76ddb3d00000000e098513d000000004064d93b000000000000803f000000000000803f0000000000000000000080bfb76ddb3d00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f0000000080c4783d0000000040b27d3c000000000000803f000000000000803f0000000000000000000080bf0000003e0000000080c4783d0000000040b27d3c000000000000803f000000000000803f0000000000000000000080bf0000003e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000806f8f3d000000006063be3c000000000000803f000000000000803f0000000000000000000080bf2549123e00000000806f8f3d000000006063be3c000000000000803f000000000000803f0000000000000000000080bf2549123e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000d016a23d000000000048f53c000000000000803f000000000000803f0000000000000000000080bf4992243e00000000d016a23d000000000048f53c000000000000803f000000000000803f0000000000000000000080bf4992243e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000d07ab43d0000000088eb113d000000000000803f000000000000803f0000000000000000000080bf6edb363e00000000d07ab43d0000000088eb113d000000000000803f000000000000803f0000000000000000000080bf6edb363e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f0000000000bec63d000000005830253d000000000000803f000000000000803f0000000000000000000080bf9224493e0000000000bec63d000000005830253d000000000000803f000000000000803f0000000000000000000080bf9224493e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f000000000003d93d00000000789a343d000000000000803f000000000000803f0000000000000000000080bfb76d5b3e000000000003d93d00000000789a343d000000000000803f000000000000803f0000000000000000000080bfb76d5b3e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000706ceb3d00000000f851403d000000000000803f000000000000803f0000000000000000000080bfdbb66d3e00000000706ceb3d00000000f851403d000000000000803f000000000000803f0000000000000000000080bfdbb66d3e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000e01cfe3d00000000e07e483d000000000000803f000000000000803f0000000000000000000080bf0000803e00000000e01cfe3d00000000e07e483d00000000ffff7f3f000000000000803f0000000000000000000080bf0000803e00000000e02a073d00000000d0225b3d00000000ffff7f3f000000000000803f0000000000000000000080bfb76d7b3f00000000709b083e0000000040494d3d00000000ffff7f3f000000000000803f0000000000000000000080bf9224893e00000000709b083e0000000040494d3d000000000000803f000000000000803f0000000000000000000080bf9224893e00000000e02a073d00000000d0225b3d000000000000803f000000000000803f0000000000000000000080bfb76d7b3f00000000986e123e0000000018d94e3d000000000000803f000000000000803f0000000000000000000080bf2549923e0000000030d21f3e00000000e0394b3d000000000000803f000000000000803f0000000000000000000080bfb76d9b3e00000000986e123e0000000018d94e3d000000000000803f000000000000803f0000000000000000000080bf2549923e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f00000000984e2c3e00000000c88c403d000000000000803f000000000000803f0000000000000000000080bf4992a43e0000000030d21f3e00000000e0394b3d000000000000803f000000000000803f0000000000000000000080bfb76d9b3e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f0000000010d7373e00000000a01a2f3d000000000000803f000000000000803f0000000000000000000080bfdbb6ad3e00000000984e2c3e00000000c88c403d000000000000803f000000000000803f0000000000000000000080bf4992a43e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f00000000d85e423e00000000382c173d000000000000803f000000000000803f0000000000000000000080bf6edbb63e0000000010d7373e00000000a01a2f3d000000000000803f000000000000803f0000000000000000000080bfdbb6ad3e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f00000000d85e423e00000000382c173d000000000000803f000000000000803f0000000000000000000080bf6edbb63e00000000a433993e0000000040692c3d000000000000803f000000000000803f0000000000000000000080bf0000203f0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f0000000030d94b3e00000000c014f23c000000000000803f000000000000803f0000000000000000000080bf0000c03e00000000d85e423e00000000382c173d000000000000803f000000000000803f0000000000000000000080bf6edbb63e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f000000006039543e00000000e0fba93c000000000000803f000000000000803f0000000000000000000080bf9224c93e0000000030d94b3e00000000c014f23c000000000000803f000000000000803f0000000000000000000080bf0000c03e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f00000000a8725b3e00000000e03e2d3c000000000000803f000000000000803f0000000000000000000080bf2549d23e000000006039543e00000000e0fba93c000000000000803f000000000000803f0000000000000000000080bf9224c93e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f00000000a8725b3e00000000e03e2d3c000000000000803f000000000000803f0000000000000000000080bf2549d23e0000000050b89d3e000000000058a93c000000000000803f000000000000803f0000000000000000000080bfb76d1b3f000000003c0fa13e0000000000cb5dbb000000000000803f000000000000803f0000000000000000000080bf6edb163f000000004878613e0000000000e06dba00000000ffff7f3f000000000000803f0000000000000000000080bfb76ddb3e00000000a8725b3e00000000e03e2d3c00000000ffff7f3f000000000000803f0000000000000000000080bf2549d23e000000003c0fa13e0000000000cb5dbb00000000ffff7f3f000000000000803f0000000000000000000080bf6edb163f00000000803d663e00000000803b5fbc000000000000803f000000000000803f0000000000000000000080bf4992e43e000000004878613e0000000000e06dba000000000000803f000000000000803f0000000000000000000080bfb76ddb3e000000003c0fa13e0000000000cb5dbb000000000000803f000000000000803f0000000000000000000080bf6edb163f00000000803d663e00000000803b5fbc000000000000803f000000000000803f0000000000000000000080bf4992e43e000000003c0fa13e0000000000cb5dbb000000000000803f000000000000803f0000000000000000000080bf6edb163f000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f0000000090b5693e00000000205be1bc000000000000803f000000000000803f0000000000000000000080bfdbb6ed3e00000000803d663e00000000803b5fbc000000000000803f000000000000803f0000000000000000000080bf4992e43e000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f0000000080916dbd00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf2549123d0000000080f3fd3c0000000060916dbc000000000000803f000000000000803f0000000000000000000080bf2549923d0000000080f3fd3c00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bfb76d5b3d00000000c0d36b3e00000000c80a2ebd000000000000803f000000000000803f0000000000000000000080bf6edbf63e0000000090b5693e00000000205be1bc000000000000803f000000000000803f0000000000000000000080bfdbb6ed3e000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f00000000c0d36b3e00000000c80a2ebd000000000000803f000000000000803f0000000000000000000080bf6edbf63e000000003821a33e000000009094f6bc000000000000803f000000000000803f0000000000000000000080bf2549123f0000000008d7a33e0000000048b673bd000000000000803f000000000000803f0000000000000000000080bfdbb60d3f00000000408b6c3e00000000b09d6fbd000000000000803f000000000000803f0000000000000000000080bf0000003f00000000c0d36b3e00000000c80a2ebd000000000000803f000000000000803f0000000000000000000080bf6edbf63e0000000008d7a33e0000000048b673bd000000000000803f000000000000803f0000000000000000000080bfdbb60d3f00000000408b6c3e00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf4992043f00000000408b6c3e00000000b09d6fbd00000000ffff7f3f000000000000803f0000000000000000000080bf0000003f0000000008d7a33e0000000048b673bd00000000ffff7f3f000000000000803f0000000000000000000080bfdbb60d3f00000000408b6c3e00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf4992043f0000000008d7a33e0000000048b673bd000000000000803f000000000000803f0000000000000000000080bfdbb60d3f0000000008d7a33e00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf9224093f00000000747ec1be0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e000000001458b9be0000000000d5f83d00000000ffff7f3f000000000000803f0000000000000000000080bf7b015b3e000000001ceaadbe0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e000000005c4ec9be00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e00000000747ec1be0000000040faf73d00000000ffff7f3f000000000000803f0000000000000000000080bfc3ec603e000000001ceaadbe0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e000000005c4ec9be00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e000000001ceaadbe0000000084dbf63d00000000ffff7f3f000000000000803f0000000000000000000080bf3216553e0000000004fca2be00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e00000000b8c8d0be00000000bc1ef13d00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3e000000005c4ec9be00000000c468f53d00000000ffff7f3f000000000000803f0000000000000000000080bf0cd8663e0000000004fca2be00000000f4e2f03d00000000ffff7f3f000000000000803f0000000000000000000080bfea2a4f3e000000006ceed7be00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000b8c8d0be00000000bc1ef13d000000000000803f000000000000803f0000000000000000000080bf54c36c3e0000000004fca2be00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e000000006ceed7be00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e0000000004fca2be00000000f4e2f03d000000000000803f000000000000803f0000000000000000000080bfea2a4f3e00000000eca598be0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000060c0debe00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e000000006ceed7be00000000541aeb3d000000000000803f000000000000803f0000000000000000000080bf9dae723e00000000eca598be0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e0000000060c0debe00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000eca598be0000000018d9e63d000000000000803f000000000000803f0000000000000000000080bfa13f493e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000803fe5be0000000024dbd93d000000000000803f000000000000803f0000000000000000000080bf2e857e3e0000000060c0debe00000000bc59e33d000000000000803f000000000000803f0000000000000000000080bfe599783e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000b46cebbe00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000803fe5be0000000024dbd93d000000000000803f000000000000803f0000000000000000000080bf2e857e3e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000b46cebbe00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000f4ff8ebe00000000bcabd83d000000000000803f000000000000803f0000000000000000000080bf5954433e00000000402286be00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000e848f1be00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000b46cebbe00000000b89cce3d000000000000803f000000000000803f0000000000000000000080bf3b38823e00000000402286be00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000e848f1be00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000402286be00000000ac48c63d000000000000803f000000000000803f0000000000000000000080bf10693d3e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e0000000004d5f6be0000000018d9b23d000000000000803f000000000000803f0000000000000000000080bf8423883e00000000e848f1be00000000a49cc13d000000000000803f000000000000803f0000000000000000000080bfdf2d853e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000ec11fcbe000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e0000000004d5f6be0000000018d9b23d000000000000803f000000000000803f0000000000000000000080bf8423883e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e00000000ec11fcbe000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e00000000d0497cbe00000000b49daf3d000000000000803f000000000000803f0000000000000000000080bfc87d373e0000000018406ebe00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000468000bf000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000ec11fcbe000000004050a23d000000000000803f000000000000803f0000000000000000000080bf28198b3e0000000018406ebe00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000468000bf000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e0000000018406ebe00000000a098943d000000000000803f000000000000803f0000000000000000000080bf7f92313e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000468000bf000000004c00903d000000000000803f000000000000803f0000000000000000000080bfcc0e8e3e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000e6d002bf00000000088115bd000000000000803f000000000000803f0000000000000000000080bf15fa933e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000220700bf00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e00000000220700bf00000000a050c7bc000000000000803f000000000000803f0000000000000000000080bfb9ef963e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000002858fabe0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e000000002858fabe0000000000135abc000000000000803f000000000000803f0000000000000000000080bf5de5993e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000001483f4be00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e000000001483f4be00000000804160bb000000000000803f000000000000803f0000000000000000000080bf01db9c3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000b492eebe00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000b492eebe00000000805eaf3b000000000000803f000000000000803f0000000000000000000080bfa6d09f3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000ac8ae8be00000000e074553c000000000000803f000000000000803f0000000000000000000080bf4ac6a23e00000000ac8ae8be00000000e074553c000000000000803f000000000000803f0000000000000000000080bf4ac6a23e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000009c6ee2be00000000a0c4a03c000000000000803f000000000000803f0000000000000000000080bfeebba53e000000009c6ee2be00000000a0c4a03c000000000000803f000000000000803f0000000000000000000080bfeebba53e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e000000002c42dcbe00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e000000002c42dcbe00000000901ace3c000000000000803f000000000000803f0000000000000000000080bf92b1a83e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000f808d6be00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000f808d6be00000000b0e0f23c000000000000803f000000000000803f0000000000000000000080bf37a7ab3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000acc6cfbe00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e00000000acc6cfbe00000000b89d073d000000000000803f000000000000803f0000000000000000000080bfdb9cae3e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000ec7ec9be0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000ec7ec9be0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000e6d002bf00000000d8ce773d000000000000803f000000000000803f0000000000000000000080bf7004913e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e00000000ec7ec9be0000000098a7113d000000000000803f000000000000803f0000000000000000000080bf7f92b13e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e000000005435c3be0000000028a0173d000000000000803f000000000000803f0000000000000000000080bf2488b43e000000005435c3be0000000028a0173d000000000000803f000000000000803f0000000000000000000080bf2488b43e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e0000000094edbcbe000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e0000000094edbcbe000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e00000000985762be00000000704e6a3d000000000000803f000000000000803f0000000000000000000080bf37a72b3e0000000090c058be00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000094edbcbe000000009899193d000000000000803f000000000000803f0000000000000000000080bfc87db73e0000000090c058be00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e00000000d84db6be00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e00000000d84db6be00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e0000000090c058be00000000986e223d000000000000803f000000000000803f0000000000000000000080bfeebb253e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e000000008c41b0be00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e00000000d84db6be00000000189d173d000000000000803f000000000000803f0000000000000000000080bf6c73ba3e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000bcc8aabe00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e000000008c41b0be00000000488f113d000000000000803f000000000000803f0000000000000000000080bf1069bd3e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e000000005ce3a5be00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e00000000bcc8aabe00000000c84b073d000000000000803f000000000000803f0000000000000000000080bfb55ec03e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e000000006c91a1be000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e000000005ce3a5be00000000505cf13c000000000000803f000000000000803f0000000000000000000080bf5954c33e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000f8d29dbe00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e000000006c91a1be000000001024cb3c000000000000803f000000000000803f0000000000000000000080bffd49c63e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000f8d29dbe00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e0000000040ab51be00000000a0daa23c000000000000803f000000000000803f0000000000000000000080bfa6d01f3e00000000e0474dbe00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000f4a79abe000000004032453c000000000000803f000000000000803f0000000000000000000080bf4635cc3e00000000f8d29dbe00000000f0a59b3c000000000000803f000000000000803f0000000000000000000080bfa13fc93e00000000e0474dbe00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e000000006c1098be0000000080a67d3b000000000000803f000000000000803f0000000000000000000080bfea2acf3e00000000f4a79abe000000004032453c000000000000803f000000000000803f0000000000000000000080bf4635cc3e00000000e0474dbe00000000809d0dbb000000000000803f000000000000803f0000000000000000000080bf5de5193e00000000540c96be00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e000000006c1098be0000000080a67d3b00000000ffff7f3f000000000000803f0000000000000000000080bfea2acf3e00000000e0474dbe00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000540c96be00000000403fb5bb00000000ffff7f3f000000000000803f0000000000000000000080bf8e20d23e00000000e0474dbe00000000809d0dbb00000000ffff7f3f000000000000803f0000000000000000000080bf5de5193e00000000b0c64bbe000000009016d9bc00000000ffff7f3f000000000000803f0000000000000000000080bf15fa133e00000000ac9b94be0000000090bd84bc000000000000803f000000000000803f0000000000000000000080bf3216d53e00000000540c96be00000000403fb5bb000000000000803f000000000000803f0000000000000000000080bf8e20d23e00000000b0c64bbe000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e0000000080be93be0000000040dde6bc00000000ffff7f3f000000000000803f0000000000000000000080bfd70bd83e00000000ac9b94be0000000090bd84bc00000000ffff7f3f000000000000803f0000000000000000000080bf3216d53e00000000b0c64bbe000000009016d9bc00000000ffff7f3f000000000000803f0000000000000000000080bf15fa133e0000000080be93be0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000b0c64bbe000000009016d9bc000000000000803f000000000000803f0000000000000000000080bf15fa133e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000c07493be00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e0000000080be93be0000000040dde6bc000000000000803f000000000000803f0000000000000000000080bfd70bd83e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e00000000c07493be00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e00000000c07493be00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf7b01db3e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e0000000070e7bbbe00000000ee7cbfbd00000000ffff7f3f000000000000803f0000000000000000000080bfc3ece03e00000000c07493be00000000dc2486bd00000000ffff7f3f000000000000803f0000000000000000000080bf1ff7dd3e00000000c07493be00000000fa7eeabd00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000c07493be00000000dc2486bd000000000000803f000000000000803f0000000000000000000080bf1ff7dd3e00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000007c30c5be000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e0000000070e7bbbe00000000ee7cbfbd000000000000803f000000000000803f0000000000000000000080bfc3ece03e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000b881cebe000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e000000007c30c5be000000003ceaccbd000000000000803f000000000000803f0000000000000000000080bf68e2e33e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f0000000030b2d7be0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e00000000b881cebe000000006edcdabd000000000000803f000000000000803f0000000000000000000080bf0cd8e63e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e0000000030b2d7be0000000090c2e9bd000000000000803f000000000000803f0000000000000000000080bfb0cde93e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000c07493be00000000fa7eeabd000000000000803f000000000000803f0000000000000000000080bf0000803f00000000940f9dbe0000000008d7f7bd000000000000803f000000000000803f0000000000000000000080bf2e857e3f00000000c07493be000000005b647bbe00000000ffff7f3f000000000000803f0000000000000000000080bf73ba4a3f00000000c07493be00000000fa7eeabd00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000b0c64bbe000000000bd783be00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e0e3e00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000940f9dbe0000000008d7f7bd000000000000803f000000000000803f0000000000000000000080bf2e857e3f00000000485aa6be0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000fc0ce9be000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000ec98e0be00000000b00bfabd000000000000803f000000000000803f0000000000000000000080bf54c3ec3e00000000485aa6be0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000fc0ce9be000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000485aa6be0000000020b002be000000000000803f000000000000803f0000000000000000000080bf5c0a7d3f00000000683bafbe00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f0000000064e5f0be000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e00000000fc0ce9be000000006c1306be000000000000803f000000000000803f0000000000000000000080bff9b8ef3e00000000683bafbe00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f0000000064e5f0be000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e00000000683bafbe00000000e3a509be000000000000803f000000000000803f0000000000000000000080bf8a8f7b3f000000007499b7be0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e0000000064e5f0be000000008a4110be000000000000803f000000000000803f0000000000000000000080bf9daef23e000000007499b7be0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e000000007499b7be0000000060e510be000000000000803f000000000000803f0000000000000000000080bfb7147a3f00000000f45abfbe000000002b8718be000000000000803f000000000000803f0000000000000000000080bfe599783f0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e00000000f45abfbe000000002b8718be000000000000803f000000000000803f0000000000000000000080bfe599783f000000006c66c6be00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000006c1ffebe000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e0000000030f9f7be00000000b9c71bbe000000000000803f000000000000803f0000000000000000000080bf41a4f53e000000006c66c6be00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f000000006c1ffebe000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e000000006c66c6be00000000d7a320be000000000000803f000000000000803f0000000000000000000080bf131f773f0000000054a2ccbe00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000006c1ffebe000000007edd28be000000000000803f000000000000803f0000000000000000000080bfe599f83e0000000054a2ccbe00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e0000000054a2ccbe00000000f85329be000000000000803f000000000000803f0000000000000000000080bf41a4753f000000003cf5d1be0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e000000003cf5d1be0000000021b032be000000000000803f000000000000803f0000000000000000000080bf6f29743f00000000a445d6be00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e000000008e9701bf0000000060ba37be000000000000803f000000000000803f0000000000000000000080bf8a8ffb3e00000000a445d6be00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000a445d6be00000000e6d03cbe000000000000803f000000000000803f0000000000000000000080bf9dae723f00000000107ad9be00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e00000000107ad9be00000000dace47be000000000000803f000000000000803f0000000000000000000080bfcb33713f000000000079dbbe0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f000000008cb304bf0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f00000000aa7f03bf00000000e49548be000000000000803f000000000000803f0000000000000000000080bf2e85fe3e000000000079dbbe0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f000000008cb304bf0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f000000000079dbbe0000000090c253be000000000000803f000000000000803f0000000000000000000080bff9b86f3f00000000fc28dcbe000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f00000000ba1e05bf00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f000000008cb304bf0000000090a75bbe000000000000803f000000000000803f0000000000000000000080bf69bd003f00000000fc28dcbe000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f00000000ba1e05bf00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f00000000fc28dcbe000000009cc460be000000000000803f000000000000803f0000000000000000000080bf263e6e3f000000008ce0dbbe0000000017ff69be000000000000803f000000000000803f0000000000000000000080bf54c36c3f00000000ba1e05bf00000000ea2671be000000000000803f000000000000803f0000000000000000000080bf3b38023f000000008ce0dbbe0000000017ff69be000000000000803f000000000000803f0000000000000000000080bf54c36c3f00000000640cdbbe00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f000000007ce304bf0000000042d87fbe00000000ffff7f3f000000000000803f0000000000000000000080bf0db3033f00000000ba1e05bf00000000ea2671be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023f00000000640cdbbe00000000c5b372be00000000ffff7f3f000000000000803f0000000000000000000080bf82486b3f000000007ce304bf0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000640cdbbe00000000c5b372be000000000000803f000000000000803f0000000000000000000080bf82486b3f000000003cb4d9be00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f000000007ce304bf0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f000000003cb4d9be00000000fed47abe000000000000803f000000000000803f0000000000000000000080bfb0cd693f00000000dcdfd7be000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f00000000a48c96be00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f00000000c07493be000000005b647bbe000000000000803f000000000000803f0000000000000000000080bf73ba4a3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f000000007ce304bf0000000042d87fbe000000000000803f000000000000803f0000000000000000000080bf0db3033f00000000dcdfd7be000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f0000000074af99be000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f00000000a48c96be00000000e38a80be000000000000803f000000000000803f0000000000000000000080bf46354c3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000dcdfd7be000000008e2a81be000000000000803f000000000000803f0000000000000000000080bfde52683f00000000f896d5be000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f0000000034dd9cbe00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f0000000074af99be000000002b3083be000000000000803f000000000000803f0000000000000000000080bf18b04d3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e0000000038500fbe00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b00000000783d0abe00000000f85383be000000000000803f000000000000803f0000000000000000000080bf0000000000000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000034dd9cbe00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f00000000b0c64bbe000000000bd783be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3e0000000008a64bbe0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f00000000f896d5be000000003b9384be000000000000803f000000000000803f0000000000000000000080bf0cd8663f000000004ce1d2be00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000c04614be00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c0000000038500fbe00000000e12e85be000000000000803f000000000000803f0000000000000000000080bf1069bd3b00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000dc15a0be0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f0000000034dd9cbe00000000bf9f85be000000000000803f000000000000803f0000000000000000000080bfea2a4f3f0000000008a64bbe0000000071e685be000000000000803f000000000000803f0000000000000000000080bf8423083e00000000dc15a0be0000000058d787be00000000ffff7f3f000000000000803f0000000000000000000080bfbca5503f0000000008a64bbe0000000071e685be00000000ffff7f3f000000000000803f0000000000000000000080bf8423083e00000000c8444bbe000000000abc87be00000000ffff7f3f000000000000803f0000000000000000000080bf3b38023e00000000b01a19be00000000ee7c88be000000000000803f000000000000803f0000000000000000000080bfcc0e8e3c00000000c04614be00000000a7e786be000000000000803f000000000000803f0000000000000000000080bf10693d3c00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000001a3504bf00000000190f87be000000000000803f000000000000803f0000000000000000000080bfdf2d053f000000004ce1d2be00000000b29d87be000000000000803f000000000000803f0000000000000000000080bf3a5d653f00000000961803bf000000006de78dbe00000000ffff7f3f000000000000803f0000000000000000000080bfb2a8063f000000004ce1d2be00000000b29d87be00000000ffff7f3f000000000000803f0000000000000000000080bf3a5d653f000000009cc6cfbe0000000022438abe00000000ffff7f3f000000000000803f0000000000000000000080bf68e2633f00000000dc15a0be0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000c8444bbe000000000abc87be000000000000803f000000000000803f0000000000000000000080bf3b38023e00000000d0a34abe000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d000000007459a3be00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000dc15a0be0000000058d787be000000000000803f000000000000803f0000000000000000000080bfbca5503f00000000d0a34abe000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d00000000a8c51dbe0000000058ed89be00000000ffff7f3f000000000000803f0000000000000000000080bf1069bd3c00000000b01a19be00000000ee7c88be00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3c00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f000000007459a3be00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f00000000d0a34abe000000001d5a89be000000000000803f000000000000803f0000000000000000000080bfe599f83d0000000010c449be00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d00000000f4a7a6be0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f000000007459a3be00000000b1d489be000000000000803f000000000000803f0000000000000000000080bf8e20523f0000000010c449be00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d00000000484122be0000000086378bbe00000000ffff7f3f000000000000803f0000000000000000000080bf54c3ec3c00000000a8c51dbe0000000058ed89be00000000ffff7f3f000000000000803f0000000000000000000080bf1069bd3c00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000009cc6cfbe0000000022438abe000000000000803f000000000000803f0000000000000000000080bf68e2633f000000009c4eccbe00000000b47c8cbe000000000000803f000000000000803f0000000000000000000080bf9567623f00000000f4a7a6be0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f0000000010c449be00000000f1c28abe000000000000803f000000000000803f0000000000000000000080bf54c3ec3d0000000068a648be00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000388726be000000001d5a8cbe000000000000803f000000000000803f0000000000000000000080bfcc0e0e3d00000000484122be0000000086378bbe000000000000803f000000000000803f0000000000000000000080bf54c3ec3c00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000f4a7a6be0000000082958bbe000000000000803f000000000000803f0000000000000000000080bf609b533f0000000068a648be00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f0000000068a648be00000000ccf88bbe000000000000803f000000000000803f0000000000000000000080bfc3ece03d00000000c04b47be00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d0000000018912abe00000000be538dbe00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253d00000000388726be000000001d5a8cbe00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e0e3d00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000009c4eccbe00000000b47c8cbe000000000000803f000000000000803f0000000000000000000080bf9567623f000000000c81c8be0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f00000000c04b47be00000000f4fd8cbe000000000000803f000000000000803f0000000000000000000080bf3216d53d0000000008b545be00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d00000000bc65adbe0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f000000006401aabe0000000084178dbe000000000000803f000000000000803f0000000000000000000080bf3216553f0000000008b545be00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d0000000080582ebe000000000c238ebe000000000000803f000000000000803f0000000000000000000080bf10693d3d0000000018912abe00000000be538dbe000000000000803f000000000000803f0000000000000000000080bfeebb253d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000bc65adbe0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f0000000008b545be00000000b1d48dbe000000000000803f000000000000803f0000000000000000000080bfa13fc93d0000000028e343be00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000961803bf000000006de78dbe000000000000803f000000000000803f0000000000000000000080bfb2a8063f000000000c81c8be0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f0000000018d731be00000000a8c68ebe00000000ffff7f3f000000000000803f0000000000000000000080bf3216553d0000000080582ebe000000000c238ebe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3d00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000000c81c8be0000000096438ebe000000000000803f000000000000803f0000000000000000000080bfc3ec603f00000000a865c4be00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f00000000bc65adbe0000000072588ebe000000000000803f000000000000803f0000000000000000000080bf0491563f0000000028e343be00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000028e343be00000000487f8ebe000000000000803f000000000000803f0000000000000000000080bf1069bd3d0000000008d741be0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d00000000800635be00000000373d8fbe000000000000803f000000000000803f0000000000000000000080bf54c36c3d0000000018d731be00000000a8c68ebe000000000000803f000000000000803f0000000000000000000080bf3216553d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000008d741be0000000001008fbe000000000000803f000000000000803f0000000000000000000080bf7f92b13d0000000090913fbe0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d0000000058e037be000000005a858fbe00000000ffff7f3f000000000000803f0000000000000000000080bf3b38823d00000000800635be00000000373d8fbe00000000ffff7f3f000000000000803f0000000000000000000080bf54c36c3d00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000004d5b0be0000000005568fbe000000000000803f000000000000803f0000000000000000000080bfd70b583f0000000090913fbe0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f0000000090913fbe0000000021598fbe000000000000803f000000000000803f0000000000000000000080bfeebba53d00000000a8133dbe00000000ef8c8fbe000000000000803f000000000000803f0000000000000000000080bf5de5993d00000000385e3abe00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d0000000058e037be000000005a858fbe000000000000803f000000000000803f0000000000000000000080bf3b38823d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000344fb4be00000000f50d90be00000000ffff7f3f000000000000803f0000000000000000000080bfa986593f00000000a8133dbe00000000ef8c8fbe00000000ffff7f3f000000000000803f0000000000000000000080bf5de5993d00000000385e3abe00000000b39d8fbe00000000ffff7f3f000000000000803f0000000000000000000080bfcc0e8e3d00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000a865c4be00000000f4908fbe000000000000803f000000000000803f0000000000000000000080bff1715f3f000000003004c0be00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f00000000385e3abe00000000b39d8fbe000000000000803f000000000000803f0000000000000000000080bfcc0e8e3d00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f0000000054d4b7be00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f00000000344fb4be00000000f50d90be000000000000803f000000000000803f0000000000000000000080bfa986593f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000003004c0be00000000fc5d90be000000000000803f000000000000803f0000000000000000000080bf1ff75d3f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f0000000054d4b7be00000000fe7d90be000000000000803f000000000000803f0000000000000000000080bf7b015b3f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f000000005c64bbbe00000000d8a390be000000000000803f000000000000803f0000000000000000000080bf4d7c5c3f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f000000005052ffbe000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000ee9201bf000000002f6094be000000000000803f000000000000803f0000000000000000000080bf8423083f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f000000005052ffbe000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f00000000d4f793be00000000115899be000000000000803f000000000000803f0000000000000000000080bfeebb253f0000000018fb98be0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f00000000cccd92be00000000cb3f9dbe00000000ffff7f3f000000000000803f0000000000000000000080bfc036273f00000000d4f793be00000000115899be00000000ffff7f3f000000000000803f0000000000000000000080bfeebb253f00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f0000000084c0fabe000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f000000005052ffbe000000006e649abe000000000000803f000000000000803f0000000000000000000080bf569e093f0000000018fb98be0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f0000000084c0fabe000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f0000000018fb98be0000000043249dbe000000000000803f000000000000803f0000000000000000000080bf1c41243f000000005c089ebe000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f00000000845a91be000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f00000000cccd92be00000000cb3f9dbe000000000000803f000000000000803f0000000000000000000080bfc036273f00000000783d0abe00000000dcf99ebe000000000000803f000000000000803f0000000000000000000080bfa13f493f00000000845a91be000000000ac7a0be00000000ffff7f3f000000000000803f0000000000000000000080bf92b1283f00000000783d0abe00000000dcf99ebe00000000ffff7f3f000000000000803f0000000000000000000080bfa13f493f00000000a83e14be000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f0000000084c0fabe000000003cdf9fbe000000000000803f000000000000803f0000000000000000000080bf28190b3f000000005c089ebe000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f000000005c089ebe000000008799a0be000000000000803f000000000000803f0000000000000000000080bf4ac6223f00000000bc1ea3be0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f00000000ac9b8fbe000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f00000000845a91be000000000ac7a0be000000000000803f000000000000803f0000000000000000000080bf92b1283f00000000a83e14be000000008c3ba2be000000000000803f000000000000803f0000000000000000000080bfcfc4473f00000000ac9b8fbe000000009eefa3be00000000ffff7f3f000000000000803f0000000000000000000080bf652c2a3f00000000a83e14be000000008c3ba2be00000000ffff7f3f000000000000803f0000000000000000000080bfcfc4473f0000000098591dbe000000007a1aa5be00000000ffff7f3f000000000000803f0000000000000000000080bffd49463f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f00000000bc1ea3be0000000053b8a3be000000000000803f000000000000803f0000000000000000000080bf784b213f00000000503da8be000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f00000000008f8dbe000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f00000000ac9b8fbe000000009eefa3be000000000000803f000000000000803f0000000000000000000080bf652c2a3f0000000098591dbe000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f000000004c8aefbe00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f00000000847af5be00000000a9bba4be000000000000803f000000000000803f0000000000000000000080bffa930c3f00000000503da8be000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f00000000008f8dbe000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f0000000098591dbe000000007a1aa5be000000000000803f000000000000803f0000000000000000000080bffd49463f0000000018ae25be00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f000000004c8aefbe00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f00000000503da8be000000001a81a6be000000000000803f000000000000803f0000000000000000000080bfa6d01f3f000000002c63adbe0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f000000003c328bbe00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f00000000008f8dbe000000005bbba6be000000000000803f000000000000803f0000000000000000000080bf37a72b3f0000000018ae25be00000000a79ba7be000000000000803f000000000000803f0000000000000000000080bf2bcf443f000000003c328bbe00000000132ca9be00000000ffff7f3f000000000000803f0000000000000000000080bf09222d3f0000000018ae25be00000000a79ba7be00000000ffff7f3f000000000000803f0000000000000000000080bf2bcf443f00000000085c2dbe0000000014c4a9be00000000ffff7f3f000000000000803f0000000000000000000080bf5954433f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000004c8aefbe00000000c6e4a8be000000000000803f000000000000803f0000000000000000000080bfcc0e0e3f000000002c63adbe0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f000000002c63adbe0000000052f4a8be000000000000803f000000000000803f0000000000000000000080bfd4551e3f00000000648fb2be000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f00000000188388be000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f000000003c328bbe00000000132ca9be000000000000803f000000000000803f0000000000000000000080bf09222d3f00000000085c2dbe0000000014c4a9be000000000000803f000000000000803f0000000000000000000080bf5954433f00000000188388be000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f00000000085c2dbe0000000014c4a9be000000000000803f000000000000803f0000000000000000000080bf5954433f00000000408334be00000000c598abbe000000000000803f000000000000803f0000000000000000000080bf87d9413f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f00000000648fb2be000000006f12abbe000000000000803f000000000000803f0000000000000000000080bf01db1c3f0000000010c1b7be00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000004c7f85be00000000b803adbe000000000000803f000000000000803f0000000000000000000080bfad17303f00000000188388be000000009643abbe000000000000803f000000000000803f0000000000000000000080bfdb9c2e3f00000000408334be00000000c598abbe000000000000803f000000000000803f0000000000000000000080bf87d9413f000000004c7f85be00000000b803adbe00000000ffff7f3f000000000000803f0000000000000000000080bfad17303f00000000408334be00000000c598abbe00000000ffff7f3f000000000000803f0000000000000000000080bf87d9413f0000000098433bbe00000000b91eadbe00000000ffff7f3f000000000000803f0000000000000000000080bfb55e403f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f00000000dcf9e8be00000000a345acbe000000000000803f000000000000803f0000000000000000000080bf9e890f3f0000000010c1b7be00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f0000000010c1b7be00000000e6dbacbe000000000000803f000000000000803f0000000000000000000080bf2f601b3f000000004cf7bcbe000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f00000000942482be000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f000000004c7f85be00000000b803adbe000000000000803f000000000000803f0000000000000000000080bfad17303f0000000098433bbe00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000942482be000000004b6eaebe000000000000803f000000000000803f0000000000000000000080bf7f92313f0000000098433bbe00000000b91eadbe000000000000803f000000000000803f0000000000000000000080bfb55e403f00000000f8bc41be00000000f35aaebe000000000000803f000000000000803f0000000000000000000080bfe2e33e3f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000004cf7bcbe000000002a51aebe000000000000803f000000000000803f0000000000000000000080bf5de5193f000000002c31c2be00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000942482be000000004b6eaebe00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313f00000000f8bc41be00000000f35aaebe00000000ffff7f3f000000000000803f0000000000000000000080bfe2e33e3f00000000300f48be000000007452afbe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3f0000000050e17cbe000000002085afbe00000000ffff7f3f000000000000803f0000000000000000000080bf510d333f00000000942482be000000004b6eaebe00000000ffff7f3f000000000000803f0000000000000000000080bf7f92313f00000000300f48be000000007452afbe00000000ffff7f3f000000000000803f0000000000000000000080bf10693d3f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f0000000044d3e1be0000000051c9aebe000000000000803f000000000000803f0000000000000000000080bf7004113f000000002c31c2be00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f0000000050e17cbe000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000300f48be000000007452afbe000000000000803f000000000000803f0000000000000000000080bf10693d3f00000000205a4ebe000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f000000002c31c2be00000000b172afbe000000000000803f000000000000803f0000000000000000000080bf8b6a183f00000000c46dc7be00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f0000000080c274be00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f0000000050e17cbe000000002085afbe000000000000803f000000000000803f0000000000000000000080bf510d333f00000000205a4ebe000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f0000000080c274be00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f00000000205a4ebe000000003e0ab0be000000000000803f000000000000803f0000000000000000000080bf3eee3b3f00000000a8bd54be000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f00000000c46dc7be00000000ef40b0be000000000000803f000000000000803f0000000000000000000080bfb9ef163f0000000034acccbe0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f0000000030e86bbe00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f0000000080c274be00000000094ab0be000000000000803f000000000000803f0000000000000000000080bf2488343f00000000a8bd54be000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f0000000088ebd1be0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bf15fa133f000000007c20dabe00000000e05ab0be000000000000803f000000000000803f0000000000000000000080bf437f123f0000000034acccbe0000000058bcb0be000000000000803f000000000000803f0000000000000000000080bfe774153f0000000030e86bbe00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f00000000a8bd54be000000005287b0be000000000000803f000000000000803f0000000000000000000080bf6c733a3f0000000098595bbe00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f00000000d84d62be0000000061e5b0be000000000000803f000000000000803f0000000000000000000080bfc87d373f0000000030e86bbe00000000d9beb0be000000000000803f000000000000803f0000000000000000000080bff602363f0000000098595bbe00000000b3ceb0be000000000000803f000000000000803f0000000000000000000080bf9af8383f00000000363333bf00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bfabaa2a3f00000000363333bf0000000061e5b03e00000000ffff7f3f000000000000803f0000000000000000000080bfabaaaa3e00000000826a1cbf0000000061e5b03e00000000ffff7f3f000000000000803f0000000000000000000080bf0000000000000000363333bf00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bfabaa2a3f00000000826a1cbf0000000061e5b03e00000000ffff7f3f000000000000803f0000000000000000000080bf0000000000000000826a1cbf00000000bb49acbe00000000ffff7f3f000000000000803f0000000000000000000080bf0000803f00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c00000000723d9abf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bf00000000000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000723d9abf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bf0000000000000000baf37dbf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bfc853023f000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000baf37dbf0000000061e5b03e000000000000803f000000000000803f0000000000000000000080bfc853023f000000009ad874bf000000003dfaaf3e000000000000803f000000000000803f0000000000000000000080bf7058fb3e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000009ad874bf000000003dfaaf3e000000000000803f000000000000803f0000000000000000000080bf7058fb3e00000000b6976cbf00000000734dad3e000000000000803f000000000000803f0000000000000000000080bf4f09f23e000000002fb28dbf000000000bd7833e00000000ffff7f3f000000000000803f0000000000000000000080bf58fb063f00000000b6976cbf00000000734dad3e00000000ffff7f3f000000000000803f0000000000000000000080bf4f09f23e00000000162e65bf00000000f5fda83e00000000ffff7f3f000000000000803f0000000000000000000080bf2fbae83e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000162e65bf00000000f5fda83e000000000000803f000000000000803f0000000000000000000080bf2fbae83e00000000c6985ebf00000000b52aa33e000000000000803f000000000000803f0000000000000000000080bf0e6bdf3e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000c6985ebf00000000b52aa33e000000000000803f000000000000803f0000000000000000000080bf0e6bdf3e00000000d0d458bf00000000a7f29b3e000000000000803f000000000000803f0000000000000000000080bfed1bd63e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f00000000d0d458bf00000000a7f29b3e000000000000803f000000000000803f0000000000000000000080bfed1bd63e000000003edf53bf00000000bd74933e000000000000803f000000000000803f0000000000000000000080bfcdcccc3e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000003edf53bf00000000bd74933e000000000000803f000000000000803f0000000000000000000080bfcdcccc3e000000001cb54fbf00000000e9cf893e000000000000803f000000000000803f0000000000000000000080bfac7dc33e000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000001cb54fbf00000000e9cf893e000000000000803f000000000000803f0000000000000000000080bfac7dc33e00000000baf37dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bfe9a20b3f00000000baf37dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bfe9a20b3f000000001cb54fbf00000000e9cf893e000000000000803f000000000000803f0000000000000000000080bfac7dc33e0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c000000002fb28dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bf58fb063f000000002fb28dbf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf0000803f00000000de9478bf00000000fd47833e000000000000803f000000000000803f0000000000000000000080bf794a103f00000000baf37dbf000000000bd7833e000000000000803f000000000000803f0000000000000000000080bfe9a20b3f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e000000005ad773bf000000006bac813e000000000000803f000000000000803f0000000000000000000080bf09f2143f00000000de9478bf00000000fd47833e000000000000803f000000000000803f0000000000000000000080bf794a103f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e0000000036b36fbf00000000723d7e3e000000000000803f000000000000803f0000000000000000000080bf9a99193f000000005ad773bf000000006bac813e000000000000803f000000000000803f0000000000000000000080bf09f2143f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e0000000036b36fbf00000000723d7e3e000000000000803f000000000000803f0000000000000000000080bf9a99193f0000000072534cbf000000003e467e3e000000000000803f000000000000803f0000000000000000000080bf8c2eba3e000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e000000007a206cbf000000009e72773e000000000000803f000000000000803f0000000000000000000080bf2a411e3f0000000036b36fbf00000000723d7e3e000000000000803f000000000000803f0000000000000000000080bf9a99193f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000301769bf00000000222d6f3e000000000000803f000000000000803f0000000000000000000080bfbae8223f000000007a206cbf000000009e72773e000000000000803f000000000000803f0000000000000000000080bf2a411e3f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000608f66bf00000000caa1653e000000000000803f000000000000803f0000000000000000000080bf4a90273f00000000301769bf00000000222d6f3e000000000000803f000000000000803f0000000000000000000080bfbae8223f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000608f66bf00000000caa1653e000000000000803f000000000000803f0000000000000000000080bf4a90273f000000004eb749bf00000000a21a673e000000000000803f000000000000803f0000000000000000000080bf6bdfb03e00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e00000000128164bf0000000062055b3e000000000000803f000000000000803f0000000000000000000080bfdb372c3f00000000608f66bf00000000caa1653e000000000000803f000000000000803f0000000000000000000080bf4a90273f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e0000000054e462bf00000000b28c4f3e000000000000803f000000000000803f0000000000000000000080bf6bdf303f00000000128164bf0000000062055b3e000000000000803f000000000000803f0000000000000000000080bfdb372c3f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e000000002ab161bf000000008a6c433e000000000000803f000000000000803f0000000000000000000080bffb86353f0000000054e462bf00000000b28c4f3e000000000000803f000000000000803f0000000000000000000080bf6bdf303f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e000000002ab161bf000000008a6c433e000000000000803f000000000000803f0000000000000000000080bffb86353f00000000badd47bf00000000e25a4e3e000000000000803f000000000000803f0000000000000000000080bf4a90a73e00000000c0c346bf00000000e244343e000000000000803f000000000000803f0000000000000000000080bf2a419e3e00000000a0df60bf00000000b2d9363e000000000000803f000000000000803f0000000000000000000080bf8c2e3a3f000000002ab161bf000000008a6c433e000000000000803f000000000000803f0000000000000000000080bffb86353f00000000c0c346bf00000000e244343e000000000000803f000000000000803f0000000000000000000080bf2a419e3e00000000be6760bf00000000f2082a3e000000000000803f000000000000803f0000000000000000000080bf1cd63e3f00000000a0df60bf00000000b2d9363e000000000000803f000000000000803f0000000000000000000080bf8c2e3a3f00000000c0c346bf00000000e244343e000000000000803f000000000000803f0000000000000000000080bf2a419e3e00000000be6760bf00000000f2082a3e00000000ffff7f3f000000000000803f0000000000000000000080bf1cd63e3f00000000c0c346bf00000000e244343e00000000ffff7f3f000000000000803f0000000000000000000080bf2a419e3e000000006a6646bf000000008816193e00000000ffff7f3f000000000000803f0000000000000000000080bf09f2943e000000008c4160bf000000001a2f1d3e000000000000803f000000000000803f0000000000000000000080bfac7d433f00000000be6760bf00000000f2082a3e000000000000803f000000000000803f0000000000000000000080bf1cd63e3f000000006a6646bf000000008816193e000000000000803f000000000000803f0000000000000000000080bf09f2943e00000000ec8060bf000000008c660c3e000000000000803f000000000000803f0000000000000000000080bf3d25483f000000008c4160bf000000001a2f1d3e000000000000803f000000000000803f0000000000000000000080bfac7d433f000000006a6646bf000000008816193e000000000000803f000000000000803f0000000000000000000080bf09f2943e00000000ec8060bf000000008c660c3e000000000000803f000000000000803f0000000000000000000080bf3d25483f000000006a6646bf000000008816193e000000000000803f000000000000803f0000000000000000000080bf09f2943e0000000042c946bf000000001872fc3d000000000000803f000000000000803f0000000000000000000080bfe9a28b3e00000000dc3b61bf00000000b4c7f93d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3f00000000ec8060bf000000008c660c3e000000000000803f000000000000803f0000000000000000000080bf3d25483f0000000042c946bf000000001872fc3d000000000000803f000000000000803f0000000000000000000080bfe9a28b3e00000000dc3b61bf00000000b4c7f93d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3f0000000042c946bf000000001872fc3d000000000000803f000000000000803f0000000000000000000080bfe9a28b3e00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e00000000966d62bf000000003c60dd3d000000000000803f000000000000803f0000000000000000000080bf5d74513f00000000dc3b61bf00000000b4c7f93d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3f00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e000000004e1164bf00000000e8a8c33d000000000000803f000000000000803f0000000000000000000080bfed1b563f00000000966d62bf000000003c60dd3d000000000000803f000000000000803f0000000000000000000080bf5d74513f00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e000000004e1164bf00000000e8a8c33d000000000000803f000000000000803f0000000000000000000080bfed1b563f00000000e2f347bf000000009c1cc93d000000000000803f000000000000803f0000000000000000000080bfc853823e000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e00000000422266bf00000000e8b3ac3d000000000000803f000000000000803f0000000000000000000080bf7ec35a3f000000004e1164bf00000000e8a8c33d000000000000803f000000000000803f0000000000000000000080bfed1b563f000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e00000000aa9b68bf000000007093983d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3f00000000422266bf00000000e8b3ac3d000000000000803f000000000000803f0000000000000000000080bf7ec35a3f000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e00000000aa9b68bf000000007093983d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3f000000007ee949bf00000000a89b983d000000000000803f000000000000803f0000000000000000000080bf4f09723e0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000bc786bbf00000000b859873d000000000000803f000000000000803f0000000000000000000080bf9e12643f00000000aa9b68bf000000007093983d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000b2b46ebf00000000e031723d000000000000803f000000000000803f0000000000000000000080bf2fba683f00000000bc786bbf00000000b859873d000000000000803f000000000000803f0000000000000000000080bf9e12643f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000c44a72bf00000000a0c65b3d000000000000803f000000000000803f0000000000000000000080bfbf616d3f00000000b2b46ebf00000000e031723d000000000000803f000000000000803f0000000000000000000080bf2fba683f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e000000002c3676bf0000000018964b3d000000000000803f000000000000803f0000000000000000000080bf4f09723f00000000c44a72bf00000000a0c65b3d000000000000803f000000000000803f0000000000000000000080bfbf616d3f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e000000002c3676bf0000000018964b3d000000000000803f000000000000803f0000000000000000000080bf4f09723f0000000044ad4cbf0000000098bc563d000000000000803f000000000000803f0000000000000000000080bf0e6b5f3e00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e0000000022727abf00000000a8c4413d000000000000803f000000000000803f0000000000000000000080bfdfb0763f000000002c3676bf0000000018964b3d000000000000803f000000000000803f0000000000000000000080bf4f09723f00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e00000000def97ebf00000000c8763e3d00000000ffff7f3f000000000000803f0000000000000000000080bf70587b3f0000000022727abf00000000a8c4413d00000000ffff7f3f000000000000803f0000000000000000000080bfdfb0763f00000000624250bf0000000020a7033d00000000ffff7f3f000000000000803f0000000000000000000080bfcdcc4c3e00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c000000002fb28dbf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf0000803f000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000002fb28dbf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf0000803f00000000def97ebf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf70587b3f000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000def97ebf00000000c8763e3d000000000000803f000000000000803f0000000000000000000080bf70587b3f00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000624250bf0000000020a7033d000000000000803f000000000000803f0000000000000000000080bfcdcc4c3e000000000cac54bf000000000054633c000000000000803f000000000000803f0000000000000000000080bf8c2e3a3e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000000cac54bf000000000054633c000000000000803f000000000000803f0000000000000000000080bf8c2e3a3e000000006eed59bf0000000080ba0dbb000000000000803f000000000000803f0000000000000000000080bf4a90273e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000006eed59bf0000000080ba0dbb000000000000803f000000000000803f0000000000000000000080bf4a90273e00000000ba0960bf00000000901981bc000000000000803f000000000000803f0000000000000000000080bf09f2143e000000002fb28dbf00000000e8fb29bd00000000ffff7f3f000000000000803f0000000000000000000080bf0e6b5f3d00000000ba0960bf00000000901981bc00000000ffff7f3f000000000000803f0000000000000000000080bf09f2143e000000001c0467bf0000000080c0dabc00000000ffff7f3f000000000000803f0000000000000000000080bfc853023e000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000001c0467bf0000000080c0dabc000000000000803f000000000000803f0000000000000000000080bfc853023e00000000c6df6ebf0000000000780ebd000000000000803f000000000000803f0000000000000000000080bf0e6bdf3d000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000c6df6ebf0000000000780ebd000000000000803f000000000000803f0000000000000000000080bf0e6bdf3d00000000e89f77bf00000000e8f522bd000000000000803f000000000000803f0000000000000000000080bf8c2eba3d000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d00000000e89f77bf00000000e8f522bd000000000000803f000000000000803f0000000000000000000080bf8c2eba3d00000000d9a380bf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf09f2943d00000000723d9abf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2943c000000002fb28dbf00000000e8fb29bd000000000000803f000000000000803f0000000000000000000080bf0e6b5f3d000000002fb28dbf00000000bb49acbe000000000000803f000000000000803f0000000000000000000080bf09f2143d00000000 - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: -0.000000059604645, y: 0, z: 0} - m_Extent: {x: 1.2050002, y: 0, z: 0.34550002} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimizationFlags: 1 - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: --- !u!114 &1390840085 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4167,248 +3061,6 @@ MonoBehaviour: - {fileID: 1852085904} - {fileID: 816671309} - {fileID: 1390840085} ---- !u!43 &1423796318 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 4Gon - 9ed4e71095511e76473fe88ad70ec7ef - serializedVersion: 10 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 6 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 4 - localAABB: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 1, y: 0, z: 1} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: [] - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_BonesAABB: [] - m_VariableBoneCountWeights: - m_Data: - m_MeshCompression: 0 - m_IsReadable: 1 - m_KeepVertices: 1 - m_KeepIndices: 1 - m_IndexFormat: 0 - m_IndexBuffer: 000001000200010003000200 - m_VertexData: - serializedVersion: 3 - m_VertexCount: 4 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 24 - format: 0 - dimension: 4 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 40 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - m_DataSize: 192 - _typelessdata: 000080bf000000002ebd3bb3000000000000803f000000000000803f0000000000000000000080bf000000000000000000000000000000000000803f000000000000803f000000000000803f0000000000000000000080bf00000000000000000000000000000000000080bf000000000000803f000000000000803f0000000000000000000080bf00000000000000000000803f000000002ede4c32000000000000803f000000000000803f0000000000000000000080bf0000000000000000 - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 1, y: 0, z: 1} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimizationFlags: 1 - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: ---- !u!21 &1455670315 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Standard (Instance) - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] --- !u!1 &1464556211 GameObject: m_ObjectHideFlags: 0 @@ -4646,89 +3298,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1506703863} m_CullTransparentMesh: 1 ---- !u!1 &1525231632 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1525231633} - - component: {fileID: 1525231635} - - component: {fileID: 1525231634} - m_Layer: 0 - m_Name: 6Gon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1525231633 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1525231632} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -13, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 239243193} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &1525231634 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1525231632} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 950424089} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1525231635 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1525231632} - m_Mesh: {fileID: 1888238522} --- !u!1 &1527997981 GameObject: m_ObjectHideFlags: 0 @@ -4938,137 +3507,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1622342826 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1622342827} - - component: {fileID: 1622342829} - - component: {fileID: 1622342828} - - component: {fileID: 1622342830} - m_Layer: 0 - m_Name: 5Gon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1622342827 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1622342826} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -10, y: 0, z: 0.09549147} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 239243193} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &1622342828 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1622342826} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 1088138830} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1622342829 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1622342826} - m_Mesh: {fileID: 828542546} ---- !u!114 &1622342830 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1622342826} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2cb1817d5a3fda645aa9b1b658ad3003, type: 3} - m_Name: - m_EditorClassIdentifier: - _serializedData: '{"totalChildrenCount":0,"applicationId":null,"speckle_type":"Speckle.ConnectorUnity.Wrappers.SpeckleProperties+SpeckleData","id":"c654a738a88de3616bff9515a0119272"}' - _serializedSpeckleType: Speckle.Core.Models.Base, SpeckleCore2, Version=2.1.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!1 &1691753946 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1691753947} - m_Layer: 0 - m_Name: da5ba55774 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1691753947 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1691753946} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2044880247} - m_Father: {fileID: 344004931} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1707872729 GameObject: m_ObjectHideFlags: 0 @@ -5429,170 +3867,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1885647142} m_CullTransparentMesh: 1 ---- !u!43 &1888238522 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 6Gon - 0cc6cb2bdc0872b08446a749a5b3b679 - serializedVersion: 10 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 12 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 6 - localAABB: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 0.8660259, y: 0, z: 1} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: [] - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_BonesAABB: [] - m_VariableBoneCountWeights: - m_Data: - m_MeshCompression: 0 - m_IsReadable: 1 - m_KeepVertices: 1 - m_KeepIndices: 1 - m_IndexFormat: 0 - m_IndexBuffer: 000001000200010003000200030004000200040005000200 - m_VertexData: - serializedVersion: 3 - m_VertexCount: 6 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 24 - format: 0 - dimension: 4 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 40 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - m_DataSize: 288 - _typelessdata: e0b35dbf00000000ffffff3e000000000000803f000000000000803f0000000000000000000080bf000000000000000000000000000000000000803f000000000000803f000000000000803f0000000000000000000080bf0000000000000000d0b35dbf00000000010000bf000000000000803f000000000000803f0000000000000000000080bf0000000000000000e0b35d3f00000000fdffff3e000000000000803f000000000000803f0000000000000000000080bf0000000000000000e0b35d3f00000000fdffffbe00000000ffff7f3f000000000000803f0000000000000000000080bf00000000000000000000000000000000000080bf000000000000803f000000000000803f0000000000000000000080bf0000000000000000 - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 0.8660259, y: 0, z: 1} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimizationFlags: 1 - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: --- !u!1 &1903332497 GameObject: m_ObjectHideFlags: 0 @@ -5924,38 +4198,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!1 &2044880246 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2044880247} - m_Layer: 0 - m_Name: Collection - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2044880247 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044880246} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 239243193} - m_Father: {fileID: 1691753947} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2052145309 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Tests/Editor/Editor.asmdef b/Assets/Tests/Editor/Editor.asmdef index a912c1c..6e33215 100644 --- a/Assets/Tests/Editor/Editor.asmdef +++ b/Assets/Tests/Editor/Editor.asmdef @@ -14,7 +14,8 @@ "overrideReferences": true, "precompiledReferences": [ "nunit.framework.dll", - "SpeckleCore2.dll" + "SpeckleCore2.dll", + "Objects.dll" ], "autoReferenced": false, "defineConstraints": [ diff --git a/Assets/Tests/Editor/PerformanceTest.cs b/Assets/Tests/Editor/PerformanceTest.cs index e54f514..cc6a0a9 100644 --- a/Assets/Tests/Editor/PerformanceTest.cs +++ b/Assets/Tests/Editor/PerformanceTest.cs @@ -4,20 +4,23 @@ using System.Collections; using System.Diagnostics; using System.Threading.Tasks; using NUnit.Framework; +using Objects.Utils; using Speckle.Core.Api; +using Speckle.Core.Models; +using Speckle.Core.Models.Extensions; using UnityEngine; using UnityEngine.TestTools; public class PerformanceTest { - //This method is much faster private static readonly string[] dataSource = new[] { "https://latest.speckle.dev/streams/24c3741255/commits/0925840e09" }; + //This method is much faster [Test, TestCaseSource(nameof(dataSource))] public void Receive_GetAwaiterResult(string stream) { @@ -64,4 +67,30 @@ public class PerformanceTest // } + + + //This method takes around 46 seconds to complete + [Test] + public void TestTriangulate() + { + + + Base b = Task.Run(async () => + { + return await Helpers.Receive("https://speckle.xyz/streams/4a8fd0c6b6/commits/067bf723b1"); + }).GetAwaiter().GetResult(); + + + foreach (Base child in b.Traverse(b => b is Objects.Geometry.Mesh)) + { + if(child is not Objects.Geometry.Mesh m) continue; + + var stopwatch = Stopwatch.StartNew(); + + m.TriangulateMesh(); + + Console.WriteLine($"took {stopwatch.ElapsedMilliseconds:ms} to triangulate {child.id}"); + } + } + } diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb b/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb deleted file mode 100644 index f5eb9be5c5d5c1f62feea7649853a6be601e6e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91584 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 diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb.meta b/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb.meta deleted file mode 100644 index e1c537c..0000000 --- a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.pdb.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7904119b19d26704992c8ae655b75335 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor.meta b/Packages/systems.speckle.speckle-unity/Editor.meta similarity index 77% rename from Packages/systems.speckle.speckle-unity/Components/Editor.meta rename to Packages/systems.speckle.speckle-unity/Editor.meta index 12f0885..7a3df7b 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor.meta +++ b/Packages/systems.speckle.speckle-unity/Editor.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c988c8263f4d7324fac5398bd76b9812 +guid: d46af7c830c7c22499c82b7935610b83 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor.meta b/Packages/systems.speckle.speckle-unity/Editor/Components.meta similarity index 77% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor.meta rename to Packages/systems.speckle.speckle-unity/Editor/Components.meta index c76453b..4b56027 100644 --- a/Packages/systems.speckle.speckle-unity/NativeCache/Editor.meta +++ b/Packages/systems.speckle.speckle-unity/Editor/Components.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8fa50e4bdeaa3e94d942d3a9f137d91c +guid: 0f18c15bbb6287d438b34e86d33385a4 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Editor/Components/Speckle.ConnectorUnity.Components.Editor.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef rename to Packages/systems.speckle.speckle-unity/Editor/Components/Speckle.ConnectorUnity.Components.Editor.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef.meta b/Packages/systems.speckle.speckle-unity/Editor/Components/Speckle.ConnectorUnity.Components.Editor.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/Speckle.ConnectorUnity.Components.Editor.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Editor/Components/Speckle.ConnectorUnity.Components.Editor.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs similarity index 96% rename from Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs rename to Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs index 422b5cc..9ea7719 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Concurrent; using System.Linq; using System.Reflection; -using System.Threading; using System.Threading.Tasks; using Speckle.Core.Api; using Speckle.Core.Models; @@ -18,13 +17,12 @@ namespace Speckle.ConnectorUnity.Components.Editor { private bool foldOutStatus = true; private Texture2D? previewImage; - + public void OnEnable() { var speckleReceiver = (SpeckleReceiver) target; UpdatePreviewImage(); speckleReceiver.OnCommitSelectionChange.AddListener(_ => UpdatePreviewImage()); - Debug.Log(Assembly.GetAssembly(typeof(SpeckleReceiverEditor)).FullName); } private void UpdatePreviewImage() @@ -70,7 +68,7 @@ namespace Speckle.ConnectorUnity.Components.Editor if (commitObject == null) return null; var gameObject = Convert(speckleReceiver, commitObject, commit.id); - Debug.Log($"Successfully received and converted {commit.id}", target); + Debug.Log($"Successfully received and converted commit: {commit.id}", target); return gameObject; } diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleReceiverEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs similarity index 94% rename from Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs rename to Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs index 22096cf..e566d1c 100644 --- a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; @@ -68,6 +69,11 @@ namespace Speckle.ConnectorUnity.Components.Editor }; //TODO onError action? + if (data["@objects"] is IList l && l.Count == 0) + { + Debug.LogWarning($"Nothing to send", speckleSender); + return null; + } return await speckleSender.SendDataAsync(data, true); } diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/SpeckleSendEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs rename to Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Editor/StreamManagerEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta b/Packages/systems.speckle.speckle-unity/Editor/NativeCache.meta similarity index 77% rename from Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta rename to Packages/systems.speckle.speckle-unity/Editor/NativeCache.meta index b2f96e3..81688b2 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/Editor.meta +++ b/Packages/systems.speckle.speckle-unity/Editor/NativeCache.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 82f8a9bc0a75c5a4886e84400405ce54 +guid: 254dd1112a6cc5f42bbcd30cec59e189 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/AssetDBNativeCache.cs b/Packages/systems.speckle.speckle-unity/Editor/NativeCache/AssetDBNativeCache.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor/AssetDBNativeCache.cs rename to Packages/systems.speckle.speckle-unity/Editor/NativeCache/AssetDBNativeCache.cs diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/AssetDBNativeCache.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/NativeCache/AssetDBNativeCache.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor/AssetDBNativeCache.cs.meta rename to Packages/systems.speckle.speckle-unity/Editor/NativeCache/AssetDBNativeCache.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Editor/NativeCache/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef rename to Packages/systems.speckle.speckle-unity/Editor/NativeCache/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta b/Packages/systems.speckle.speckle-unity/Editor/NativeCache/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Editor/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Editor/NativeCache/Speckle.ConnectorUnity.NativeCaches.Editor.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta b/Packages/systems.speckle.speckle-unity/Editor/Wrappers.meta similarity index 77% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers.meta index 983683e..523999c 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor.meta +++ b/Packages/systems.speckle.speckle-unity/Editor/Wrappers.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3d5d6adc3dd4d864fbba5c498ee6f943 +guid: 1c7021551a0cb904a99a6d1006a46ac0 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection.meta b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection.meta new file mode 100644 index 0000000..b111cda --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64cbde278ee784249ba9f6dcf4ddd4b3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/Editor/StreamSelectionEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef similarity index 72% rename from Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef index a71ea7d..9df99e3 100644 --- a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef +++ b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef @@ -1,7 +1,9 @@ { - "name": "Wrappers.Editor", + "name": "Speckle.ConnectorUnity.Wrappers.Editor", "rootNamespace": "Speckle.ConnectorUnity", - "references": ["GUID:d274441ecc3eb3f43b093eec1503d681"], + "references": [ + "GUID:d274441ecc3eb3f43b093eec1503d681" + ], "includePlatforms": [ "Editor" ], diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef.meta b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Editor/Wrappers.Editor.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers/Speckle.ConnectorUnity.Wrappers.Editor.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/SpecklePropertiesEditor.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers/SpecklePropertiesEditor.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs.meta b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/SpecklePropertiesEditor.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Editor/SpecklePropertiesEditor.cs.meta rename to Packages/systems.speckle.speckle-unity/Editor/Wrappers/SpecklePropertiesEditor.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.pdb b/Packages/systems.speckle.speckle-unity/Objects/Objects.pdb deleted file mode 100644 index 2a319a799b628d0ffbe66fb8ad9f6ce8b6adf7b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141504 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 /// Fetches the commit preview for the currently selected commit /// + /// when , will fetch 360 degree preview image /// Callback function to be called when the web request completes /// if , , or was - public bool GetPreviewImage(Action callback) + public bool GetPreviewImage(/*bool allAngles,*/ Action callback) { Account? account = Account.Selected; if (account == null) return false; @@ -243,13 +244,35 @@ namespace Speckle.ConnectorUnity.Components if (streamId == null) return false; string? commitId = Commit.Selected?.id; if (commitId == null) return false; - string url = $"{account.serverInfo.url}/preview/{streamId}/commits/{commitId}"; + + string angles = /*allAngles ? "all" :*/ ""; + string url = $"{account.serverInfo.url}/preview/{streamId}/commits/{commitId}/{angles}"; string authToken = account.token; StartCoroutine(Utils.Utils.GetImageRoutine(url, authToken, callback)); return true; } +#if UNITY_EDITOR + [ContextMenu("Open Speckle Stream in Browser")] + protected void OpenUrlInBrowser() + { + string url = GetSelectedUrl(); + Application.OpenURL(url); + } +#endif + public string GetSelectedUrl() + { + string serverUrl = Account.Selected!.serverInfo.url; + string? streamId = Stream.Selected?.id; + string? branchName = Branch.Selected?.name; + string? commitId = Commit.Selected?.id; + + if (string.IsNullOrEmpty(streamId)) return serverUrl; + if (!string.IsNullOrEmpty(commitId)) return $"{serverUrl}/streams/{streamId}/commits/{commitId}"; + if (!string.IsNullOrEmpty(branchName)) return $"{serverUrl}/streams/{streamId}/branches/{branchName}"; + return $"{serverUrl}/streams/{streamId}"; + } public void Awake() { @@ -288,266 +311,3 @@ namespace Speckle.ConnectorUnity.Components } } } - - - - - -// using System; -// using System.Collections.Concurrent; -// using System.Diagnostics.CodeAnalysis; -// using System.Threading; -// using System.Threading.Tasks; -// using Speckle.ConnectorUnity.Wrappers.Selection; -// using Speckle.Core.Api; -// using Speckle.Core.Credentials; -// using Speckle.Core.Kits; -// using Speckle.Core.Logging; -// using Speckle.Core.Models; -// using Speckle.Core.Transports; -// using UnityEngine; -// using UnityEngine.Events; -// -// namespace Speckle.ConnectorUnity.Components -// { -// [ExecuteAlways] -// [AddComponentMenu("Speckle/Speckle Receiver")] -// [RequireComponent(typeof(RecursiveConverter))] -// public class SpeckleReceiver : MonoBehaviour -// { -// [field: SerializeReference] -// public AccountSelection Account { get; protected set; } -// -// [field: SerializeReference] -// public StreamSelection Stream { get; protected set; } -// -// [field: SerializeReference] -// public BranchSelection Branch { get; protected set; } -// -// [field: SerializeReference] -// public CommitSelection Commit { get; protected set; } -// -// public RecursiveConverter Converter { get; protected set; } -// -// private CancellationTokenSource cancellationTokenSource; -// -// [Header("Events")] -// public UnityEvent OnCommitSelectionChange; -// public UnityEvent> OnReceiveProgressAction; -// public UnityEvent OnErrorAction; -// public UnityEvent OnTotalChildrenCountKnown; -// public UnityEvent OnComplete; -// -// #nullable enable -// -// void Awake() -// { -// cancellationTokenSource = new CancellationTokenSource(); -// -// Commit = GetComponent(); -// if (Commit == null) Commit = gameObject.AddComponent(); -// -// Converter = GetComponent(); -// if (Converter == null) Converter = gameObject.AddComponent(); -// } -// -// protected void Start() -// { -// Commit.OnSelectionChange.AddListener(() => OnCommitSelectionChange?.Invoke(Commit.Selected)); -// Branch = Commit.BranchSelection; -// Stream = Branch.StreamSelection; -// Account = Stream.AccountSelection; -// -// if (Account.Options is not {Length: > 0}) -// Account.RefreshOptions(); -// -// } -// -// -// /// -// /// -// /// -// /// -// /// -// /// -// /// error messages for -// /// true if selection is complete, as we are ready to receive -// public bool GetSelection( -// [NotNullWhen(true)] out Client? client, -// [NotNullWhen(true)] out Stream? stream, -// [NotNullWhen(true)] out Commit? commit, -// [NotNullWhen(false)] out string? error) -// { -// Account? account = Account.Selected; -// stream = Stream.Selected; -// commit = Commit.Selected; -// -// if (account == null) -// { -// error = "Selected Account is null"; -// client = null; -// return false; -// } -// client = Account.Client ?? new Client(account); -// -// if (stream == null) -// { -// error = "Selected Stream is null"; -// return false; -// } -// -// if (commit == null) -// { -// error = "Selected Commit is null"; -// return false; -// } -// error = null; -// return true; -// } -// -// -// /// -// /// Receives the selected commit object using async Task -// /// -// /// -// /// Awaitable commit object -// /// thrown when selection is incomplete -// public async Task ReceiveAsync(CancellationToken token) -// { -// if(!GetSelection(out Client? client, out Stream? stream, out Commit? commit, out string? error)) -// throw new SpeckleException(error); -// -// return await ReceiveAsync( -// token: token, -// client: client, -// streamId: stream.id, -// objectId: commit.referencedObject, -// commitId: commit.id, -// onProgressAction: dict => OnReceiveProgressAction.Invoke(dict), -// onErrorAction: (m, e) => OnErrorAction.Invoke(m, e), -// onTotalChildrenCountKnown: c => OnTotalChildrenCountKnown.Invoke(c) -// ); -// } -// -// /// -// /// Receives the requested using async Task -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// public static async Task ReceiveAsync(CancellationToken token, -// Client client, -// string streamId, -// string objectId, -// string? commitId, -// Action>? onProgressAction = null, -// Action? onErrorAction = null, -// Action? onTotalChildrenCountKnown = null) -// { -// ServerTransport transport = new ServerTransport(client.Account, streamId); -// transport.CancellationToken = token; -// -// Base? ret = null; -// try -// { -// Analytics.TrackEvent(client.Account, Analytics.Events.Receive); -// -// token.ThrowIfCancellationRequested(); -// -// ret = await Operations.Receive( -// objectId: objectId, -// cancellationToken: token, -// remoteTransport: transport, -// onProgressAction: onProgressAction, -// onErrorAction: onErrorAction, -// onTotalChildrenCountKnown: onTotalChildrenCountKnown, -// disposeTransports: true -// ); -// -// token.ThrowIfCancellationRequested(); -// -// //Read receipt -// try -// { -// await client.CommitReceived(token, new CommitReceivedInput -// { -// streamId = streamId, -// commitId = commitId, -// message = $"received commit from {Application.unityVersion}", -// sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()) -// }); -// } -// catch (Exception e) -// { -// // Do nothing! -// Debug.LogWarning($"Failed to send read receipt\n{e}"); -// } -// } -// catch (Exception e) -// { -// onErrorAction?.Invoke(e.Message, e); -// } -// finally -// { -// transport?.Dispose(); -// } -// -// return ret; -// } -// -// /// -// /// Helper method for using . -// /// Creates blank GameObjects for each property/category of the root object. -// /// -// /// The commitObject to convert -// /// The name of the parent to create -// /// Callback for each object converted -// /// The created parent -// public GameObject ConvertToNativeWithCategories(Base @base, string rootObjectName, -// Action? beforeConvertCallback) -// { -// var rootObject = new GameObject(rootObjectName); -// -// bool Predicate(Base o) -// { -// beforeConvertCallback?.Invoke(o); -// return Converter.ConverterInstance.CanConvertToNative(o) //Accept geometry -// || o.speckle_type == nameof(Base) && o.totalChildrenCount > 0; // Or Base objects that have children -// } -// -// -// // For the rootObject only, we will create property GameObjects -// // i.e. revit categories -// foreach (var prop in @base.GetMembers()) -// { -// var converted = Converter.RecursivelyConvertToNative(prop.Value, null, Predicate); -// -// //Skip empties -// if (converted.Count <= 0) continue; -// -// var propertyObject = new GameObject(prop.Key); -// propertyObject.transform.SetParent(rootObject.transform); -// foreach (var o in converted) -// { -// if (o.transform.parent == null) o.transform.SetParent(propertyObject.transform); -// } -// } -// -// return rootObject; -// } -// -// -// public void OnDestroy() -// { -// cancellationTokenSource?.Cancel(); -// cancellationTokenSource?.Dispose(); -// } -// -// } -// } diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs similarity index 88% rename from Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs index dfcd2f0..3ab8a48 100644 --- a/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs @@ -64,6 +64,7 @@ namespace Speckle.ConnectorUnity.Components ); } + public static async Task SendDataAsync(ServerTransport remoteTransport, Base data, @@ -107,7 +108,7 @@ namespace Speckle.ConnectorUnity.Components branchName = branchName, objectId = objectId, message = message ?? $"Sent {count} objects from Unity", - sourceApplication = HostApplications.Unity.Name, + sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()), totalChildrenCount = (int)count, }); @@ -148,6 +149,26 @@ namespace Speckle.ConnectorUnity.Components } +#if UNITY_EDITOR + [ContextMenu("Open Speckle Stream in Browser")] + protected void OpenUrlInBrowser() + { + string url = GetSelectedUrl(); + Application.OpenURL(url); + } +#endif + public string GetSelectedUrl() + { + string serverUrl = Account.Selected!.serverInfo.url; + string? streamId = Stream.Selected?.id; + string? branchName = Branch.Selected?.name; + + if (string.IsNullOrEmpty(streamId)) return serverUrl; + if (!string.IsNullOrEmpty(branchName)) return $"{serverUrl}/streams/{streamId}/branches/{branchName}"; + return $"{serverUrl}/streams/{streamId}"; + } + + public void Awake() { Initialise(true); @@ -159,6 +180,7 @@ namespace Speckle.ConnectorUnity.Components Account ??= new AccountSelection(); Stream ??= new StreamSelection(Account); Branch ??= new BranchSelection(Stream); + Branch.CommitsLimit = 0; Stream.Initialise(); Branch.Initialise(); Branch.OnSelectionChange = () => OnBranchSelectionChange.Invoke(Branch.Selected); diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/SpeckleSender.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/StreamManager.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/StreamManager.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/StreamManager.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/StreamManager.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/Converter.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/Converter.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/Converter.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/Converter.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/Converter.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.BuiltElements.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.BuiltElements.cs diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.BuiltElements.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.BuiltElements.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.BuiltElements.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Geometry.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Geometry.cs diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Geometry.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Geometry.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Geometry.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Mesh.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Mesh.cs diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Mesh.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Mesh.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Mesh.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Units.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Units.cs diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Units.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.Units.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.Units.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.cs diff --git a/Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Converter/Unity/ConverterUnity.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Converter/Unity/ConverterUnity.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Core.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.Websocket.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.Websocket.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.Websocket.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.Websocket.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.Websocket.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.Websocket.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.Websocket.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.Websocket.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.Abstractions.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.Abstractions.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Client.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Client.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Primitives.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Primitives.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Primitives.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Primitives.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/GraphQL.Primitives.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Primitives.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/GraphQL.Primitives.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/GraphQL.Primitives.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/Microsoft.Bcl.AsyncInterfaces.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Bcl.AsyncInterfaces.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Microsoft.Bcl.AsyncInterfaces.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Bcl.AsyncInterfaces.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/Microsoft.Bcl.AsyncInterfaces.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Bcl.AsyncInterfaces.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Microsoft.Bcl.AsyncInterfaces.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Bcl.AsyncInterfaces.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/Microsoft.Data.Sqlite.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Data.Sqlite.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Microsoft.Data.Sqlite.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Data.Sqlite.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/Microsoft.Data.Sqlite.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Data.Sqlite.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Microsoft.Data.Sqlite.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Microsoft.Data.Sqlite.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.batteries_v2.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.batteries_v2.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.batteries_v2.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.batteries_v2.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.batteries_v2.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.batteries_v2.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.batteries_v2.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.batteries_v2.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.core.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.core.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.core.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.core.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.core.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.core.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.core.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.core.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.provider.e_sqlite3.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.provider.e_sqlite3.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.provider.e_sqlite3.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.provider.e_sqlite3.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.provider.e_sqlite3.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.provider.e_sqlite3.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SQLitePCLRaw.provider.e_sqlite3.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SQLitePCLRaw.provider.e_sqlite3.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/Sentry.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/Sentry.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Sentry.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Sentry.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/Sentry.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/Sentry.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Sentry.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Sentry.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/Speckle.Newtonsoft.Json.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/Speckle.Newtonsoft.Json.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Speckle.Newtonsoft.Json.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Speckle.Newtonsoft.Json.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/Speckle.Newtonsoft.Json.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/Speckle.Newtonsoft.Json.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/Speckle.Newtonsoft.Json.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/Speckle.Newtonsoft.Json.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.deps.json b/Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.deps.json similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.deps.json rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.deps.json diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.deps.json.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.deps.json.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.deps.json.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.deps.json.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.xml b/Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.xml similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.xml rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.xml diff --git a/Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.xml.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.xml.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/SpeckleCore2.xml.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/SpeckleCore2.xml.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Buffers.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Buffers.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Buffers.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Buffers.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Buffers.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Buffers.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Buffers.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Buffers.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Collections.Immutable.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Collections.Immutable.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Collections.Immutable.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Collections.Immutable.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Collections.Immutable.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Collections.Immutable.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Collections.Immutable.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Collections.Immutable.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Memory.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Memory.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Memory.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Memory.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Memory.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Memory.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Memory.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Memory.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Numerics.Vectors.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Numerics.Vectors.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Numerics.Vectors.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Numerics.Vectors.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Numerics.Vectors.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Numerics.Vectors.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Numerics.Vectors.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Numerics.Vectors.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Reactive.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reactive.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Reactive.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reactive.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Reactive.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reactive.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Reactive.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reactive.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Reflection.Metadata.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reflection.Metadata.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Reflection.Metadata.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reflection.Metadata.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Reflection.Metadata.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reflection.Metadata.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Reflection.Metadata.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Reflection.Metadata.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Runtime.CompilerServices.Unsafe.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Runtime.CompilerServices.Unsafe.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Runtime.CompilerServices.Unsafe.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Runtime.CompilerServices.Unsafe.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Runtime.CompilerServices.Unsafe.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Runtime.CompilerServices.Unsafe.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Runtime.CompilerServices.Unsafe.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Runtime.CompilerServices.Unsafe.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Text.Encodings.Web.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Encodings.Web.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Text.Encodings.Web.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Encodings.Web.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Text.Encodings.Web.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Encodings.Web.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Text.Encodings.Web.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Encodings.Web.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Text.Json.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Json.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Text.Json.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Json.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Text.Json.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Json.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Text.Json.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Text.Json.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Threading.Tasks.Extensions.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Threading.Tasks.Extensions.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Threading.Tasks.Extensions.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Threading.Tasks.Extensions.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/System.Threading.Tasks.Extensions.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/System.Threading.Tasks.Extensions.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/System.Threading.Tasks.Extensions.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/System.Threading.Tasks.Extensions.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm/native/libe_sqlite3.so b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm/native/libe_sqlite3.so similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm/native/libe_sqlite3.so rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm/native/libe_sqlite3.so diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm/native/libe_sqlite3.so.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm/native/libe_sqlite3.so.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm/native/libe_sqlite3.so.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm/native/libe_sqlite3.so.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm64.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm64.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm64/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm64/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm64/native/libe_sqlite3.so b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64/native/libe_sqlite3.so similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm64/native/libe_sqlite3.so rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64/native/libe_sqlite3.so diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-arm64/native/libe_sqlite3.so.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64/native/libe_sqlite3.so.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-arm64/native/libe_sqlite3.so.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-arm64/native/libe_sqlite3.so.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-x64.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-x64.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-x64/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-x64/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-x64/native/libe_sqlite3.so b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64/native/libe_sqlite3.so similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-x64/native/libe_sqlite3.so rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64/native/libe_sqlite3.so diff --git a/Packages/systems.speckle.speckle-unity/Core/linux-x64/native/libe_sqlite3.so.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64/native/libe_sqlite3.so.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/linux-x64/native/libe_sqlite3.so.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/linux-x64/native/libe_sqlite3.so.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-arm64.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-arm64.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-arm64/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-arm64/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-arm64/native/libe_sqlite3.dylib b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64/native/libe_sqlite3.dylib similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-arm64/native/libe_sqlite3.dylib rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64/native/libe_sqlite3.dylib diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-arm64/native/libe_sqlite3.dylib.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64/native/libe_sqlite3.dylib.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-arm64/native/libe_sqlite3.dylib.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-arm64/native/libe_sqlite3.dylib.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-x64.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-x64.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-x64/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-x64/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-x64/native/libe_sqlite3.dylib b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64/native/libe_sqlite3.dylib similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-x64/native/libe_sqlite3.dylib rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64/native/libe_sqlite3.dylib diff --git a/Packages/systems.speckle.speckle-unity/Core/osx-x64/native/libe_sqlite3.dylib.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64/native/libe_sqlite3.dylib.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/osx-x64/native/libe_sqlite3.dylib.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/osx-x64/native/libe_sqlite3.dylib.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x64.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x64.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x64/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x64/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x64/native/e_sqlite3.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native/e_sqlite3.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x64/native/e_sqlite3.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native/e_sqlite3.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x64/native/e_sqlite3.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native/e_sqlite3.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x64/native/e_sqlite3.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native/e_sqlite3.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x86.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x86.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x86/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86/native.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x86/native.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86/native.meta diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x86/native/e_sqlite3.dll b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86/native/e_sqlite3.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x86/native/e_sqlite3.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86/native/e_sqlite3.dll diff --git a/Packages/systems.speckle.speckle-unity/Core/win-x86/native/e_sqlite3.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86/native/e_sqlite3.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Core/win-x86/native/e_sqlite3.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Core/win-x86/native/e_sqlite3.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Dispatcher.cs b/Packages/systems.speckle.speckle-unity/Runtime/Dispatcher.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Dispatcher.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Dispatcher.cs diff --git a/Packages/systems.speckle.speckle-unity/Dispatcher.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Dispatcher.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Dispatcher.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Dispatcher.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Factories.meta b/Packages/systems.speckle.speckle-unity/Runtime/Factories.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Factories.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Factories.meta diff --git a/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs b/Packages/systems.speckle.speckle-unity/Runtime/Factories/ConverterFactory.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Factories/ConverterFactory.cs diff --git a/Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Factories/ConverterFactory.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Factories/ConverterFactory.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Factories/ConverterFactory.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Factories/Speckle.ConnectorUnity.Factories.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Factories/Speckle.ConnectorUnity.Factories.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Factories/Speckle.ConnectorUnity.Factories.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/AbstractNativeCache.cs b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AbstractNativeCache.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/AbstractNativeCache.cs rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AbstractNativeCache.cs diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/AbstractNativeCache.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AbstractNativeCache.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/AbstractNativeCache.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AbstractNativeCache.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/AggregateNativeCache.cs b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AggregateNativeCache.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/AggregateNativeCache.cs rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AggregateNativeCache.cs diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/AggregateNativeCache.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AggregateNativeCache.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/AggregateNativeCache.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/AggregateNativeCache.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/MemoryNativeCache.cs b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/MemoryNativeCache.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/MemoryNativeCache.cs rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/MemoryNativeCache.cs diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/MemoryNativeCache.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/MemoryNativeCache.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/MemoryNativeCache.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/MemoryNativeCache.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/ResourcesNativeCache.cs b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/ResourcesNativeCache.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/ResourcesNativeCache.cs rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/ResourcesNativeCache.cs diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/ResourcesNativeCache.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/ResourcesNativeCache.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/ResourcesNativeCache.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/ResourcesNativeCache.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef diff --git a/Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCache/Speckle.ConnectorUnity.NativeCaches.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/NativeCacheFactory.cs b/Packages/systems.speckle.speckle-unity/Runtime/NativeCacheFactory.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCacheFactory.cs rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCacheFactory.cs diff --git a/Packages/systems.speckle.speckle-unity/NativeCacheFactory.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/NativeCacheFactory.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/NativeCacheFactory.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/NativeCacheFactory.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Objects.meta b/Packages/systems.speckle.speckle-unity/Runtime/Objects.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Objects.meta diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.deps.json b/Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.deps.json similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.deps.json rename to Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.deps.json diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.deps.json.meta b/Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.deps.json.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.deps.json.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.deps.json.meta diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.dll b/Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.dll similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.dll rename to Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.dll diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.dll.meta b/Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.dll.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.dll.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.dll.meta diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.xml b/Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.xml similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.xml rename to Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.xml diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.xml.meta b/Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.xml.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.xml.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Objects/Objects.xml.meta diff --git a/Packages/systems.speckle.speckle-unity/Parallel Extensions.meta b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Parallel Extensions.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions.meta diff --git a/Packages/systems.speckle.speckle-unity/Parallel Extensions/CoordinationDataStructures.meta b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/CoordinationDataStructures.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Parallel Extensions/CoordinationDataStructures.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/CoordinationDataStructures.meta diff --git a/Packages/systems.speckle.speckle-unity/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs diff --git a/Packages/systems.speckle.speckle-unity/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/CoordinationDataStructures/ObservableConcurrentDictionary.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt new file mode 100644 index 0000000..33beecb --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt @@ -0,0 +1,20 @@ +MICROSOFT LIMITED PUBLIC LICENSE version 1.1 +This license governs use of code marked as “sample” or “example” available on this web site without a license agreement, as provided under the section above titled “NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE.” If you use such code (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. +(F) Platform Limitation - The licenses granted in sections 2(A) and 2(B) extend only to the software or derivative works that you create that run directly on a Microsoft Windows operating system product, Microsoft run-time technology (such as the .NET Framework or Silverlight), or Microsoft application platform (such as Microsoft Office or Microsoft Dynamics). \ No newline at end of file diff --git a/Packages/systems.speckle.speckle-unity/Objects/Objects.pdb.meta b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt.meta similarity index 62% rename from Packages/systems.speckle.speckle-unity/Objects/Objects.pdb.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt.meta index 166dbd5..ac428f2 100644 --- a/Packages/systems.speckle.speckle-unity/Objects/Objects.pdb.meta +++ b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/LICENSE.txt.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: abbe34a21da4311498aec86f93fb7ac9 -DefaultImporter: +guid: e24af2f79449e8e47ada647e43854f87 +TextScriptImporter: externalObjects: {} userData: assetBundleName: diff --git a/Packages/systems.speckle.speckle-unity/Parallel Extensions/ParallelExtensionsExtras.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/ParallelExtensionsExtras.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Parallel Extensions/ParallelExtensionsExtras.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/ParallelExtensionsExtras.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Parallel Extensions/ParallelExtensionsExtras.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/ParallelExtensionsExtras.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Parallel Extensions/ParallelExtensionsExtras.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Parallel Extensions/ParallelExtensionsExtras.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Speckle.Connector.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Speckle.Connector.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Speckle.Connector.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Speckle.Connector.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Speckle.Connector.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Streams.cs b/Packages/systems.speckle.speckle-unity/Runtime/Streams.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Streams.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Streams.cs diff --git a/Packages/systems.speckle.speckle-unity/Streams.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Streams.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Streams.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Streams.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Utils.meta b/Packages/systems.speckle.speckle-unity/Runtime/Utils.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Utils.meta diff --git a/Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs b/Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs diff --git a/Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/CoreUtils.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs b/Packages/systems.speckle.speckle-unity/Runtime/Utils/ObjectExtensions.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/ObjectExtensions.cs diff --git a/Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Utils/ObjectExtensions.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/ObjectExtensions.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/ObjectExtensions.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/Utils.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Utils/Utils.cs b/Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.cs similarity index 91% rename from Packages/systems.speckle.speckle-unity/Utils/Utils.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.cs index c6e9687..d9f7d41 100644 --- a/Packages/systems.speckle.speckle-unity/Utils/Utils.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.cs @@ -84,7 +84,12 @@ namespace Speckle.ConnectorUnity.Utils if(www.result != UnityWebRequest.Result.Success ) { - Debug.LogWarning( $"Error fetching image from {www.url}: {www.error}" ); + bool isDataError = www.result == UnityWebRequest.Result.DataProcessingError; + string error = isDataError + ? $"{www.result}: {www.downloadHandler.error}" + : www.error; + + Debug.LogWarning( $"Error fetching image from {www.url}: {error}" ); yield break; } Texture2D? texture = DownloadHandlerTexture.GetContent(www); diff --git a/Packages/systems.speckle.speckle-unity/Utils/Utils.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Utils/Utils.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Utils/Utils.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/AccountSelection.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/AccountSelection.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/AccountSelection.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/AccountSelection.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/AccountSelection.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/BranchSelection.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/BranchSelection.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/BranchSelection.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/BranchSelection.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/BranchSelection.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/CommitSelection.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/CommitSelection.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/CommitSelection.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/CommitSelection.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/CommitSelection.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/OptionSelection.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/OptionSelection.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/OptionSelection.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/OptionSelection.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/OptionSelection.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/StreamSelection.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/StreamSelection.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/StreamSelection.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Selection/StreamSelection.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Selection/StreamSelection.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/Speckle.ConnectorUnity.Wrappers.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/SpeckleProperties.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/SpeckleProperties.cs diff --git a/Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Wrappers/SpeckleProperties.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Wrappers/SpeckleProperties.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Wrappers/SpeckleProperties.cs.meta From 55c26f4bdd6f7f26b75f0d15a194e4a0fffa0694 Mon Sep 17 00:00:00 2001 From: JR-Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Thu, 17 Nov 2022 21:02:04 +0000 Subject: [PATCH 6/7] small improvements --- Assets/SpecklePlayground.unity | 516 +++++++----------- .../Components/SpeckleReceiverEditor.cs | 37 +- .../Editor/Components/SpeckleSendEditor.cs | 2 +- .../Editor/Components/StreamManagerEditor.cs | 1 + .../Components/RecursiveConverter.ToNative.cs | 2 +- .../Runtime/Components/SpeckleReceiver.cs | 40 +- .../Runtime/Components/SpeckleSender.cs | 33 +- .../Runtime/Components/StreamManager.cs | 3 +- .../package.json | 2 +- 9 files changed, 284 insertions(+), 352 deletions(-) diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index 6798aad..d7389d9 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -928,6 +928,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 194696812} m_CullTransparentMesh: 1 +--- !u!114 &199499463 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} + m_Name: + m_EditorClassIdentifier: + matchByName: 1 --- !u!1 &234733581 GameObject: m_ObjectHideFlags: 0 @@ -1056,165 +1069,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 310693430} m_CullTransparentMesh: 1 ---- !u!1 &344004928 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 344004931} - - component: {fileID: 344004930} - - component: {fileID: 344004933} - - component: {fileID: 344004932} - m_Layer: 0 - m_Name: New Editor Receiver - m_TagString: Untagged - m_Icon: {fileID: 2800000, guid: 4e64a121cf44e1846907649ee8b15dd3, type: 3} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &344004930 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 344004928} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ed6cbf9ce4dca0349997d163ec9bce7e, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: {fileID: 1954025585} ---- !u!4 &344004931 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 344004928} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 10 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &344004932 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 344004928} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b95e704835cc48444b81e33c978f6f7f, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722279309049907 - k__BackingField: - rid: 6366722279309049908 - k__BackingField: - rid: 6366722279309049909 - OnBranchSelectionChange: - m_PersistentCalls: - m_Calls: [] - OnErrorAction: - m_PersistentCalls: - m_Calls: [] - OnSendProgressAction: - m_PersistentCalls: - m_Calls: [] - references: - version: 2 - RefIds: - - rid: 6366722279309049907 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - - rid: 6366722279309049908 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: 50 - k__BackingField: - rid: 6366722279309049907 - - rid: 6366722279309049909 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: 30 - k__BackingField: 15 - k__BackingField: - rid: 6366722279309049908 ---- !u!114 &344004933 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 344004928} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722279309049910 - k__BackingField: - rid: 6366722279309049911 - k__BackingField: - rid: 6366722279309049912 - k__BackingField: - rid: 6366722279309049913 - OnCommitSelectionChange: - m_PersistentCalls: - m_Calls: [] - OnReceiveProgressAction: - m_PersistentCalls: - m_Calls: [] - OnErrorAction: - m_PersistentCalls: - m_Calls: [] - OnTotalChildrenCountKnown: - m_PersistentCalls: - m_Calls: [] - OnComplete: - m_PersistentCalls: - m_Calls: [] - references: - version: 2 - RefIds: - - rid: 6366722279309049910 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - - rid: 6366722279309049911 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 4 - k__BackingField: 50 - k__BackingField: - rid: 6366722279309049910 - - rid: 6366722279309049912 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: 30 - k__BackingField: 15 - k__BackingField: - rid: 6366722279309049911 - - rid: 6366722279309049913 - type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 2 - k__BackingField: - rid: 6366722279309049912 --- !u!1 &407638589 GameObject: m_ObjectHideFlags: 0 @@ -1616,6 +1470,18 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 +--- !u!114 &531517118 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &641375517 GameObject: m_ObjectHideFlags: 0 @@ -2008,19 +1874,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 762643242} m_CullTransparentMesh: 1 ---- !u!114 &816671309 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141ce93d2d159c0448b5b8b33b1c0679, type: 3} - m_Name: - m_EditorClassIdentifier: - path: Assets/Resources --- !u!1 &869165413 GameObject: m_ObjectHideFlags: 0 @@ -2115,19 +1968,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!114 &881240700 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} - m_Name: - m_EditorClassIdentifier: - matchByName: 1 --- !u!1 &907145429 GameObject: m_ObjectHideFlags: 0 @@ -2412,6 +2252,165 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_IsOn: 1 +--- !u!1 &1110616998 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1110617002} + - component: {fileID: 1110617005} + - component: {fileID: 1110617004} + - component: {fileID: 1110617003} + m_Layer: 0 + m_Name: Stream Manager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1110617002 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110616998} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1110617003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110616998} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b95e704835cc48444b81e33c978f6f7f, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722480099557406 + k__BackingField: + rid: 6366722480099557407 + k__BackingField: + rid: 6366722480099557408 + OnBranchSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnSendProgressAction: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 6366722480099557406 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + - rid: 6366722480099557407 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 2 + k__BackingField: 50 + k__BackingField: + rid: 6366722480099557406 + - rid: 6366722480099557408 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 30 + k__BackingField: 0 + k__BackingField: + rid: 6366722480099557407 +--- !u!114 &1110617004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110616998} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 6366722480099557402 + k__BackingField: + rid: 6366722480099557403 + k__BackingField: + rid: 6366722480099557404 + k__BackingField: + rid: 6366722480099557405 + OnCommitSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnReceiveProgressAction: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnTotalChildrenCountKnown: + m_PersistentCalls: + m_Calls: [] + OnComplete: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 6366722480099557402 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + - rid: 6366722480099557403 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 50 + k__BackingField: + rid: 6366722480099557402 + - rid: 6366722480099557404 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 30 + k__BackingField: 15 + k__BackingField: + rid: 6366722480099557403 + - rid: 6366722480099557405 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: + rid: 6366722480099557404 +--- !u!114 &1110617005 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110616998} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed6cbf9ce4dca0349997d163ec9bce7e, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: {fileID: 1267757521} --- !u!1 &1123579265 GameObject: m_ObjectHideFlags: 0 @@ -2630,6 +2629,21 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 +--- !u!114 &1267757521 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 88d6b4f2f80eaa14f9f07505f7e44ec2, type: 3} + m_Name: + m_EditorClassIdentifier: + nativeCaches: + - {fileID: 199499463} + - {fileID: 531517118} --- !u!1 &1279250012 GameObject: m_ObjectHideFlags: 0 @@ -2945,18 +2959,6 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 ---- !u!114 &1390840085 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1397973070 GameObject: m_ObjectHideFlags: 0 @@ -3045,22 +3047,6 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_IsOn: 1 ---- !u!114 &1409739885 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 88d6b4f2f80eaa14f9f07505f7e44ec2, type: 3} - m_Name: - m_EditorClassIdentifier: - nativeCaches: - - {fileID: 1852085904} - - {fileID: 816671309} - - {fileID: 1390840085} --- !u!1 &1464556211 GameObject: m_ObjectHideFlags: 0 @@ -3641,18 +3627,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1707872729} m_CullTransparentMesh: 1 ---- !u!114 &1722434596 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b3354e8208862c341940152f5340d41a, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1729237655 GameObject: m_ObjectHideFlags: 0 @@ -3765,19 +3739,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1762991479} m_CullTransparentMesh: 1 ---- !u!114 &1852085904 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} - m_Name: - m_EditorClassIdentifier: - matchByName: 1 --- !u!1 &1885647142 GameObject: m_ObjectHideFlags: 0 @@ -4082,21 +4043,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1903798475} m_CullTransparentMesh: 1 ---- !u!114 &1954025585 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 88d6b4f2f80eaa14f9f07505f7e44ec2, type: 3} - m_Name: - m_EditorClassIdentifier: - nativeCaches: - - {fileID: 881240700} - - {fileID: 1722434596} --- !u!1 &2014586909 GameObject: m_ObjectHideFlags: 0 @@ -4278,70 +4224,6 @@ MonoBehaviour: m_VerticalOverflow: 0 m_LineSpacing: 1 m_Text: 'Select a stream on:' ---- !u!1 &2060322465 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2060322467} - - component: {fileID: 2060322469} - - component: {fileID: 2060322468} - m_Layer: 0 - m_Name: EditorReceiver - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2060322467 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2060322465} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 110.63661, y: 38.49095, z: -36.923782} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2060322468 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2060322465} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 730f6d2eecf16994c918395debc877e7, type: 3} - m_Name: - m_EditorClassIdentifier: - SelectedAccountIndex: 0 - SelectedStreamIndex: 0 - SelectedBranchIndex: 0 - SelectedCommitIndex: 0 - OldSelectedAccountIndex: 0 - OldSelectedStreamIndex: 0 ---- !u!114 &2060322469 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2060322465} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ed6cbf9ce4dca0349997d163ec9bce7e, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: {fileID: 1409739885} --- !u!1 &2066864134 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs index 9ea7719..9579c11 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Concurrent; using System.Linq; -using System.Reflection; using System.Threading.Tasks; using Speckle.Core.Api; using Speckle.Core.Models; @@ -11,10 +10,11 @@ using UnityEngine; #nullable enable namespace Speckle.ConnectorUnity.Components.Editor { - [CustomEditor(typeof(SpeckleReceiver))] [CanEditMultipleObjects] + [CustomEditor(typeof(SpeckleReceiver))] public class SpeckleReceiverEditor : UnityEditor.Editor { + private static bool generateAssets = false; private bool foldOutStatus = true; private Texture2D? previewImage; @@ -23,6 +23,7 @@ namespace Speckle.ConnectorUnity.Components.Editor var speckleReceiver = (SpeckleReceiver) target; UpdatePreviewImage(); speckleReceiver.OnCommitSelectionChange.AddListener(_ => UpdatePreviewImage()); + UpdateGenerateAssets(); } private void UpdatePreviewImage() @@ -35,26 +36,45 @@ namespace Speckle.ConnectorUnity.Components.Editor { var speckleReceiver = (SpeckleReceiver) target; - - //Draw events in a collapsed region DrawDefaultInspector(); - + + //Preview image foldOutStatus = EditorGUILayout.Foldout(foldOutStatus, "Preview Image"); if (foldOutStatus) { Rect rect = GUILayoutUtility.GetAspectRect(7f/4f); if(previewImage != null) GUI.DrawTexture(rect, previewImage); } + + //Receive button bool receive = GUILayout.Button("Receive!"); - + + bool selection = EditorGUILayout.ToggleLeft("Generate Assets", generateAssets); + if (generateAssets != selection) + { + generateAssets = selection; + UpdateGenerateAssets(); + } + + + //TODO: Draw events in a collapsed region + + + if (receive) { - await Receive(speckleReceiver); + await ReceiveAndConvert(speckleReceiver); } } - public async Task Receive(SpeckleReceiver speckleReceiver) + private void UpdateGenerateAssets() + { + var speckleReceiver = (SpeckleReceiver) target; + speckleReceiver.Converter.AssetCache.nativeCaches = NativeCacheFactory.GetDefaultNativeCacheSetup(generateAssets); + } + + public async Task ReceiveAndConvert(SpeckleReceiver speckleReceiver) { speckleReceiver.CancellationTokenSource?.Cancel(); if (!speckleReceiver.GetSelection(out Client? client, out _, out Commit? commit, out string? error)) @@ -94,7 +114,6 @@ namespace Speckle.ConnectorUnity.Components.Editor return go; } - private async Task ReceiveCommit(SpeckleReceiver speckleReceiver, string serverLogName) { string message = $"Receiving data from {serverLogName}..."; diff --git a/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs index e566d1c..1fb2af0 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleSendEditor.cs @@ -39,8 +39,8 @@ namespace Speckle.ConnectorUnity.Components.Editor //Draw events in a collapsed region DrawDefaultInspector(); - selectedFilter = (SelectionFilter)EditorGUILayout.EnumPopup(selectedFilter); bool shouldSend = GUILayout.Button("Send!"); + selectedFilter = (SelectionFilter)EditorGUILayout.EnumPopup("Selection", selectedFilter); if (shouldSend) { diff --git a/Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs index c98f002..c070163 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Components/StreamManagerEditor.cs @@ -14,6 +14,7 @@ using UnityEngine; namespace Speckle.ConnectorUnity.Components.Editor { + [Obsolete] [CustomEditor(typeof(StreamManager))] [CanEditMultipleObjects] public class StreamManagerEditor : UnityEditor.Editor diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs index c7b7b08..d83cee1 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs @@ -54,7 +54,7 @@ namespace Speckle.ConnectorUnity.Components AssetCache.FinishWrite(); } - //TODO track event + //TODO track event? return createdGameObjects; diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs index a3a873a..1690c39 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; @@ -38,19 +39,35 @@ namespace Speckle.ConnectorUnity.Components [Header("Events")] [HideInInspector] - public UnityEvent OnCommitSelectionChange; + public CommitSelectionEvent OnCommitSelectionChange; [HideInInspector] - public UnityEvent> OnReceiveProgressAction; + public OperationProgressEvent OnReceiveProgressAction; [HideInInspector] - public UnityEvent OnErrorAction; + public ErrorActionEvent OnErrorAction; [HideInInspector] - public UnityEvent OnTotalChildrenCountKnown; + public ChildrenCountHandler OnTotalChildrenCountKnown; [HideInInspector] - public UnityEvent OnComplete; + public ReceiveCompleteHandler OnComplete; #nullable enable protected internal CancellationTokenSource? CancellationTokenSource { get; private set; } - + + //TODO runtime receiving + public IEnumerator ReceiveAndConvertRoutine(SpeckleReceiver speckleReceiver, string rootObjectName, Action? beforeConvertCallback = null) + { + Task receiveOperation = Task.Run(ReceiveAsync); + + yield return new WaitUntil(() => receiveOperation.IsCompleted); + + Base? b = receiveOperation.Result; + if (b == null) yield break; + + //TODO make routine break for each catergory/object + GameObject go = ConvertToNativeWithCategories(b, rootObjectName, beforeConvertCallback); + OnComplete.Invoke(go); + } + + /// /// Receives the selected commit object using async Task /// @@ -289,10 +306,10 @@ namespace Speckle.ConnectorUnity.Components Stream.Initialise(); Branch.Initialise(); Commit.Initialise(); - Commit.OnSelectionChange = () => OnCommitSelectionChange.Invoke(Commit.Selected); + Commit.OnSelectionChange = + () => OnCommitSelectionChange?.Invoke(Commit.Selected); if(Account.Options is not {Length: > 0} || forceRefresh) Account.RefreshOptions(); - } public void OnDestroy() @@ -310,4 +327,11 @@ namespace Speckle.ConnectorUnity.Components Initialise(); } } + + [Serializable] public sealed class CommitSelectionEvent : UnityEvent { } + [Serializable] public sealed class BranchSelectionEvent : UnityEvent { } + [Serializable] public sealed class ErrorActionEvent : UnityEvent { } + [Serializable] public sealed class OperationProgressEvent : UnityEvent> { } + [Serializable] public sealed class ReceiveCompleteHandler : UnityEvent { } + [Serializable] public sealed class ChildrenCountHandler : UnityEvent { } } diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs index 3ab8a48..66894db 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs @@ -12,7 +12,6 @@ using Speckle.Core.Logging; using Speckle.Core.Models; using Speckle.Core.Transports; using UnityEngine; -using UnityEngine.Events; namespace Speckle.ConnectorUnity.Components { @@ -34,14 +33,16 @@ namespace Speckle.ConnectorUnity.Components [Header("Events")] [HideInInspector] - public UnityEvent OnBranchSelectionChange; + public BranchSelectionEvent OnBranchSelectionChange; [HideInInspector] - public UnityEvent OnErrorAction; + public ErrorActionEvent OnErrorAction; [HideInInspector] - public UnityEvent> OnSendProgressAction; + public OperationProgressEvent OnSendProgressAction; #nullable enable protected internal CancellationTokenSource? CancellationTokenSource { get; private set; } - + + //TODO runtime sending + public async Task SendDataAsync(Base data, bool createCommit) { CancellationTokenSource?.Cancel(); @@ -53,25 +54,23 @@ namespace Speckle.ConnectorUnity.Components ServerTransport transport = new ServerTransport(client.Account, stream.id); transport.CancellationToken = CancellationTokenSource.Token; - return await SendDataAsync(transport, + return await SendDataAsync(CancellationTokenSource.Token, + remoteTransport: transport, data: data, client: client, branchName: branch.name, createCommit: createCommit, - cancellationToken: CancellationTokenSource.Token, onProgressAction: dict => OnSendProgressAction.Invoke(dict), onErrorAction: (m, e) => OnErrorAction.Invoke(m, e) ); } - - - public static async Task SendDataAsync(ServerTransport remoteTransport, + public static async Task SendDataAsync(CancellationToken cancellationToken, + ServerTransport remoteTransport, Base data, Client client, string branchName, bool createCommit, - CancellationToken cancellationToken, Action>? onProgressAction = null, Action? onErrorAction = null) { @@ -90,7 +89,7 @@ namespace Speckle.ConnectorUnity.Components if (createCommit && !cancellationToken.IsCancellationRequested) { string streamId = remoteTransport.StreamId; - string commitId = await CreateCommit(data, client, cancellationToken, streamId, branchName, res); + string commitId = await CreateCommit(cancellationToken, data, client, streamId, branchName, res); string url = $"{client.ServerUrl}/streams/{streamId}/commits/{commitId}"; Debug.Log($"Data successfully sent to {url}"); } @@ -98,7 +97,13 @@ namespace Speckle.ConnectorUnity.Components return res; } - public static async Task CreateCommit(Base data, Client client, CancellationToken cancellationToken, string streamId, string branchName, string objectId, string? message = null) + public static async Task CreateCommit(CancellationToken cancellationToken, + Base data, + Client client, + string streamId, + string branchName, + string objectId, + string? message = null) { long count = data.GetTotalChildrenCount(); string commitId = await client.CommitCreate(cancellationToken, @@ -183,7 +188,7 @@ namespace Speckle.ConnectorUnity.Components Branch.CommitsLimit = 0; Stream.Initialise(); Branch.Initialise(); - Branch.OnSelectionChange = () => OnBranchSelectionChange.Invoke(Branch.Selected); + Branch.OnSelectionChange = () => OnBranchSelectionChange?.Invoke(Branch.Selected); if(Account.Options is not {Length: > 0} || forceRefresh) Account.RefreshOptions(); } diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs index 0d42cbf..c886960 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs @@ -7,8 +7,9 @@ using UnityEngine; namespace Speckle.ConnectorUnity.Components { + [Obsolete("Replaced by new " + nameof(SpeckleReceiver))] [ExecuteAlways] - [AddComponentMenu("Speckle/Stream Manager")] + [AddComponentMenu("Speckle/Obsolete/Stream Manager")] [RequireComponent(typeof(RecursiveConverter))] public class StreamManager : MonoBehaviour { diff --git a/Packages/systems.speckle.speckle-unity/package.json b/Packages/systems.speckle.speckle-unity/package.json index c9ab8b6..a868f98 100644 --- a/Packages/systems.speckle.speckle-unity/package.json +++ b/Packages/systems.speckle.speckle-unity/package.json @@ -1,6 +1,6 @@ { "name": "systems.speckle.speckle-unity", - "version": "2.9.0", + "version": "2.10.0", "displayName": "Speckle Unity Connector", "description": "AEC Interoperability for Unity through Speckle", "unity": "2018.4", From 00f57f1bdd2a0083e761a53b4429c9eaa6541866 Mon Sep 17 00:00:00 2001 From: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Wed, 30 Nov 2022 17:34:00 +0000 Subject: [PATCH 7/7] feat(editor): Added entry in gameobject menu + minor bug fixes --- Assets/SpecklePlayground.unity | 358 +++++++++--------- Packages/manifest.json | 4 +- Packages/packages-lock.json | 6 +- .../Components/SpeckleReceiverEditor.cs | 30 ++ .../{ => Editor}/Gizmos.meta | 0 .../Editor/Gizmos/AccountDetails@128.png | Bin 0 -> 4768 bytes .../Editor/Gizmos/AccountDetails@128.png.meta | 147 +++++++ .../Editor/Gizmos/Accounts@128.png | Bin 0 -> 6311 bytes .../Editor/Gizmos/Accounts@128.png.meta | 147 +++++++ .../Gizmos/GetObjectValueByKey@128.png | Bin .../Gizmos/GetObjectValueByKey@128.png.meta | 0 .../{ => Editor}/Gizmos/Receiver@128.png | Bin .../{ => Editor}/Gizmos/Receiver@128.png.meta | 0 .../{ => Editor}/Gizmos/Sender@128.png | Bin .../{ => Editor}/Gizmos/Sender@128.png.meta | 0 .../Editor/Gizmos/StreamDetails@128.png | Bin 0 -> 5672 bytes .../Editor/Gizmos/StreamDetails@128.png.meta | 147 +++++++ .../{ => Editor}/Gizmos/StreamList@128.png | Bin .../Gizmos/StreamList@128.png.meta | 0 .../{ => Editor}/Gizmos/ToNative@128.png | Bin .../{ => Editor}/Gizmos/ToNative@128.png.meta | 0 .../{ => Editor}/Gizmos/ToSpeckle@128.png | Bin .../Gizmos/ToSpeckle@128.png.meta | 0 .../{ => Editor}/Gizmos/logo128.png | Bin .../{ => Editor}/Gizmos/logo128.png.meta | 0 .../Selection/StreamSelectionEditor.cs | 8 +- .../Runtime/Components/Deprecated.meta | 8 + .../Components/{ => Deprecated}/Receiver.cs | 0 .../{ => Deprecated}/Receiver.cs.meta | 0 .../Components/{ => Deprecated}/Sender.cs | 0 .../{ => Deprecated}/Sender.cs.meta | 0 .../{ => Deprecated}/StreamManager.cs | 0 .../{ => Deprecated}/StreamManager.cs.meta | 0 .../Runtime/Components/SpeckleReceiver.cs | 1 + .../Runtime/Components/SpeckleSender.cs | 14 +- .../Runtime/Core.meta | 2 +- .../Runtime/Core/win-x64.meta | 2 +- .../Runtime/Core/win-x64/native.meta | 2 +- .../Runtime/Utils/CoreUtils.cs | 7 +- ProjectSettings/ProjectVersion.txt | 4 +- ProjectSettings/TimelineSettings.asset | 1 + 41 files changed, 690 insertions(+), 198 deletions(-) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Gizmos/AccountDetails@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Gizmos/AccountDetails@128.png.meta create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Gizmos/Accounts@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Gizmos/Accounts@128.png.meta rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/GetObjectValueByKey@128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/GetObjectValueByKey@128.png.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/Receiver@128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/Receiver@128.png.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/Sender@128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/Sender@128.png.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamDetails@128.png create mode 100644 Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamDetails@128.png.meta rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/StreamList@128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/StreamList@128.png.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/ToNative@128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/ToNative@128.png.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/ToSpeckle@128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/ToSpeckle@128.png.meta (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/logo128.png (100%) rename Packages/systems.speckle.speckle-unity/{ => Editor}/Gizmos/logo128.png.meta (100%) create mode 100644 Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated.meta rename Packages/systems.speckle.speckle-unity/Runtime/Components/{ => Deprecated}/Receiver.cs (100%) rename Packages/systems.speckle.speckle-unity/Runtime/Components/{ => Deprecated}/Receiver.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/Runtime/Components/{ => Deprecated}/Sender.cs (100%) rename Packages/systems.speckle.speckle-unity/Runtime/Components/{ => Deprecated}/Sender.cs.meta (100%) rename Packages/systems.speckle.speckle-unity/Runtime/Components/{ => Deprecated}/StreamManager.cs (100%) rename Packages/systems.speckle.speckle-unity/Runtime/Components/{ => Deprecated}/StreamManager.cs.meta (100%) diff --git a/Assets/SpecklePlayground.unity b/Assets/SpecklePlayground.unity index d7389d9..d8a460c 100644 --- a/Assets/SpecklePlayground.unity +++ b/Assets/SpecklePlayground.unity @@ -928,19 +928,165 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 194696812} m_CullTransparentMesh: 1 ---- !u!114 &199499463 +--- !u!1 &218987857 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 218987861} + - component: {fileID: 218987860} + - component: {fileID: 218987859} + - component: {fileID: 218987858} + m_Layer: 0 + m_Name: Speckle Connector + m_TagString: Untagged + m_Icon: {fileID: 2800000, guid: ee2ed9d8fff3a1d4db5590491978062e, type: 3} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &218987858 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} + m_GameObject: {fileID: 218987857} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} + m_Script: {fileID: 11500000, guid: b95e704835cc48444b81e33c978f6f7f, type: 3} m_Name: m_EditorClassIdentifier: - matchByName: 1 + k__BackingField: + rid: 5855987529328361546 + k__BackingField: + rid: 5855987529328361547 + k__BackingField: + rid: 5855987529328361548 + OnBranchSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnSendProgressAction: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 5855987529328361546 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + - rid: 5855987529328361547 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 50 + k__BackingField: + rid: 5855987529328361546 + - rid: 5855987529328361548 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 30 + k__BackingField: 0 + k__BackingField: + rid: 5855987529328361547 +--- !u!114 &218987859 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218987857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + rid: 5855987529328361542 + k__BackingField: + rid: 5855987529328361543 + k__BackingField: + rid: 5855987529328361544 + k__BackingField: + rid: 5855987529328361545 + OnCommitSelectionChange: + m_PersistentCalls: + m_Calls: [] + OnReceiveProgressAction: + m_PersistentCalls: + m_Calls: [] + OnErrorAction: + m_PersistentCalls: + m_Calls: [] + OnTotalChildrenCountKnown: + m_PersistentCalls: + m_Calls: [] + OnComplete: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: + - rid: 5855987529328361542 + type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + - rid: 5855987529328361543 + type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 50 + k__BackingField: + rid: 5855987529328361542 + - rid: 5855987529328361544 + type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: 30 + k__BackingField: 15 + k__BackingField: + rid: 5855987529328361543 + - rid: 5855987529328361545 + type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} + data: + selectedIndex: 0 + k__BackingField: + rid: 5855987529328361544 +--- !u!114 &218987860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218987857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed6cbf9ce4dca0349997d163ec9bce7e, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: {fileID: 1710028308} +--- !u!4 &218987861 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218987857} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &234733581 GameObject: m_ObjectHideFlags: 0 @@ -1470,7 +1616,7 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 ---- !u!114 &531517118 +--- !u!114 &540478226 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2252,165 +2398,6 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_IsOn: 1 ---- !u!1 &1110616998 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1110617002} - - component: {fileID: 1110617005} - - component: {fileID: 1110617004} - - component: {fileID: 1110617003} - m_Layer: 0 - m_Name: Stream Manager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1110617002 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1110616998} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1110617003 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1110616998} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b95e704835cc48444b81e33c978f6f7f, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722480099557406 - k__BackingField: - rid: 6366722480099557407 - k__BackingField: - rid: 6366722480099557408 - OnBranchSelectionChange: - m_PersistentCalls: - m_Calls: [] - OnErrorAction: - m_PersistentCalls: - m_Calls: [] - OnSendProgressAction: - m_PersistentCalls: - m_Calls: [] - references: - version: 2 - RefIds: - - rid: 6366722480099557406 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - - rid: 6366722480099557407 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 2 - k__BackingField: 50 - k__BackingField: - rid: 6366722480099557406 - - rid: 6366722480099557408 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: 30 - k__BackingField: 0 - k__BackingField: - rid: 6366722480099557407 ---- !u!114 &1110617004 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1110616998} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0bc895f6cb37b674995dc13b79783c55, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: - rid: 6366722480099557402 - k__BackingField: - rid: 6366722480099557403 - k__BackingField: - rid: 6366722480099557404 - k__BackingField: - rid: 6366722480099557405 - OnCommitSelectionChange: - m_PersistentCalls: - m_Calls: [] - OnReceiveProgressAction: - m_PersistentCalls: - m_Calls: [] - OnErrorAction: - m_PersistentCalls: - m_Calls: [] - OnTotalChildrenCountKnown: - m_PersistentCalls: - m_Calls: [] - OnComplete: - m_PersistentCalls: - m_Calls: [] - references: - version: 2 - RefIds: - - rid: 6366722480099557402 - type: {class: AccountSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - - rid: 6366722480099557403 - type: {class: StreamSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: 50 - k__BackingField: - rid: 6366722480099557402 - - rid: 6366722480099557404 - type: {class: BranchSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: 30 - k__BackingField: 15 - k__BackingField: - rid: 6366722480099557403 - - rid: 6366722480099557405 - type: {class: CommitSelection, ns: Speckle.ConnectorUnity.Wrappers.Selection, asm: Speckle.ConnectorUnity.Wrappers} - data: - selectedIndex: 0 - k__BackingField: - rid: 6366722480099557404 ---- !u!114 &1110617005 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1110616998} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ed6cbf9ce4dca0349997d163ec9bce7e, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: {fileID: 1267757521} --- !u!1 &1123579265 GameObject: m_ObjectHideFlags: 0 @@ -2629,21 +2616,6 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 ---- !u!114 &1267757521 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 88d6b4f2f80eaa14f9f07505f7e44ec2, type: 3} - m_Name: - m_EditorClassIdentifier: - nativeCaches: - - {fileID: 199499463} - - {fileID: 531517118} --- !u!1 &1279250012 GameObject: m_ObjectHideFlags: 0 @@ -3627,6 +3599,21 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1707872729} m_CullTransparentMesh: 1 +--- !u!114 &1710028308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 88d6b4f2f80eaa14f9f07505f7e44ec2, type: 3} + m_Name: + m_EditorClassIdentifier: + nativeCaches: + - {fileID: 1771830985} + - {fileID: 540478226} --- !u!1 &1729237655 GameObject: m_ObjectHideFlags: 0 @@ -3739,6 +3726,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1762991479} m_CullTransparentMesh: 1 +--- !u!114 &1771830985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4a29c776298714c88f406ad39c6095, type: 3} + m_Name: + m_EditorClassIdentifier: + matchByName: 1 --- !u!1 &1885647142 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/manifest.json b/Packages/manifest.json index a7c4885..7833ac9 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,8 +1,8 @@ { "dependencies": { "com.unity.2d.sprite": "1.0.0", - "com.unity.collab-proxy": "1.17.2", - "com.unity.ide.rider": "3.0.15", + "com.unity.collab-proxy": "1.17.6", + "com.unity.ide.rider": "3.0.16", "com.unity.ide.visualstudio": "2.0.16", "com.unity.ide.vscode": "1.2.5", "com.unity.test-framework": "1.1.31", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index fcfecb2..f79ee66 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -7,7 +7,7 @@ "dependencies": {} }, "com.unity.collab-proxy": { - "version": "1.17.2", + "version": "1.17.6", "depth": 0, "source": "registry", "dependencies": { @@ -23,7 +23,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.15", + "version": "3.0.16", "depth": 0, "source": "registry", "dependencies": { @@ -55,7 +55,7 @@ "url": "https://packages.unity.com" }, "com.unity.services.core": { - "version": "1.4.2", + "version": "1.6.0", "depth": 1, "source": "registry", "dependencies": { diff --git a/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs index 9579c11..9625981 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Components/SpeckleReceiverEditor.cs @@ -19,6 +19,16 @@ namespace Speckle.ConnectorUnity.Components.Editor private Texture2D? previewImage; public void OnEnable() + { + Init(); + } + + public void Reset() + { + Init(); + } + + private void Init() { var speckleReceiver = (SpeckleReceiver) target; UpdatePreviewImage(); @@ -179,5 +189,25 @@ namespace Speckle.ConnectorUnity.Components.Editor ((SpeckleReceiver)target).CancellationTokenSource?.Cancel(); EditorApplication.delayCall += EditorUtility.ClearProgressBar; } + + [MenuItem("GameObject/Speckle/Speckle Connector", false, 10)] + static void CreateCustomGameObject(MenuCommand menuCommand) { + // Create a custom game object + GameObject go = new GameObject("Speckle Connector"); + // Ensure it gets reparented if this was a context click (otherwise does nothing) + GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject); + // Register the creation in the undo system + Undo.RegisterCreatedObjectUndo(go, "Create " + go.name); + Selection.activeObject = go; + + go.AddComponent(); + go.AddComponent(); + go.AddComponent(); + +#if UNITY_2021_2_OR_NEWER + var icon = AssetDatabase.LoadAssetAtPath("Packages/systems.speckle.speckle-unity/Editor/Gizmos/logo128.png"); + EditorGUIUtility.SetIconForObject(go, icon); +#endif + } } } diff --git a/Packages/systems.speckle.speckle-unity/Gizmos.meta b/Packages/systems.speckle.speckle-unity/Editor/Gizmos.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos.meta rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos.meta diff --git a/Packages/systems.speckle.speckle-unity/Editor/Gizmos/AccountDetails@128.png b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/AccountDetails@128.png new file mode 100644 index 0000000000000000000000000000000000000000..eb90e5268dc06d1724decc80c3e3c3adc86229db GIT binary patch literal 4768 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 e|4|*@%h$SQCJ_&iiS9Rs5L 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 literal 0 HcmV?d00001 diff --git a/Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamDetails@128.png.meta b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamDetails@128.png.meta new file mode 100644 index 0000000..7562860 --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamDetails@128.png.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: 2a6580bbc30b00f42b9acb33e5e77e5a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/StreamList@128.png b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamList@128.png similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/StreamList@128.png rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamList@128.png diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/StreamList@128.png.meta b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamList@128.png.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/StreamList@128.png.meta rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/StreamList@128.png.meta diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToNative@128.png similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToNative@128.png diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png.meta b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToNative@128.png.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/ToNative@128.png.meta rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToNative@128.png.meta diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToSpeckle@128.png similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToSpeckle@128.png diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png.meta b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToSpeckle@128.png.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/ToSpeckle@128.png.meta rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/ToSpeckle@128.png.meta diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/logo128.png b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/logo128.png similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/logo128.png rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/logo128.png diff --git a/Packages/systems.speckle.speckle-unity/Gizmos/logo128.png.meta b/Packages/systems.speckle.speckle-unity/Editor/Gizmos/logo128.png.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Gizmos/logo128.png.meta rename to Packages/systems.speckle.speckle-unity/Editor/Gizmos/logo128.png.meta diff --git a/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs index 629d50c..971c987 100644 --- a/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs +++ b/Packages/systems.speckle.speckle-unity/Editor/Wrappers/Selection/StreamSelectionEditor.cs @@ -21,9 +21,11 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection.Editor { ("Id", s => s.userInfo.id), ("Name", s => s.userInfo.name), - ("Server", s => s.userInfo.name), - ("URL", s => s.serverInfo.name), - ("Description", s => s.serverInfo.url), + ("Email", s => s.userInfo.email), + ("Company", s => s.userInfo.company), + ("Server", s => s.serverInfo.name), + ("URL", s => s.serverInfo.url), + ("Description", s => s.serverInfo.description), }; } } diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated.meta new file mode 100644 index 0000000..10bb01f --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95b5ba60f7efe0046bb5639def6b3965 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Receiver.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Receiver.cs diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Receiver.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Receiver.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Sender.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Sender.cs diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Sender.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/Sender.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/StreamManager.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/StreamManager.cs diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/StreamManager.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Runtime/Components/StreamManager.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Deprecated/StreamManager.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs index 1690c39..159e248 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs @@ -293,6 +293,7 @@ namespace Speckle.ConnectorUnity.Components public void Awake() { + CoreUtils.SetupInit(); Converter = GetComponent(); Initialise(true); } diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs index 66894db..667d986 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleSender.cs @@ -89,7 +89,11 @@ namespace Speckle.ConnectorUnity.Components if (createCommit && !cancellationToken.IsCancellationRequested) { string streamId = remoteTransport.StreamId; - string commitId = await CreateCommit(cancellationToken, data, client, streamId, branchName, res); + string unityVer = $"Unity {Application.unityVersion.Substring(0,6)}"; + data.totalChildrenCount = data.GetTotalChildrenCount(); + string commitMessage = $"Sent {data.totalChildrenCount} objects from {unityVer}"; + + string commitId = await CreateCommit(cancellationToken, data, client, streamId, branchName, res, commitMessage); string url = $"{client.ServerUrl}/streams/{streamId}/commits/{commitId}"; Debug.Log($"Data successfully sent to {url}"); } @@ -103,18 +107,17 @@ namespace Speckle.ConnectorUnity.Components string streamId, string branchName, string objectId, - string? message = null) + string message) { - long count = data.GetTotalChildrenCount(); string commitId = await client.CommitCreate(cancellationToken, new CommitCreateInput { streamId = streamId, branchName = branchName, objectId = objectId, - message = message ?? $"Sent {count} objects from Unity", + message = message, sourceApplication = HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()), - totalChildrenCount = (int)count, + totalChildrenCount = (int)data.totalChildrenCount, }); return commitId; @@ -176,6 +179,7 @@ namespace Speckle.ConnectorUnity.Components public void Awake() { + CoreUtils.SetupInit(); Initialise(true); Converter = GetComponent(); } diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Core.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core.meta index cd91442..f64570e 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Core.meta +++ b/Packages/systems.speckle.speckle-unity/Runtime/Core.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 20fa550ba5944159a7676339936db5dd +guid: f434d359a9ac0f342be2b2f2128af995 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64.meta index 27d9330..3186b9b 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64.meta +++ b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4ae18d75b910f114f9d122331578c2c3 +guid: 4b590a2d83586294c9ddbf5d2675da5d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native.meta b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native.meta index 76f5939..9da9f29 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native.meta +++ b/Packages/systems.speckle.speckle-unity/Runtime/Core/win-x64/native.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 565c271f9c1f3b844998d6e6d926f1a9 +guid: 01a05be9c4839ce458393a2ec888764a folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs b/Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs index be1447c..5705ad9 100644 --- a/Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Utils/CoreUtils.cs @@ -1,10 +1,15 @@ using Speckle.Core.Kits; +using Speckle.Core.Logging; namespace Speckle.ConnectorUnity { public static class CoreUtils { - + public static void SetupInit() + { + Setup.Init(HostApplications.Unity.GetVersion(CoreUtils.GetHostAppVersion()), HostApplications.Unity.Slug); + } + public static HostAppVersion GetHostAppVersion() { #if UNITY_2019 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 8ea1b85..6a95707 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2021.3.11f1 -m_EditorVersionWithRevision: 2021.3.11f1 (0a5ca18544bf) +m_EditorVersion: 2021.3.14f1 +m_EditorVersionWithRevision: 2021.3.14f1 (eee1884e7226) diff --git a/ProjectSettings/TimelineSettings.asset b/ProjectSettings/TimelineSettings.asset index b4fbdb0..cfaebd7 100644 --- a/ProjectSettings/TimelineSettings.asset +++ b/ProjectSettings/TimelineSettings.asset @@ -13,3 +13,4 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: assetDefaultFramerate: 60 + m_DefaultFrameRate: 60

>Gwr?S}Zy~mCA+~QJrd^14 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 diff --git a/Packages/systems.speckle.speckle-unity/Runtime.meta b/Packages/systems.speckle.speckle-unity/Runtime.meta new file mode 100644 index 0000000..f2397ff --- /dev/null +++ b/Packages/systems.speckle.speckle-unity/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0da4f7853d174fc49ace43f3d3e5c97e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/systems.speckle.speckle-unity/Components.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Receiver.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Receiver.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/Receiver.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Receiver.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Receiver.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToNative.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToNative.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToSpeckle.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToSpeckle.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToSpeckle.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.ToSpeckle.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.ToSpeckle.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/RecursiveConverter.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/RecursiveConverter.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Sender.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Sender.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs diff --git a/Packages/systems.speckle.speckle-unity/Components/Sender.cs.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Sender.cs.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Sender.cs.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef b/Packages/systems.speckle.speckle-unity/Runtime/Components/Speckle.ConnectorUnity.Components.asmdef similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Speckle.ConnectorUnity.Components.asmdef diff --git a/Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef.meta b/Packages/systems.speckle.speckle-unity/Runtime/Components/Speckle.ConnectorUnity.Components.asmdef.meta similarity index 100% rename from Packages/systems.speckle.speckle-unity/Components/Speckle.ConnectorUnity.Components.asmdef.meta rename to Packages/systems.speckle.speckle-unity/Runtime/Components/Speckle.ConnectorUnity.Components.asmdef.meta diff --git a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs similarity index 51% rename from Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs rename to Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs index 684bbd7..a3a873a 100644 --- a/Packages/systems.speckle.speckle-unity/Components/SpeckleReceiver.cs +++ b/Packages/systems.speckle.speckle-unity/Runtime/Components/SpeckleReceiver.cs @@ -233,9 +233,10 @@ namespace Speckle.ConnectorUnity.Components ///