From 6781de4d53f1dc3856f931ce8cdae558654184a6 Mon Sep 17 00:00:00 2001 From: TRAfoer Date: Fri, 21 Feb 2025 15:30:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E6=97=B6=E5=AD=98=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Timeline WindowAnim不止window能用 --- .../DynamicUI/Timeline/TimelimeTab.prefab | 265 ++++++++++++++++++ .../Timeline/TimelimeTab.prefab.meta | 7 + Assets/Scenes/EditorScene.unity | 122 ++++++-- Assets/Scripts/Console/EditorConsole.cs | 17 +- .../DynamicUI/Hierarchy/HierarchyTab.cs | 9 +- .../Inspector/CompositeParameterWindow.cs | 46 +-- .../Inspector/InspectorSecondaryWindow.cs | 21 +- .../DynamicUI/Timeline/TimePointerModule.cs | 41 +-- Assets/Scripts/DynamicUI/Timeline/Timeline.cs | 107 ++++++- .../Scripts/DynamicUI/Timeline/TimelineTab.cs | 23 ++ .../DynamicUI/Timeline/TimelineTab.cs.meta | 11 + Assets/Scripts/DynamicUI/WindowAnim.cs | 45 +++ Assets/Scripts/DynamicUI/WindowAnim.cs.meta | 11 + Assets/Scripts/Manager/EditorManager.cs | 2 +- 14 files changed, 642 insertions(+), 85 deletions(-) create mode 100644 Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab create mode 100644 Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab.meta create mode 100644 Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs create mode 100644 Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs.meta create mode 100644 Assets/Scripts/DynamicUI/WindowAnim.cs create mode 100644 Assets/Scripts/DynamicUI/WindowAnim.cs.meta diff --git a/Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab b/Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab new file mode 100644 index 00000000..b5a7c414 --- /dev/null +++ b/Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab @@ -0,0 +1,265 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1245149450732101372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2856594644468795856} + - component: {fileID: 1654394841794307147} + - component: {fileID: 6703809492793959247} + - component: {fileID: 2457717289953408719} + m_Layer: 5 + m_Name: TimelimeTab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2856594644468795856 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245149450732101372} + 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: 5024219022659495223} + - {fileID: 7453192480244305691} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 299.006, y: 25.652} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1654394841794307147 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245149450732101372} + m_CullTransparentMesh: 1 +--- !u!114 &6703809492793959247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245149450732101372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.30588236} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 103ba97838400454ab58fa34c508cbbb, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2457717289953408719 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245149450732101372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2508d5efc83bb294aa25a45eb1d2f59d, type: 3} + m_Name: + m_EditorClassIdentifier: + Title: {fileID: 120879144137107311} + connectedGameElement: {fileID: 0} + GelementPointer: [] +--- !u!1 &1843458013635033358 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5024219022659495223} + - component: {fileID: 6088173518698648135} + - component: {fileID: 120879144137107311} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5024219022659495223 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843458013635033358} + 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: 2856594644468795856} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.0009784698, y: 0.000018597} + m_SizeDelta: {x: 299, y: 25.652} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6088173518698648135 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843458013635033358} + m_CullTransparentMesh: 1 +--- !u!114 &120879144137107311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843458013635033358} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3944eaaf70beffa4097d8c293604125e, type: 2} + m_sharedMaterial: {fileID: 7159369417392969216, guid: 3944eaaf70beffa4097d8c293604125e, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14.2 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 1 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4420271929815980515 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7453192480244305691} + m_Layer: 5 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7453192480244305691 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4420271929815980515} + 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: 2856594644468795856} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 1046.8994, y: 0.0000076293945} + m_SizeDelta: {x: 1494.721, y: 25.652} + m_Pivot: {x: 0.5, y: 0.5} diff --git a/Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab.meta b/Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab.meta new file mode 100644 index 00000000..ce637cd0 --- /dev/null +++ b/Assets/Prefabs/DynamicUI/Timeline/TimelimeTab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4b8e53d787aedce4c99c84ff45821227 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/EditorScene.unity b/Assets/Scenes/EditorScene.unity index 6fc8885d..9d0ef479 100644 --- a/Assets/Scenes/EditorScene.unity +++ b/Assets/Scenes/EditorScene.unity @@ -175,6 +175,8 @@ MonoBehaviour: m_EditorClassIdentifier: timePointerModule: {fileID: 1744644990} musicPlayer: {fileID: 1502848757} + TimeField: {fileID: 1834821448} + BeatField: {fileID: 916536462} --- !u!1 &37219226 GameObject: m_ObjectHideFlags: 0 @@ -241,8 +243,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -259,10 +261,10 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 14 + m_fontSize: 72 m_fontSizeBase: 14 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 @@ -888,8 +890,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -906,10 +908,10 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 14 + m_fontSize: 72 m_fontSizeBase: 14 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 @@ -3394,7 +3396,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_WrapAround: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} @@ -3406,7 +3408,7 @@ MonoBehaviour: m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: @@ -5391,7 +5393,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Enter text... + m_text: 0 m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -5400,8 +5402,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 2150773298 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + rgba: 2147483648 + m_fontColor: {r: 0, g: 0, b: 0, a: 0.5} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -5418,13 +5420,13 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 14 + m_fontSize: 24.15 m_fontSizeBase: 14 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 2 + m_fontStyle: 0 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -7156,7 +7158,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Enter text... + m_text: 0 m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -7165,8 +7167,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 2150773298 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + rgba: 2147483648 + m_fontColor: {r: 0, g: 0, b: 0, a: 0.5} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -7183,13 +7185,13 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 14 + m_fontSize: 24.15 m_fontSizeBase: 14 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 2 + m_fontStyle: 0 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -7960,7 +7962,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_WrapAround: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} @@ -7972,7 +7974,7 @@ MonoBehaviour: m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: @@ -8580,6 +8582,7 @@ MonoBehaviour: prefabs: [] idRef: _Keys: 526a8851fe85233e7cc810cd2b8a733faa68e71a62b99912cf2f06228873853005edfb00aa354575a31cc8ad1ac7b966f52afefc8351b636e2b71574be99675b6400dfc3607f0069e96d5112b3681f5fcf550a7f3749f10c2c006f2e23d1db370e64801184e106752a681216ffa3837998b5a5688fe724520d14109f10d172186ee5fbb117f2241130fcd93d5728ea479cf46b8ba7516b16ed2e96b5bbb6e20e0c6272c125d7806f67cd366983232521642549cf9088373bbcb047a020454d5bb82aa5499ca2e04b74417380a87c864288e4671d588e1210db981f281d4a325d1a036b29e53abc3829cf12c86a843666a9d2726c53c784328db49f8d499d214074d166a5105c5d3da29f4627a1da7a5e317a2d1042614f5281c64a6625b57e38c6bf413c35ce7d12821326d7a7c36313210e18f42f147d60db1f64f3ada3bb2d6666d31a094491222bbde8f495825a4e2f05ece33b3881253ca117543370bf2531ac8ebf10b7f565a03ac9712b88ca58c516c5a7b6d8f161e8f9dd682d3dee657e0ec3e9f39a3e76118743006e0ffa3a958fe6b6ca98245845d258f66aa26d222a2ff31dc5e16529d84e972e95f1f208f318fcbd24a42f1a1594d13a0cca1e4d0b9a28c0e4238a4cd5432183fe0a3d37c5600352a5affe32a0f1cca64d60c95d6de43a2f1ab3ec2f8dafe7e182ac1c0b579975acc6cca75b9cf61ff356e4ff757ac4f0e2446c5178b3cc3b0938e3500b2c3eb04c15e369388d95cb10d3df8656508d984144c6391548fc5f9307b1937f462b1e94944b8a5d47e5baaa4a0ec664069a951142fc403ed6b4a90102e5146519f66f6d35134e18b132d9ec6c3ec954f282992fe09c9f2a9752fc7c47b5d52b06e06eab61a6d10e4d7cc274d62caa67eb540f7f4be5844b6a66281ce82d2f660704e68bd01df34b4f7483a3a0ebff69576b98633aaa8921a5ddbe04814bd97aac297cdb1235373261c4cec06828ec556592c57c95cb2c5c853ad052230733029b09f8776f245772a3ca0276dcc8b833ca146a1411560f76a926a9289a1bf169092fa58ddf9c3a7517c82635364a7f4df403890f9d1ef144fb812196cd7f0c77286780f491baec2cdaf4fd482fda400ba6f61b9da4000716c29e6ca1845b5768bcaf0ecfc98bbb39185d35a921a8142041153dc39aaa1c286f97b630278db035fff6d32e0ef214326ce60b1f02d1fa31e71c6c1ca8c75d472e9349f4c45f8c4dc0c2013af81c5d63b2032b19179f0c5109edb220eddd4a554c13b12cb5d56721429066885700c558f421713be1a14442bb774cca3425cb341fcaf3fbd03ccf786c4d5ba70595a869cf6fe72c22325567a5649773f2357847af0759d10313b725cfe3c24772aa470214482b6154a356625d3cfd5f01ca892d756a72e68478521c260cfa05f49dda051e95883b60da9c51a244d0c0efe9d8666defd20837617d7266b7c4b857af913f62f77c9653c48e6531de7737b6edf43c1fb5c7c5200b0056ee483116cf9b411d5add2ab42d68210eab747ff3c96d3a504da8889e1b9f6a76e44a45824db5863649a09878ada45b093fff39b97a41162843c42da16cac080e6d98e7aec85f367b53fb8ec0f6007f0600beb18fe2b7e76ee911c7c76ae00c14c122f29acc03601a51f08a4016e1082f6d7eea356c2d4766a7c4e03aa5e33455a9d65f214d9d8402a2681f2dbdd87b070a985bebf6d6a81097a7bf6f1b653f6d44ca68c07e191e3105186bfcf1e65731b726cef277b7a02e2f4f8ba6de14e73c29b17188403b8622b78df10f42a4017cfff026423332e5732a39eecea4c4101a0158da5ca71f8e0cacf1a805a8b07076b2f15811115bf709cdfeb27a2a54c77a62f3f016365a2b209de610da2415e4793787e44c9401f65bb01b6f5693eb1d01b923a2b5bf5a3f57c537732b4a1ce41e1dd3bc5c8f84196316b39ae5142b724ec80f2101722eba6ec83b11cc7422a66c365139bf2fc07134f6c0358c0bda930f573d9dc4051c541157fd8ac87b1d9952a64ba6e19ca69e2499417fddbe2caa24c1a561f21387762d2def8c67a4f06e2bc76e0cb0d75f9409b22d34593aa82d7ba7ae89207f8b652d5f423bce6076d56121e00caac4b88c2c7dcb083a94c883285aa4d5c6ce0a8162bfdd6753d123843ddced44e075745b023dbb7e5b896e8269c01328054c9b302a1ab4da484855f13539de7736f3892f04d9f6479188c48f2cd00d4fa9d9c99a7201753abb270b443240a506dad2e62f21bcf924dbc733497deec366e53a852b5d6e466fed752cfb7898b19bdc423679483d7065d2ed753932d34255148ed5933b2f9bb6e6a9e268170b63bcea6793c524c3515736dfa68f07f4c3e5cd2819166dba29f321139f0d5a074dc689b94fcb3f83cf281fd236e5292abdda6dc835402586d5d0c1605cee625fb13d2d6d18c0428f254a59f1f69a0ef2e209aa3a5f6e2ef35ef170e07360261e3a3ede074843437e1dfbee809a1671c43e2f82acbcd800430f3a0f274f621bc623782b35791639d9b3d6a7a4a251738a9dcae15d1d2c629ec1dee87cac94318016b3a41242a73e5469a8f9e5305b1a9e52653be5bb871d51da8e739a2dbc794808278eefad6148f68c8cf374337c311ef987ce12cf173b716a0b132fe4277edbdd4e22f732d40ef01d45592e93a97ca93fa95e5a129817e09c00a6478b8824b30bce51819f29142579bf2f14716a04ec784291717a27138999bca5ced2397ca56aa623c557fa0aea6b7c2b2d37d36ecd046c4031e66938e3bac7e8e2834609b33cd57e178eca6b83c7852308adbe3e94d428359a07b5400093c0f470edd76c4e79870e9eaba95c32283d069372be6e79067bb6ab7ca454796a807a3129056bd4516d76698e182e2bcd6bccd4d0d55bd256e985ffc3c546e2bb353081161d28e9f2b17c68842a61ffbca8999ef095525156bae067ce736817b45824c349af41156b1c1de1a70c577fb57abce4d3570d25e2df2a5b3cc1489ae5994cd4f9624895167ccd2c878e56b79ca0e2b6cfb2425d4b4aa628d99c27562c7d03f23f7d7819c328ce578ae1527135e0f7dda3ff6a97dca81f440971457a5478000a8b6376e1d8360c581b142d9608e7a1456bfa07b11db9cad86b165ea900c6a33576f6669b6509fca26e78181e3ede275a8dd608e99eab8ab79fb62091b490f2856d9b4217a75c73f0925d24f926913197ec393b9de88cf0bdbdcf010bcbb3426c6c6d7e45accf53ccbe9060865688a783570c0b104493af50b47d63cdef662cf94f80351be43050530347601dddf3f456dd262d70d44b89935d88372e86a8cee0b3492bd7bd8d9f26bbb70cfe339272c1880d54ea6c44dbfb085e779397802554e9bf30d9e0e167af78f92c74a879380f050748667067538e266767fc005c1939ca0c1ea78a5417c0d02940b651858937153a686575e98014203e3ea29e6086c3ac7102284564acf772d0414ace1d3510e7224a5ade01287e0be64f896976eb354cd453dd6c74b85fa2e828b9d4c8b9fdf7d24683ea1f5d51667f1d5e15238dfce40c6aa371127c5bdaaa470b279155bdd3ad6d9730674a2c76017713a8a6b681a4d32ac75e5c6e094fa25e94676779f8d5da313d6e0934833ec218748a6ab334f3c665ab98e2e4d0e388478e09b6c50e887e177c2785ed64615806e08b1e6b46aa6d77d33232a00d0a9e1f09ae3d730b78d804f67dd0a3864c364a40dbc45b01f48e388ad267be45e0da793a5a1c4adc1a0557652262c47b11fe1e96831e163005de15e0fb03221f68b5285849dde06880275b1fe340dba9ac4b77d44955c8fff1aa3ec7ce951ee81cc70492c6e23b11207815a53ccaebba464132d331f694d66968042f655630447ceb4524f930ad89858d646db8ffaccc4a5544b8dbae93ee5fc7221100bbe767782751d39f505d3e46807a33ea248231afbc4820d464750dae792b485f35f3da671b68c470c6f7a0e967032bfc144474afdf073229c26b55bebe32404fecaaae93c74ce2f2e2b42f0a3340f1adc28705b45160767200e0055d2a29c8d707be4a4cbf309d7b188aeeb4396969bfa396f9cdaa0a5fb2ccc36c18b83e1d0c7c0612f18a3d6df22581ccdb4f3ec869b63bff3fdd6a7eede202e67d624acca95905cebf8377cb9ad6f957d6c17c9c7103fc9e83c122d0ed77dbf077a81090dbb52382496f07e63f079a15d6c254af5f9f58805fe84e95842a43c8a098540f3976cd731b00191ff41e2175a4c759503476afe9fe6e300d9847f88b4d2f7928a47323a00b1f6ca17ac673be392639b47c6c03e9b7c20fcb46da0c63f9a56c2597491a17ebf95a54e25163c4e2ef2b8ff153f745cd9d20997c11191ad330651f32975683415037232d20cceb1df1072bef44313d81ec1af4022af362109e2f2c046a22d133343118402fce0841ce4eea74ef6b3011a50766a47b3c19c87847a134bf8204e4ed2a61a6801b71d94a7d2505286ef155af18ae4a6e96bb747f19561e72b38fd7ae012870ac4269fb76048deaeb8cd4eec2230a55a2690825a3568416d70ae562427dd5bc4403fc346500705927a4eb212c63f36e41d3df3e7d298f24eada7da53229579148e75640d90c0cacd20fd3d11862168be888de916169c0e48b27b6757d3627fefc7d6914ba33b8b137cc9492aa430c88f1098dba073930de2672b5b1567fd6f7162a2a64072a451ccf2c5994d52e5bbfe973432468198e568f78da72731274c4468ee18fc367d4dc573e3c894702f74d106b78d3cd639abd3cfef63523236f60c0820b69a9687bfae382678d6e451af4bf491b069c3f5b7650edaecae8503862d4b8df032e396fa51cfe8a26f82ac953246344f2490055701c155611592b394b9a3c1ee2f55a1bf1f247ccd2d2694ad889b2a6521d6ef8a3102955feb74a8770a5d5a1229266ec4babb2d341af68b75b7f20341902746809447bd2cc041cc65840a4d302386b6bef9ff2fdcf41490c571f4e8127805e731a6c98de179420d656ef8a3a32d12f111d50acd2e01727d13d91114c1fc636929d3615656a0a7bbc9bffa1e8fa965da8113e79c5a1a532ea7e69180454e3301d79c190e8d37329dca220b7df4ecc352b1196c41eb28f0f07fbff1c2bdc8067b8cfbd62bc27462b9e145567c25c1264b234edf3be1e113122b8fe0f916a78044273957140d5010ea7ddc4fa9baa221fb56a55f91470e032c3ed7b7ac540e3304aa888e7b67a23199892ea67d8a8886e3c1377a78f0b3b603c0fdb93fa5c2e4a7d24561caa96003a473b91a75a470a6a98d8a779cf888976dfb7c7ef7a257b79309bde95c7ed4c3e31f237a3cd6f326f0a0bcfdefe65af544078f6f57d7bd96bb14684e8d850aa19c651a98b6a058644e66f933b98d3f00b2986bcc9080f6c13622ba77a1bc4cc0bcdd33418335b655093c331b81c194e667a0d386610db497d85bc8c077879970f0f788481ef1da14bf438ddcf86935441de988d54da39ba18e886f1c49546fc655bb9abaac6878c5c94128d280185080d674ae51107ece948329c69750e65e03b43de1680da2a9e6d339ae27b70de8910f4c85e45f9d5f44230b5c90e524e0b3bb3cbf2f392c067444ffa037bccaf833cc7382a1dcc2e985810164f89baa0c11e6db27652245a744ccf5d09012d86897f338cd68b7928087baed62a36f9895535a8909556fccaca71c2da8aeb7d87841910cf4ee764334c589bab7b57cc374f33e8b0b4bff010953f3aa8bd48d085bc6c8f107a773d9bd8085ae78680199d8806d542fb322c3bd701c5f052438afb772099171a234e388e4c2754e52869eaa729cf3be1ed7e1066351884c3d112e46d5e6f651930b7ab540e30b7f427a95067244828744e1a89a15782afc42d049fa043e686b803d1777123e6d31c36058ddf691518771690e1bb19c4c1ae08e7270a3159380d2f096af52e49ae98b99394ae0b30a5bee3e9482c38bf2dc0f03696c440c8eb8e3d9b0f7256ddb7321eb7fe79589046c8721a11e50ff42a8e2455fb084deb57827e23eba63fe7ea3e5f84b41043a71961f0ce5126253061b78e7fb1fe1dafe4090f80f77b5b5f77a5faafbb6b40194bcb6f5cf81c67325c4fc13417bf66e95cafa0ab01c2616a42b0ba08de2b15cef7a8ca7d6d7a48c7a140dd473d9076360c11520bcb94177895fbe6b89da010779b0bc3910b1657d6f8d809c1e51a2db23983fccdd809677340ac188e6c6f65425065ac31cde52b0b4684ec0d74a95cb12999f1219ddd6091a34f505efdc96a778c388f7f92041aada8f9eca2098a1717f73748fa9f7920d239e571826b330710ef76803c19dc1d267e4578a3f1bd652d666756341165281418be46ac9298418b0e234c6df62403e5e6dd84a5ff83207c7f9fe8d2893c21ab6192dca5698e6d19fcfb4debf52d37bf9b8fb2cb1f7d12632035d30c5091144a44a00b64485e7c3140f88e2c72327c9afae1cbeb46af0615472d17ecda1c792f3ee5210169112a5ced08811d51173c1498e218ad380442564a0d94d4a7b01976a0d20c469d880ac65d0dea36916d6c08bf98efeaffb24ed4439108b966e8286445e5c71c857105ab9d738398585c3b235fc67b358fcb4e3e5b38030c80505f8c1b790f545aaf2aded7ea8238e50f2c6133d4e7d39ca10cefcc763eb292062b112c088221b218375064a6f285b279584b0b643f553733108693df771b8e887022ea8ff32272f4137463f8873648d502070803712d5ee33e24caeb90be938541ff778b61706a531b2580bce919456724969712e6917d191213cd0aa46f1fe61b4948bd6ed2e296715c1f97ad1bcd5769330f2656a56bd27e5e798a6a7fcbc427626e326103d6f7794f8f66ffde477605ce555d9b4c48970269e3194a2ddb4b47bb613d1980af006e089f8329ad8393699374d2626a4f9303736893d3d7b9a515c1c36dc4f81cd00dac6395520e1a3741c3fe060f90aeac4987b19c151667416f40f7684def3ef65fc13512f827c6c3729fd495d6c0b4a5709048b555461adb4423269305828430000b9ab1a5634bdd40ef2ab5ebfc172f7451f7dc38f44ca559a53229fecc411024d172884e43310665b3bb8c884c83232cebd3bac9267ae62c0ca800cede208b30eb46b749d8a58c07352bcb74a20bd94ba96abb70518f6b7974f4ce53ff24fd0595c81e74014cd75e59579ae6381f0b328eba28bda822986b639b074285f15957b56455eba24a932df6e6af1de16fed2d08907c2b0ffebc3d91e4d3616cc5e57e068a30d4ca1f8f4dd6899052f7f44a01adb6a64188ce3e684fecc49a919d5d1f913a3f667a40ea6299d2f8f8b46bb74c636f7e7e392f295b7b0e972a710d11084a917cb3e0d4635c64a0c24c961d3d7dfe38077daee2e43420cc9b0651a2dc31d1ebc4188b4cb1268a12b2f554ce9500eaa57737e24bd950156c11dd818e75022a8e9ab75fa21a596646a776e2dd613a4f2e8a3b57e369743587910b5c8b361888b5ccc634dda04674e22ba04c32db0587acd350e64fa645f0361788a129f93f4d80847622460d718e44af390f09c167649684afb7e531381087a00e5ac9367d20fc133249add740a062c3a29f6c351c651b747a894e2067a554335438e44327f1cde6ed0971e14a41bbf0aade71675dae7b56c1aa440b2ea16b6129923d941fe9be9f084b3a9479024144bbc135ba3fb4c3492055d86e52e98bad405a84f6148c3b7122ad2a231fc58fce6fca7e1953531255ff144f6a536ebdcff41324d423d6c8e863663b3136bf1d32b2090ac57fa5e63df301fdbb7aa86547c714c35042a23df12748362346a2af44b8156a72765608158d8cfd312387e09cb019d65c68cb6f1efaefb50e0dbbd7c659ed7b8a0360e41da91826af4f35de0077eeab2966d89a0daa850e790c2f4ff0466d5a45210623d8f69ddf0754ae6031888835886e5e29b6c7b7f308009da3c217da7df95673ba9d5fee78c30ee65f0ee602b9d47fb09db1bce5ee0a0037e7d0ee86e42c05b7a2a21ac263493b123a1ea71ade021dd042c7772fb63c7ab09d30cddad64d6ef2a5255e2b0e3206fa88a9abd063e5505beb55aa1d3f5b6bd1232b799bc9610614502f07a1d6253d6cd3e4e2ec92b870132d7d0feea64635a6fa99d2b4b6af48ef5d3562f701db50a0ec4a79453ac06f8ef5d3174c1eba73eebab31fb028e06c822ffba2e9a7ff45b6e493aae93bbb6f9af1e14ba87bef34fcf2e794bffc0d745c69ab821abdbe49752385bf4695c3063fc69ddc8e930546d71f0753e63e8923ce681e206d4ef360a8110ae281cdba388e7dda89469779443d5decb893f8ef4b57c39fcb0af7421e47017b60621737084865176dc4cf85799acd84581be2876b43e48d5ec21afa3560e40856f944352515c42d58377d100bcc33c15c77f25205e4babd3577630b3ed440168219f64f424619fc1c6ed4f63cbfde62934955223ac9a61eba5969004fb9ee2c789492242a1c80b06ff717be50403da17752cd257e7443f8358ee800094d68634b3d25ad43c2cdf560a7e12421646f6dc5641d077c9ef2d76cedfef1586b5456923870ea2450ae18c8858c6c08b028f297d8dcc13793a408bfc606a2618009ba1fd68ee62a599175b6053ff61d5a21f74885d21f3480cc869fc554f57bc95f7102847b6138bd380e95ad88c353677fc89f1496a07b5aada0e318c3c473129cb7d3ffca2160467a8250f525b5387d1d3868c382d80ae90b1981dd745c46ab7d976a28063c76f2c0767ddb6dba55fd649e9ba661cb2c3aa6c78588bcf956d6d27a6970de5f3467952322c5df5b0169cbf2625097344a5dcab9b453163936788019aad29804233d2d5cdc06bd407019532672818bc63d8d7ac4e8e618477a44620013b013f65902491f2f632edf78910e074f42b08742d02fc6fc085fa95fb495675b43d2402af8c75519d8cf4c116620addb941af0402240939facb6b80d5bb9b078eba1e25d9fd8eca9bc4571413d2b93a137c6c24d0388c73f926d054a6c9e8c6e7f3b03478abd53ea3f23a95b209c5d9296adc737f70d848c97dd1009046820267c915b6bbb8c6a7831398126798f07fdeed08e3325545ba7282e594331a21057bc30274e91be04fbd763fe1f8c5e5a747ee13f6c86ddfcd1f6e82b4b6bd2468e28296901adbe560ac6716d0a5d4876ea0471c4019e5abf58082c97032fa9050c49353a01f6a1c74f47aefd354919b3373616445ccdab782e4a6a120a78d513294d19791340174152c0174e5e4c345e794d13ed33566936366fb9b2554d574d55512d62346112b9f17f5bdc22d74849db0d1bb064e4e6e6a61d506675d224e50c4b614d1492fde55d0708af69961aacfcfe5ee932e66211e085c9c55227903a0b07b9a46e7f8214402bb6de623f1e5c5bdeba5d2dcca3d4dc2d14ea6e0857778404d76103333e0b5c956505401a10e4ef5c6f3042d6d08c86c931ea726390e0507706ff52a0ac538a933d5645fe330a555345654c7d4feeec0bdb791588310d54f61610664e60051edd993b7bc53a96f52a47e209df9e0c581f69b2086cbda2a2ea985b337fb5d4317015c46fce277d3175e7cb676fc2c1a196537425f27d077b2c4e34544b385f641da77957e5aa499d965dc71bc8f266b125e31d2e0bb82f7606ef4e5843b0f897872b493545bd1bf9af30a24f843bb211345bc43b15ed87a215153e00d2216f05e07a63186f760e1d8a8d2e16bba7a043638e9263dd71c72675172669cad6208970be4d2c19a9a46cb8d49f275a9ee69cec23c44bebcc055ad1400e0dbf55d4d839d1061856374bba5b830d5aa429a74d0d848d08a5bc7c61339be514308aa04e356c1a43a98a7574396c8e2e550510a9164da14113cfd85bb1677d2f454a0a5cd01af12c8427fa5248fdda77a16a1771cff40969ceaaec1a66c03614767c9f03f14739566925554f5f218e6271da857b3c542541e747b7479dacc820cceff4fd96cccc1d5543f00a5e6f4c0d57638c02646c1535a3e0eb38ff80f3425c351b4e158bf83da6a3cf7f452f9f566d3b10c6df394437fbd5a54a1f6ce22c51ae66938a9b22336b4e5bc19c95f02e8142ccc4702c636a7a525340e6ae1e3ac0a2d0f39533e02ee723ced16bf92b661b89349ec75962234bfc0edcee621943302100f9c5fc984b23faab93fa35d57f26ed5a6fe3bc011a05f43e9241bd1c4ac4ee5eb606ce5e1622807bccadcf2815d871fc234276d97320e6f4d1be06091f18f6d00cd61e780bb48e6e9cc732372be4ac462f3f07f739c8d2d6ecc230d4278a9bb5b7fe1c3e08e907d7d0e5753b52e3df4b95b3c7a1100169bbfcb774b77c46b8edd3837fd3396e3e1946dec81e3df1d7f51d1bc08b3d10669c6161acd20a2d9cc6dba4801f0b5941de172b9aa27fcab738c0cd60f93646942401c87bf669f9f9983d7592ac258f1fcf312c96a754f7e3d5e71b6c287295fd2138a421d4224b751f3101650a36f5edcd526e38f5501230f51b5af0b2732ed92c8d4c1a35500b0e1948898aad6e266123f6c6851e5df92fda8bd446373b28935fdb929783254982b99fe15338777d780b0732445257bbcf867cf4c12452bbab8fe31576ff41e5483f493ebd3e5a089df1a4c4cff71c420897611eff1a09a80ce436c45561057ac9ec7b839b9602902b7357cf808e75a3aca10ddf9e231b6248f14ba2751e5efef61d8dbc72a05a7394f1497371d92865a56ce84cabda24592e2133731e5a1bf4eba7279dff46154dfc9b4bacdaa82b2119e5fd083612531cf9338d516ce76f11f3aa78354d7464ec8134484625d1342ab2eda6c7a2ed2a0205bc69cd2b9946e40a5c9f8420612c5c7eef79fe36f309d80049fca572c94c202b8acf6ef4683f1811d3ae7d8e4709ae3eb4b74c8bd338073abe328b6a1371411080599591bd6717af61ec62458c4946bf551bd87e6754013c36cbcac94b53019e9293f1128c40fc1ccefbedbf9b3e518a86b440d0b540872aa52d3776ce1f044a11fe28e0c53433141fbcb06b6741a0f77a3f4296123117aef33893a0f7794daef7a2ad9d1671c552812bb0f88f1bc3648c3ffc8fdc6dc81fea292c02382b0b996f0274c493031ff7850fea187e0e3e0ffbf72d3676412f76953278c061377652e0e877725801d0895df314ec58505f2414e3f9bf0142f14ecf14a63a845d6ab26567c7696835b7fac8b69469561ad0e5919cd5453034abdd07d65cbba50bf344769d790f760abbdf99f387b8d779f8b445c0a8e788501d6543169d6d2772602c3baf0c465e3f708657b4df24bc0cfa7132efff9a4c0a44da7fec349f9329faf36ca583d8933ded7baede6f2b8e07aa361c2c3b37730588b994cd388df50e1b80bbebb8178921210b2385b7d585184b77966bbbbf643e7f99e236bc3afa7b70bdf8f0e77abf6daefa4d475bf8bc5cc052e74fdb9e3526e6f96b51f9c0de18ef57eb06236bce2fb72918b60dac9978aac18a96ac54602e88d2d6e0e5116613e3cba7fcf249c62c211697b2867e186d6d1c58c8c9b89365f7bc8ff542af1559c205d242059c850c7849473c13ec4b0ab96973c9b89e492bc9be0c502644912ed50e107f5429972f974c4f807057511cf7665054dc21ed244458f43c562acd432589eedd0335a11c005dcd93b1364420f0d7b8726a19f40afd343bfb345bd93e1993a5f9462f1f2cf892acc6107f290c14d42c2de240ae3e82071f310659175b848eac45dc3e663f497495023a45e57df4d1189fd154a359be1c88c0f011da5156f8bc7e2d1bcf2a6fede56eaaab0338ec9c3c3541788a27330587bfb5a54e379b4458320263aa26fe12f241c6eefc121a50ad8c4d0f92226d95b032a38ee03761522c99ad2eca4fb99ccdac95341244f68b599a073d16754dc95f68eb223673f329a2181a95bf471bfcd4b042e58c5ea7f53c18344530233cb64ce4ce616325d440b96c91f92a734aa1b50412c6b733ab413e091ae1c0385ac654d1e2a4167c61f9dd012b20cc5e1fafcd938f2c1075ff188f10a06d3f0e818112cba5599111b832640ca4b85f758a1fd63650ac377929362f05ccd8e232c6137f55f2ff4679a96aef0674743d1c3ee94bb8a5cc487bd86eefe4fea7401ea837983fcf2d274070d834b607467463eb1ba0055548d31d4d7d8ea6c2b2ca29025933dea2cd74254d92259736e2d552c117e49d5295f70fc2e37ebf75647c4b96c9561a7a382d38452fc26322cda1354072cd6445b20d0a768789ace911544ac61890b5ff35cf1b05af1f06f5ba4701e3f4e2b62f53c863acfcb8b6e7ecad14e5e82e22c29dc81bb0b6c2f721325847f9db55aeeee26c086eec31b868ee675b6e4757e694c7c152e186536baa968f32d382b460429fa07e0543eb228330265bbdf3ad1469f3371e0f1dbfc11cc35741431f119b6cf56b15204db2858e0366356f3c0fc4b5a5003297a56340ef9d84616afaadd27bf27a5073046568f4ebb93ad371af23df4eb6260eb6510ee4edb411155e3b634258445f38a28cec19044f65bddf6176ea026528334ece2fd158e65c6d7318bbbd08ca18f057d0b093c01f70a937fb6be579310e264c6b2637471e1877f08a6b178d62202974f08e3869fb1390e33a17907999123cf2613eae6c234825bf03f51b4e595ae7c151169f13961df0492739a9e97f187dd63cc2ce7f8e2b0ec80a1e7f666a312f316a493608187c03f7a67eff14fc1372141f799eaf8246edf96bb7b4e6fb0e5b886623319bbb319cf99c55adf82c533d8d3df9b793ec552746091acaddf30b8636ab12d2f78d71f23afe0cffb9b87bdc2edcc2b63f0c0e3d3d8fd69bab6d5d45fbf1186961ad2e1218a59dac7019492f654a26474f70304c87dae4a43e25347af8fc291c147538c74447e729198c5c10ceeaf3ca95b0663f1dd9790f38fc187c62c9a85d480214c6b6a1a429f25a114938221b7aca0b34563e972654231127f80ee2c40cfba37f33aecbcf7998f26af7a07f4c7d7d384f341e9d1cc67f976c005efb09cd113d09452deb55f7e9850ad311d8352b84dc6f1f6cbfa3c0c6877126212624c5156a3fc4853aefae55483cb362ff0ec1fbb121dedf487ce068ad5684420f84e45bcc481186b6301b3c5f2a8e49b798c0b6926e4679ab9fe349dc3ddea3d0c8e7c1da3e5b0261941b5d5c58c1c68d2323ca557af7d495e313830e116e8f45db3d4e121b1073c1485b9a1a2ecf650080b20cc9755bf0d094e3e98c2d9a916a800f14dd1ecd9fa9644cea3f1ce65115662cd5c616c8f6f5720334617096486ab615f31d398d77d0f95009993c97279a5bbbb81805d812b445ff9d5c599bcdcb2d2a7bea13e9c5d5db45dc254c4f1e5f5ce867b630af51150ec45b5b1e68adacf7bcddf22a977761acb63bbf140a6e744a03854040bbeb62c6af9e6b4f1670c92adeae11583de62c8af9f533204ff8e5f7edfa053851d79ea536c8b279fe1c6c23a73b53522609044166d60f31b4c3c1a6f67af26f9005e6f6a1f91161ee57323c62ed9c1e0cf90cb59ea3515cf2cc3c8f756df66d3e978f4db8a4ff1609cb5b1e058bed59eb2bc09435ac821c74ae6d29a0d64541e3cf3f9cad7708147f80a661ac786567ea340bf1c307984a0e5a6e4c07e90667adb19d8fd556d77a50d0b76c46b42e697af14c0425296e40f3792a6db9ca087a9d7dc8cd566462012f813f059e6b342fa0d5159fc30d391566ff5f447dea9c7ac83ccfc8ec611221a5c02825591d4e78bb04331c4b96497043b23255c4a67f191dba3c629b6b423ec3f4f31141e07f0d4e361d79b2e4f35e0da018f23895e305f5c41574e6569a02df2ca091b2217e6a051c7ac358ac5f5cc9688e3d2b3c4e579bd73af14ab9d3749631e8d039456c2f3c5e9198a49480468172460335e3757fa9f7328743d69d2cf9e996a1567ccb7ec89d9649fa9b1f3b7b382491bbcb502f638a08b51ca1625aec460a260c968a78f03a73e95283b94fb2620c555af5984fbfe42906921e9c2f4312db0e2b3b9729dbf0c3282ba0920fab495fa5474e961e20a597d8937c190ed7a2a53fa8aa2377351cd0b5473e841d531ab1dc7d41770a854312795c406956f52dff31b92d480026e8d9641f4b655e2ab52aad2df58c1919b0c3ecbd9dd30cb37aaa743db6d77f9d4efd9ae424d52faa70a4116b1783006019e8f696a4bc77ec32e8660925631f7456f020080dca0ada93962d42e477640955eadb311f17410a7585160d3b397b0d849e152663f751b0222ed5c515462f56b290a1f0c0ae6d6e322b7d92e117605a1a3ac7838d8b6cb3c4d4f00fbe830a2f55c05aab978b32340ba8f43779be6dc67085552480533748d1b5f5e84ca53753817ba96aeb8733341d61acc58f5d75a81b18a67ec05c02f85ab04dc855a640051e6049e6c66547c70b0ec3445e4c4775409d03654cb61221815d3b632b0376c5a1b2e4efa65b1e4a2e208d4e6742650d68c108f3aaa5512b8dd89b97d61c63079787e610313732e57fb9362c29c4763c3cd10496057d6e4804ba61cec0867312bc94e5ef287624cf70128d9c238101369ea0a4fbe7320dec09d2eb1467fe24f945257094de8713c7ac3625f3efd2237d4767939fd49006f0a1fae5568a1067f0305519a4f9de0479afd94034ba682bdc5026e09ae62163039f580decd2e12074ffd0e3d6ab48212b01c0b0c7e9180eafc16398cfc6525d1527de36e78b234a9e25520342f46a2f6cfe9b761e374d52d36690bb1af26305ba26ad32bd84a705958e062baf62603693745e240f3958653956c790313e0a3844f280233079167371130a98a0cf9d14be55feba11ec3a7f6bf8b82e92948e0e78e07bfa8bb4d20880d201ae7a24662640c364622057a61b4ba7d17926690e50d1f51d134d63fc5fd2a80b13effb5e489398a8fc2a9cf24acbfd5e2737d7da2ed3bdeb48a3c9ab4e6279af2f972d9977b01b92c5bd221b035e3f167d46b4b956c96e7015af21ec498eba01ef13d72b76e9b947b2842c045d6cbdbed3da521d6b5a5f34edccddd471d1b7c9fdded40f79ed606b7292f82e6297ed7f921f40dc1f2892b68cf4e7bc388eb8833bf6023c69af45e779e6abd960ce2ea920a1bdad6fdbaad64b1e8284045cccffb48496a6672ae8e4da5962387ca72fa9707f068e4d71b919778c85d12c7193aad22764d27db670edcde5af035e6e105ada3755467eb3fcfa5ba1401313779aa76c485e610c012626f0f35b323fb6ba097b2af7f41ab3d37adba0d1e10a7bfebb80a98f58348d9924a183c98d57cabb115c498f3e6e8ec1b875e3866b30bbe38b0a5f4d6a45133d09c41b969e15bbddee1a3f7b3f14b621cf313914e27d12156d162b9baf690e314b8f2ba3796ccab12583f1030270b1643d050c25aa4983ef85023961333df860a1f35c38ff12589d0515c59a900d14fdc790d8b4751779fef4c3e189cc2a1a9c84ad5a0a3378642a5ca92bbf0f1e816de9c8d63ce953d6b96b5a2dc3f432d1db2f621f3e681d323ff503111e4338f2edbc8b60fcac567a28285e6127b45ecbd586f9118dc24105cc979646e6410afca368400668d23358458d755b34d305f072f45052f98d46cae89008d8a59f36dcaaef0850488569cef96c222863247b2a8a3c214e4d191faca0cf78856d0b4d5aa8664fbb344b58ec8a81588d6b1d663dea22b29682187191d0b3f118fdef3b05b97cd0ca74365f2a6bca3c343f6e16d28bb4aaa9999305f565081080c4f9175490be2b82298645f00e6b57100340427d5255e2140a7021ece52eeeae6a3a539873ab37790e032e8d7f93bfea9fbc65bed72855086ceb74645171270eba6f74bf3562142098e550bc25e6361275ac307c5970f776ca3703a1e02cd76223df2df0e081e0fe2f7926f2d798e286b46126ffa2abb54978fe76949a8cbf94f2116645b84532f4cc3255d396e94d62198a137e05d504cf95776922088c6744c7451be9ff9cce6e2f3135d501e2b28fb0137910793d9ac816364f89b5748b518f2c36f12808bb2e0efb6fd7b6de059d73b17ce71854e35585225c8da181e88f91a7070e58a2c078558b466cb5ca52b624f11405f7a5393b49e0290d51b201f43583458d0d77a0bbcfa66750921c671491343c7978b427a2895235328544de2dac4313f414ad2dd23f6e3c55b5ad78ae14a65f0c33cc583ddced02ea347e88ed278d1095b174ff2f39e47598f21f7e173bba2d5ee5380934d747778806fc5d0559b7614c482526835caf2bb7f815e9e15c726ce7c5f6097e0e367793f8bc5b2b6bfa7afc8f31a467ae29034596141dac03be1b1ab623948b61d64db866ac7bde64a3183255a4874220037d0d0b4482494dcb703ba076e18e8e055d9980a331a55b1d573a2d4f01a7455e05b2a5867f1d54046a65c44a80257a583ea5fe123d822d284dededbc779dcd170bbd8f6bcceb7a85452e081e29b60a13601bb9af0cd6dd5f10497c9c232bfb2659724f1efdeb8cfa01f0903e9396e9673c456286cf159682577bccd5cdbd793941ad3afd3059142572c0ae1c469fcc7a5eeba020378aa9bc24cec6821eb72c447657fd40d1e79895597707ef9986c34752ad8947a2668e34037ed8fd1f9743296d6ba6efa28ca8777c357ac083b9239d6ff12a33bf8c19231bcebcb03f6a4a0e33dd82032db3e9de5600c36decceb0495b3a8e2e6c1069e17cca0a704858b6e6156b8ca5371f70bb084cddbfc8ab374c1e725504db1ca123735f780841a5d95149567d7fbdf4edc4352ed9dfcd55e72f01588ebaadbbc231366831969779fdad26c1c6f52624358c654ca14d92e419dd62cc26fdea659f9b1526d74591b277e9687f4c6fa02d75b111b970aefb72016805fe6748b5ca3df71186aa7039c8537748bd690ca772da683fc171c4063da68e294be253c5424b626f7c7d27a25cc7c274332e16c126c75a64bc363b98c0c76c2d7d7019633578623a13fcee82d639e452037ddd6fbae8f836d67a3f169bf6776c16c5a2f887e3666c05372ed369547253ac5d8635099e465c0ae79a36868ffa057c57ac7740f25a66800459cf5becb0726328eb581a0f243d8977c1665db9233bb8a095b1fefb7520a9616b11575134505ea761b32cbe2e7fa29ea858678d9a45a2cb6b01a4aea11e038a08ad7f6666008e21cb0a19cfb231d60e54113f577a42f7bcf901e4550d0d48e6a6d7e4914a3bacbf1d200a43f97d3d3446174d53316ffe6047bb4caac55d30247f7b811a5432463bee4d24865642954cb9617714d773586e53e110b0f500fabf512ec275ff577687a277bd806b7b4876af669bd82a1bb4f42c1092c9bc0930ee46e4d885040b4b10eaf0725fb5282631d578a0a3642d15928432b7103b3fbd54b930c5785c3c8f5be57411c55613ab5436c39e35a9738a18ce4500d2533a2c545338e719126173eef8047626c024e997dd0c47ffde79ac45bbde46a13d6150dfb6428de1d46e43d451b03ca4fc4e270ca4970ab80c2acd33735ea1cce52f4f68aba922fc4d073d91b1e4ae714a06b69348c5025aa908141e8aa5918a330eba81ffa550a57123a553a587f8d8833e838658f17ce0d30bbfa2bc4187f2994ea15dd5d28e5b495c046c1fafb5210f145d36ddf4cdbe6d26aef464f362b2ab4cba56e59b02b1b022d0b4f6e80082c0626d571cafea5b7f1d11517f7d40c24048e9930aa1c38bee537a443b7e4aa9d82acbfe79f46a039d152bfc54abcfd29d0c8c52ff9387e1611f69c835a52000d26686abb7c1c3ca4c13cedf8839c8bc7b59a82e0a9ca96bb21664a5a3ccc6bcc9292bed327a895fd03dfb143b57a6d7a925458efef2f635bd0da232db9692e62574574e9c4911091d48a2335d6bcfa490746271a6e2cf774503c8d3a5213cc08213f71ee693acde2f63c410a0ddc25f112302bbc4ad9035870489fbea6f362e06418f4b74fdfae40b7cbebc591fe7dd3969c28222f8852fa33e97e21da8c99f996a0a5f4e77eb142919f9061ec65d46537df480134ab71e796640225157631bc309671356f98c67215bf721b492e01e312d4e024384d7c63f515aa2a457ea00382343142e709c4d0973a148ad699519795e82e4f1d42a1c48405e3eb591fb593f177efb78eac191fe60fcfb65816d92c749b2d037f6ec878565d202acddeebe994c3140d3189b80ec120147e38345f4da47876ac9dac0ad3a3605a296ce63ceff40e8dc8570d4b576239e14c14ecc7a9748985b7577f84cc064e8ff940f8935b92b29dc7e86e4da3531e07cba3b9865c35864a083f5b51dd95089f1d76834d62a2cceec77a9f81d2c726e5967846d7a344dc3ed732ab8aee146b6cffcf302cdfc4aa8e66dacee1a5f454bfb87ec3672260de14622488c3ea825b13492c3a8ffc443421f6be6b0995476918fb85ac0d9cb6ed7212396afeb9f0bc1dc9ebc4b6f2b182b23d92af82c4d630d18aa16cc20d00db6299bf50a7c2e1b17483d96f7866e1366d4b4a635eb2d59316ea6cd13baf91bc2e1b9640ea5a613ac7903fb1f8d7137ee0c822a7c22373f3481aafcad1e1452d8bc70f43b968f15c9ca6a657cde1c249a93fa1375fb6711ca21fec66dd38535a7db70716b3c20075fb4a55764835f562f1ae7acd6f5d80bbaca88c27ffec56f2ad79a54fc6a68494306262178dc9972a0b54a05f0e4e04ee11f3cb8fb541723ee35b2553eb0c30868111123e4057c6887ac62212c4296088f870fae8eeeb150a8770640e86f5c3cd97ac5bf2aa64f7035e1c40b4cb5f814ad8a7e38b66e6c4ddb5be1cc6171ce0cca81453bc11837295a5b88fee5e8275e6f1aed73ee94f348e7129a86881bd13ded48293205cb2a3b3e576ded0994cd3c7cc0c383a1bd05368dfd54ae7eb0a13e77b5ef62410aa75bf0b1349626053e52455d09c7574d9b2fbe0c5bf7888442726908fbad9588d74b9900a033e31c0f7486b9f6b20d2db4297a72c8a26c3db703b8ef286677ef5f281f4cd56258f633387a3f10c5ae38036843dbd8f7ae86475b4a9debd34575ec74e6e06b3fa8ad2f7c3f90282c2cf1540ff391a852c857d767057a18bb0a60f304ac6453715bbcef0f0b55b91e5d1a2e5749dcc6d61e3e3c7109034422c6ea872163db266fba399536a1995d1e10f5c5164dc1722e9a1de514a1c4675878cc490a22257ec7be62ed7d92fcc7a31e740502ce09224e316da555a4620b5890a6454331cc87ae95745756b99a83ad7236ed40dc85354cbaed91207d6b653c431f5420e62708cee2f6e63a1561aeb972510e2a5c8e4b37dd716233ebc2524022d84332813cfa57056f986494793b927298ba2ba2c4662e957402753c2a465bb7d9a23c1e7c383557b62434da4f35a9530a5952f8d81c19c18d380ac090e425d7c3524529018b099f7a2c591764f81a565436302f0bac70094402544bbc091865b6f4635d852dab699c0d7dacc32f25865361153aeb0a34e91dc41afe37bde27113f432595b78dc82e19a6d02d13bb9eb2231075bf35150c0284c7ab7b753cd21d5f4673203811e34c26857af63cce81ef5d12169c5877ec1a4727ea9f325ca8ecd4c2c222b78175eec2d1e5ba9a15d5b645c54778bc919a38dd6298aff89be6361377caff9c5f27cb9c27c6997dde7fceadc0c507a411a9666cf6bacb173a19d9144068edb529d61952742c94c813a6bbe2675dc960edda3511215c8309e2d2d631a28ad28a5de67c0554553fee3e2e70ad66a281782cc60dd56201198996dccaa8f6532588c4319470e1cc037cf5dca0a022df9f7fbe91eb23730d184cdcf26e779028f491440961a831e09668b98adb4eb1b66389a3c5a867b1b90bc7194793ef5584e2d307e0a3d69218b230c7ac12f221d684ecba07d49a208cef9d0538b17983571324a7f836d115d5d4338826c09226066ab0437f56a296730c6b4fcf142525dbb42098ee5a39a2b9fd6023e7dda8a291c31eedf12614024a44e51b6ddf2b15f6a6a39d5006c8508472fd7cb6c67e50aae221f40ab8db51c7dd1cdcc0baff76d8862a7e814602950ade599e28974b73c97b99affed0ef409dfa9a6d161460268c796ab31f131e14e0830136fd9675907e56f9c3bb509a4796d9e086bb958ef0d18fd56dfdf17d266d74c061e2264e247fe51140d55384d420fce3cadd78a6b5f202087d7bd38e7319c36636902865709bbc1680b6cfd62504a98edad537f3d61b7663d43ebb9053b951c55746449bb6b26456998f276cc1c7c27deaad96b7b1cf801b29c49141d02bc2d764fa7eeec01dc82d398e9d6542e325ac6c4db5b622a5fc7849c68e0de3a636b551fed1cc4723bdccd5698e33322ac8369ef4d59266136b351908c769542610dfa542b741b4ee2c7770172f36e410458b613b632774492b6ea39ca33e54d7210f48ae8dff63898e42feb2fd82c41baf06a1ad257072e96b6e5e25e5418521ed58c7d1707d525627eaa9a6262734675570c456100df1b09c6f432f914d913fe81090564a9594d1a45b854ac6ccc33429f6d0747d3f01df571735013a22b4da49698e36c78ab1e50a5d5e4b7749162fac0f05aa7d2cc2e8dd80429e2569e78e69550e92c173836f44e56eda9d4d56afd29a9ac4d2e592dca6a569374813b5abbb201dedc58c91207d99aa684217b46039a260c004bc548c3dc4b6892335572ee03cd082d087155f4bca67494b2a814e69d90d95a2f5a6f1446e500f39e7f3ad1f3467eac8ce60b0c7bffbcf139dd767ba07d0b5c84e71d5e3df5e622716154c394ba7806d83f594a7b3220d062824cdba479acde8b2155db63dcea81cc2e7d23ab07a2819a905220293e1eae38b30444573d3915f1cc388e9a625d03aa2816564f01dba5203476cc33734ab2fc595d50285ad5700a9714793f15e637334e345154c85f37d75f2322c604496517eb6fbefaf124afac5a61e71654e4351aae67e53e9c07c5b89526788207c8f01e866f2b85a4322473e45bf9667721837aed07189d2da3b4f2347771e754d25a6d8e37711bf044401e73715b41002b30b6aa016c0050ad0e1d451c46e33dc2e1eeff66f5af919e6b324736119ffef6f260a8453e52675a1de12852d7d48a235b365248be98df1fb8b692614986beae1b3b0f1a763e131a331ca551cb8b1fd0e2624b376cc1732d33ee0066b8c2c38a650c4609ee184988d7d4ba6c85dff41fffa84869630e80d2bd544178c1522c0a20d049282ed71d35e63c9f69f9f94cec1ddf9a1087a6d9a9738bb3425bc24a2901c58d4a96ccf1288b13822691e8273cf8aaa41d48e36e38560d6346769f6f567837954086965651ee718565d6ffe6749b88b6501e2ce21e5754f35cd1c862d57c266058ad193d70fe0af346972bf1a90b271e0257c0394c5477e924764cde482ba51d03a0c0397eb4baae28e0d64a7dba629707199b814312ebfb250362e54be93c723d48f449cc609cb764edefd3d43e9921271b199e39d99fe974bd5e8117a0f9115c640c34c519cba67ce41d56231727e769bf41d03061c79b56f52b7740e231fb19012f6f31645b0e50722154bb48c65d1cba15a7a1d71e052ba78aba4442e75f15e890dd18484afa1aafdf5d7ce4a860448993faf7d99df01cd6bc76255e35f275c13fa3d9a3756404f03d0d083f77b800d78a32291da91049a1c0428bd3d5bc1ad1d2bba40587a102f8fe079b90e8dd5efc8ab02cfd37a86bb013859b480f271a82f2d911325d065dd4cacee05e8a4647e4e4875e86e81766295054190c3c4a172912e562f134d3596ff1a7cd9638f33aa532479b77366b67dc733b82b2206a67814948b45a1ba917471e106bbfb63061bd708c260b515f0d5982c19b90a9f44e883f4d4cef3fe03edc5f535826ffa86ea59dc54194435c2eea3a5bd7590e870eeda10c01fc82ae7d904d026aa4b834582c30f6f2e3b3ba43e41e62b5e308e4141a9dba37f3569421f048b24640f18a310703ac2917942a391837e222e00765799711aef901039b2a642afc64fe8cfd0d6bce5020a344037b8c7eafd5c748fe09af2bde529f8333099fd68d42918f38733ad4b712b645d5530e336c8354c5631bd40cecd595b05211015abe7ad1460c1cb6229bf291eb520b023160d3efb65e643ba86f84a362de15d937eea378a47e38274fcd312a70894060f8d4634f7f2248b822b47ab590bf18004f3436250a7b5c4cd705c17c70715433b024ab8d7bc65916a65b9b58f8ee69714bce865a3f9955838850d87b1c3b48b15fad66b56aa67b7725de815020fb44c56e31c73ef7af0c17cf2e15cb9ed5311d5cb2475aabe1250db50280e2e5596374f4edf3148cf646b0a07d8499bc4715fa0f63f46db4ea1a8d0bba89f52f29042a91a1d7b1e21d5553f997b92e5c8b5193137a2d7e9a0a27df07802046803c7f898651d4a1e038232cb9a0741c31eb307f681b09a9578270887af8aa61fc0f2c351642b5ad60f34edb575a373b7e44100d4e5f5063bad71ff63db2d817713d29c8cc3e06ef36831f8b321cff4e455408ca174850a3a06f7ac1dd408f51e5c94c383b17cd6730c90574d48185dd90f833a7b33453fabfba69778d3425444cbb78d2dec8dd4c140d0b5fad79abfb90fb7a8530e31b0b5fb66db406b78784e26b0a9ae5d13baeee250c844ae35b96036a71a08d06728ec83649f99bed4f15d2e36d68771fc36134e16a0cd79f564312044f9b452711e9de982f5077bcedff2908562e51f31ee3a7102c908e9848d620fa19989eeb5bf9f55775210f8d15880b9435e1f584940523330b35fa815b464f58307da3849d156350245896c00ccada4b63de32d6335b71e0746cdf90f477b2bb7069be932b90324a44b957c2919cd9be0fba1bc787d973741183f909f4f4459b5b24b05bf4b8e02d54e992edb233721145625fc5a315cb680bb57e5076c3c1c774bb676cec7eca5665491c9f4686c1de090a4f919480f74559474f3e3a90b691555b616e9adefdc367085fec316aaf9277a4a6948bcfcd0b3b2112a42e8c1cd400520b13dbacbcd408ee0673dff4ec1167bdc6de364b1c25735632bbf1a2f2f313751420a06449355f85636236a5d4b80d240b71c53e9db536e59f31de78c5aa04eda09420348ffd0605c24e174611322aecc915ad63b95212cb5686047a14d84048a2b6fac067276bf29536ff133283082ea435be24a79859f2a7ea8b1601810f16f12f5ca4c7967b5d5643327dad00682c82292a21e6e35ff5a31397ae4d7e0ce9b9eafa9d1f520ac44ee38514352844a7825e93d857ee2f0dcf6601b4ffcd10d73649c4c305ca0cd1e09a2cfda1b53f86310fd31115cb6d3545123147afa93a802c5221149b7e5e49ae9c470ee5d2507c59781af15ede13fe4806f7e703ab20c89f522fb06cd415b3b18b6379845f4f73c2b6ed368e49204f3f24cb94867644fd84ef51c8fefe172e8e683fd37a997916487bdab2411557178c81106e5f552b3b4660fd74b117713f314058d9f6b32ca25e1535c2f4506655869a6d1fd8cb732e66ee797362295f8b83f2d1fddbcb13d01675ecca6b9a42ab6d7be4762793582f405ca575ba8609650e06e64b38e11b5bdb8f44da9abd41427235e4eec5d93f029fec56d5f46659ab077fb4ed3a474837014b3b8ce9ac0c795ddc6f1b380e6d6a87fd2847469c3060215c4379eea942a9ccdfa9212de251e1ff3b780237c9286653afeb192fa6334ff044e3d6f43265c22518404e3ff84cba6d789c79ff8b1a174e80d06599ee46695499695892cb1f50febe7037ba2a7ce07b2eeec74492796197a88194e7a8508b4be6289dba8f549340609fb36b7849253d0084e2ab686318f00a23b53fbb68cf479dae4e68a5226f651bf74f394050be05b9bf719e0b5e83b6044a90c496223c771d30fa319c37a5439fbd80d6130854b327876db0f42a7a1eaf26d99467601084c4884c4f833f4a56a50c7399257878ff767e6840eb705d9f0fd34b404516a81b55be0ff2e33313de4e9ba8bf8e27efc81fe4d600a45cf93f74f753c262189822f5672858a11d4c2f46276b89d61c248f76ca6a454309033412d7402f085af086e6be41676c6212c5d99ce0e15612b5db038086a0a0523b420f06e1419a5f6a127eca9e6d12099b76d03f10983a43d00fd5b1e6b0ca167bb4434fd1bf320a5edbdc3d2510a245607c2ecc8e4e11451a66036bad620e37bc22f58f516c327aa30ac1e2c65fce7c319412d0c295967d1c86f69e01288723366054fa9dee3424cefd0b68740b796e9b03de2987271952b97372ca7694783593e5ac660ad3de429f11fd3b75d1f728009bfc01b6a1635d35fb82621fcded5c83bbf91793aa3465dd9babe68e67b91d2e9afe9ed1a2a311c09dc41012991a424cb4fa403694546f9dd3dd001bf86163b4a08fbacc8c2d1f18e858f6e52352427e96652592861867b970fe023b5c0a39c39e3a4dd72bf128e319284e3c5d89787f65814da1790a2e79d7ffa372d41c740d6e467ca15fe552a53d07acae66a317f97682d5dabc974a6cf33951d46b650d024ba3555bfae5207f2ea864715d7f2084e86217a90db051d6fce795983727105dea569c3db24401916256ac1433d836735ad6bdce7cb60b9a527f5f125087480697c05cb41c5d37d49b79b948fbc25d23b108f30de5df20e22516cde264a776de044dd24122aa16f08c58c4a390ef5f2d9a4a7d9611d65179e7ee151671a373d36249674d03845f2de7fcf721e5e73bfab5b34eae36c45b505595e4f7120861d0330fbeb978ee2f1fa9ab7d0dce725dcf2a0fcb24f222629ded17f76d9f671ade9bc755f4a5f472a4e26d58e142691fc8f3b22122d48522ee53a4587019624112c65ca895c75274e17d8ff9a085bb5a84f72e7aec45f709eb5a995efe64fd7580d4965860ed4b6f452740a5448c816869b62b861518aa57419941c5d10c8a457b0578741c13bb72be61cb3afbad3b76dd02f54838765f67d6c06605d0efbf396404d5c0ecf3b37c739ec9b34d705b102b485e2cfd2d820e65df9e5cadb6a153dffb280927857516b18629665253e646e489d0e6b214c83582c725cb910f2a28bfe26db7669bc750418b227ba8179e1107a8c0c87977fa0c3da1751055be573e50ad598f19d11f7eaedfd7c2c8bc216799c93a16b09e5037dd79f30710d8a5001e9f34aa8fd1d53577be88a6b1422b073d2355e106911112 + _Keys: 526a8851fe85233e7cc810cd2b8a733faa68e71a62b99912cf2f06228873853005edfb00aa354575a31cc8ad1ac7b966f52afefc8351b636e2b71574be99675b6400dfc3607f0069e96d5112b3681f5fcf550a7f3749f10c2c006f2e23d1db370e64801184e106752a681216ffa3837998b5a5688fe724520d14109f10d172186ee5fbb117f2241130fcd93d5728ea479cf46b8ba7516b16ed2e96b5bbb6e20e0c6272c125d7806f67cd366983232521642549cf9088373bbcb047a020454d5bb82aa5499ca2e04b74417380a87c864288e4671d588e1210db981f281d4a325d1a036b29e53abc3829cf12c86a843666a9d2726c53c784328db49f8d499d214074d166a5105c5d3da29f4627a1da7a5e317a2d1042614f5281c64a6625b57e38c6bf413c35ce7d12821326d7a7c36313210e18f42f147d60db1f64f3ada3bb2d6666d31a094491222bbde8f495825a4e2f05ece33b3881253ca117543370bf2531ac8ebf10b7f565a03ac9712b88ca58c516c5a7b6d8f161e8f9dd682d3dee657e0ec3e9f39a3e76118743006e0ffa3a958fe6b6ca98245845d258f66aa26d222a2ff31dc5e16529d84e972e95f1f208f318fcbd24a42f1a1594d13a0cca1e4d0b9a28c0e4238a4cd5432183fe0a3d37c5600352a5affe32a0f1cca64d60c95d6de43a2f1ab3ec2f8dafe7e182ac1c0b579975acc6cca75b9cf61ff356e4ff757ac4f0e2446c5178b3cc3b0938e3500b2c3eb04c15e369388d95cb10d3df8656508d984144c6391548fc5f9307b1937f462b1e94944b8a5d47e5baaa4a0ec664069a951142fc403ed6b4a90102e5146519f66f6d35134e18b132d9ec6c3ec954f282992fe09c9f2a9752fc7c47b5d52b06e06eab61a6d10e4d7cc274d62caa67eb540f7f4be5844b6a66281ce82d2f660704e68bd01df34b4f7483a3a0ebff69576b98633aaa8921a5ddbe04814bd97aac297cdb1235373261c4cec06828ec556592c57c95cb2c5c853ad052230733029b09f8776f245772a3ca0276dcc8b833ca146a1411560f76a926a9289a1bf169092fa58ddf9c3a7517c82635364a7f4df403890f9d1ef144fb812196cd7f0c77286780f491baec2cdaf4fd482fda400ba6f61b9da4000716c29e6ca1845b5768bcaf0ecfc98bbb39185d35a921a8142041153dc39aaa1c286f97b630278db035fff6d32e0ef214326ce60b1f02d1fa31e71c6c1ca8c75d472e9349f4c45f8c4dc0c2013af81c5d63b2032b19179f0c5109edb220eddd4a554c13b12cb5d56721429066885700c558f421713be1a14442bb774cca3425cb341fcaf3fbd03ccf786c4d5ba70595a869cf6fe72c22325567a5649773f2357847af0759d10313b725cfe3c24772aa470214482b6154a356625d3cfd5f01ca892d756a72e68478521c260cfa05f49dda051e95883b60da9c51a244d0c0efe9d8666defd20837617d7266b7c4b857af913f62f77c9653c48e6531de7737b6edf43c1fb5c7c5200b0056ee483116cf9b411d5add2ab42d68210eab747ff3c96d3a504da8889e1b9f6a76e44a45824db5863649a09878ada45b093fff39b97a41162843c42da16cac080e6d98e7aec85f367b53fb8ec0f6007f0600beb18fe2b7e76ee911c7c76ae00c14c122f29acc03601a51f08a4016e1082f6d7eea356c2d4766a7c4e03aa5e33455a9d65f214d9d8402a2681f2dbdd87b070a985bebf6d6a81097a7bf6f1b653f6d44ca68c07e191e3105186bfcf1e65731b726cef277b7a02e2f4f8ba6de14e73c29b17188403b8622b78df10f42a4017cfff026423332e5732a39eecea4c4101a0158da5ca71f8e0cacf1a805a8b07076b2f15811115bf709cdfeb27a2a54c77a62f3f016365a2b209de610da2415e4793787e44c9401f65bb01b6f5693eb1d01b923a2b5bf5a3f57c537732b4a1ce41e1dd3bc5c8f84196316b39ae5142b724ec80f2101722eba6ec83b11cc7422a66c365139bf2fc07134f6c0358c0bda930f573d9dc4051c541157fd8ac87b1d9952a64ba6e19ca69e2499417fddbe2caa24c1a561f21387762d2def8c67a4f06e2bc76e0cb0d75f9409b22d34593aa82d7ba7ae89207f8b652d5f423bce6076d56121e00caac4b88c2c7dcb083a94c883285aa4d5c6ce0a8162bfdd6753d123843ddced44e075745b023dbb7e5b896e8269c01328054c9b302a1ab4da484855f13539de7736f3892f04d9f6479188c48f2cd00d4fa9d9c99a7201753abb270b443240a506dad2e62f21bcf924dbc733497deec366e53a852b5d6e466fed752cfb7898b19bdc423679483d7065d2ed753932d34255148ed5933b2f9bb6e6a9e268170b63bcea6793c524c3515736dfa68f07f4c3e5cd2819166dba29f321139f0d5a074dc689b94fcb3f83cf281fd236e5292abdda6dc835402586d5d0c1605cee625fb13d2d6d18c0428f254a59f1f69a0ef2e209aa3a5f6e2ef35ef170e07360261e3a3ede074843437e1dfbee809a1671c43e2f82acbcd800430f3a0f274f621bc623782b35791639d9b3d6a7a4a251738a9dcae15d1d2c629ec1dee87cac94318016b3a41242a73e5469a8f9e5305b1a9e52653be5bb871d51da8e739a2dbc794808278eefad6148f68c8cf374337c311ef987ce12cf173b716a0b132fe4277edbdd4e22f732d40ef01d45592e93a97ca93fa95e5a129817e09c00a6478b8824b30bce51819f29142579bf2f14716a04ec784291717a27138999bca5ced2397ca56aa623c557fa0aea6b7c2b2d37d36ecd046c4031e66938e3bac7e8e2834609b33cd57e178eca6b83c7852308adbe3e94d428359a07b5400093c0f470edd76c4e79870e9eaba95c32283d069372be6e79067bb6ab7ca454796a807a3129056bd4516d76698e182e2bcd6bccd4d0d55bd256e985ffc3c546e2bb353081161d28e9f2b17c68842a61ffbca8999ef095525156bae067ce736817b45824c349af41156b1c1de1a70c577fb57abce4d3570d25e2df2a5b3cc1489ae5994cd4f9624895167ccd2c878e56b79ca0e2b6cfb2425d4b4aa628d99c27562c7d03f23f7d7819c328ce578ae1527135e0f7dda3ff6a97dca81f440971457a5478000a8b6376e1d8360c581b142d9608e7a1456bfa07b11db9cad86b165ea900c6a33576f6669b6509fca26e78181e3ede275a8dd608e99eab8ab79fb62091b490f2856d9b4217a75c73f0925d24f926913197ec393b9de88cf0bdbdcf010bcbb3426c6c6d7e45accf53ccbe9060865688a783570c0b104493af50b47d63cdef662cf94f80351be43050530347601dddf3f456dd262d70d44b89935d88372e86a8cee0b3492bd7bd8d9f26bbb70cfe339272c1880d54ea6c44dbfb085e779397802554e9bf30d9e0e167af78f92c74a879380f050748667067538e266767fc005c1939ca0c1ea78a5417c0d02940b651858937153a686575e98014203e3ea29e6086c3ac7102284564acf772d0414ace1d3510e7224a5ade01287e0be64f896976eb354cd453dd6c74b85fa2e828b9d4c8b9fdf7d24683ea1f5d51667f1d5e15238dfce40c6aa371127c5bdaaa470b279155bdd3ad6d9730674a2c76017713a8a6b681a4d32ac75e5c6e094fa25e94676779f8d5da313d6e0934833ec218748a6ab334f3c665ab98e2e4d0e388478e09b6c50e887e177c2785ed64615806e08b1e6b46aa6d77d33232a00d0a9e1f09ae3d730b78d804f67dd0a3864c364a40dbc45b01f48e388ad267be45e0da793a5a1c4adc1a0557652262c47b11fe1e96831e163005de15e0fb03221f68b5285849dde06880275b1fe340dba9ac4b77d44955c8fff1aa3ec7ce951ee81cc70492c6e23b11207815a53ccaebba464132d331f694d66968042f655630447ceb4524f930ad89858d646db8ffaccc4a5544b8dbae93ee5fc7221100bbe767782751d39f505d3e46807a33ea248231afbc4820d464750dae792b485f35f3da671b68c470c6f7a0e967032bfc144474afdf073229c26b55bebe32404fecaaae93c74ce2f2e2b42f0a3340f1adc28705b45160767200e0055d2a29c8d707be4a4cbf309d7b188aeeb4396969bfa396f9cdaa0a5fb2ccc36c18b83e1d0c7c0612f18a3d6df22581ccdb4f3ec869b63bff3fdd6a7eede202e67d624acca95905cebf8377cb9ad6f957d6c17c9c7103fc9e83c122d0ed77dbf077a81090dbb52382496f07e63f079a15d6c254af5f9f58805fe84e95842a43c8a098540f3976cd731b00191ff41e2175a4c759503476afe9fe6e300d9847f88b4d2f7928a47323a00b1f6ca17ac673be392639b47c6c03e9b7c20fcb46da0c63f9a56c2597491a17ebf95a54e25163c4e2ef2b8ff153f745cd9d20997c11191ad330651f32975683415037232d20cceb1df1072bef44313d81ec1af4022af362109e2f2c046a22d133343118402fce0841ce4eea74ef6b3011a50766a47b3c19c87847a134bf8204e4ed2a61a6801b71d94a7d2505286ef155af18ae4a6e96bb747f19561e72b38fd7ae012870ac4269fb76048deaeb8cd4eec2230a55a2690825a3568416d70ae562427dd5bc4403fc346500705927a4eb212c63f36e41d3df3e7d298f24eada7da53229579148e75640d90c0cacd20fd3d11862168be888de916169c0e48b27b6757d3627fefc7d6914ba33b8b137cc9492aa430c88f1098dba073930de2672b5b1567fd6f7162a2a64072a451ccf2c5994d52e5bbfe973432468198e568f78da72731274c4468ee18fc367d4dc573e3c894702f74d106b78d3cd639abd3cfef63523236f60c0820b69a9687bfae382678d6e451af4bf491b069c3f5b7650edaecae8503862d4b8df032e396fa51cfe8a26f82ac953246344f2490055701c155611592b394b9a3c1ee2f55a1bf1f247ccd2d2694ad889b2a6521d6ef8a3102955feb74a8770a5d5a1229266ec4babb2d341af68b75b7f20341902746809447bd2cc041cc65840a4d302386b6bef9ff2fdcf41490c571f4e8127805e731a6c98de179420d656ef8a3a32d12f111d50acd2e01727d13d91114c1fc636929d3615656a0a7bbc9bffa1e8fa965da8113e79c5a1a532ea7e69180454e3301d79c190e8d37329dca220b7df4ecc352b1196c41eb28f0f07fbff1c2bdc8067b8cfbd62bc27462b9e145567c25c1264b234edf3be1e113122b8fe0f916a78044273957140d5010ea7ddc4fa9baa221fb56a55f91470e032c3ed7b7ac540e3304aa888e7b67a23199892ea67d8a8886e3c1377a78f0b3b603c0fdb93fa5c2e4a7d24561caa96003a473b91a75a470a6a98d8a779cf888976dfb7c7ef7a257b79309bde95c7ed4c3e31f237a3cd6f326f0a0bcfdefe65af544078f6f57d7bd96bb14684e8d850aa19c651a98b6a058644e66f933b98d3f00b2986bcc9080f6c13622ba77a1bc4cc0bcdd33418335b655093c331b81c194e667a0d386610db497d85bc8c077879970f0f788481ef1da14bf438ddcf86935441de988d54da39ba18e886f1c49546fc655bb9abaac6878c5c94128d280185080d674ae51107ece948329c69750e65e03b43de1680da2a9e6d339ae27b70de8910f4c85e45f9d5f44230b5c90e524e0b3bb3cbf2f392c067444ffa037bccaf833cc7382a1dcc2e985810164f89baa0c11e6db27652245a744ccf5d09012d86897f338cd68b7928087baed62a36f9895535a8909556fccaca71c2da8aeb7d87841910cf4ee764334c589bab7b57cc374f33e8b0b4bff010953f3aa8bd48d085bc6c8f107a773d9bd8085ae78680199d8806d542fb322c3bd701c5f052438afb772099171a234e388e4c2754e52869eaa729cf3be1ed7e1066351884c3d112e46d5e6f651930b7ab540e30b7f427a95067244828744e1a89a15782afc42d049fa043e686b803d1777123e6d31c36058ddf691518771690e1bb19c4c1ae08e7270a3159380d2f096af52e49ae98b99394ae0b30a5bee3e9482c38bf2dc0f03696c440c8eb8e3d9b0f7256ddb7321eb7fe79589046c8721a11e50ff42a8e2455fb084deb57827e23eba63fe7ea3e5f84b41043a71961f0ce5126253061b78e7fb1fe1dafe4090f80f77b5b5f77a5faafbb6b40194bcb6f5cf81c67325c4fc13417bf66e95cafa0ab01c2616a42b0ba08de2b15cef7a8ca7d6d7a48c7a140dd473d9076360c11520bcb94177895fbe6b89da010779b0bc3910b1657d6f8d809c1e51a2db23983fccdd809677340ac188e6c6f65425065ac31cde52b0b4684ec0d74a95cb12999f1219ddd6091a34f505efdc96a778c388f7f92041aada8f9eca2098a1717f73748fa9f7920d239e571826b330710ef76803c19dc1d267e4578a3f1bd652d666756341165281418be46ac9298418b0e234c6df62403e5e6dd84a5ff83207c7f9fe8d2893c21ab6192dca5698e6d19fcfb4debf52d37bf9b8fb2cb1f7d12632035d30c5091144a44a00b64485e7c3140f88e2c72327c9afae1cbeb46af0615472d17ecda1c792f3ee5210169112a5ced08811d51173c1498e218ad380442564a0d94d4a7b01976a0d20c469d880ac65d0dea36916d6c08bf98efeaffb24ed4439108b966e8286445e5c71c857105ab9d738398585c3b235fc67b358fcb4e3e5b38030c80505f8c1b790f545aaf2aded7ea8238e50f2c6133d4e7d39ca10cefcc763eb292062b112c088221b218375064a6f285b279584b0b643f553733108693df771b8e887022ea8ff32272f4137463f8873648d502070803712d5ee33e24caeb90be938541ff778b61706a531b2580bce919456724969712e6917d191213cd0aa46f1fe61b4948bd6ed2e296715c1f97ad1bcd5769330f2656a56bd27e5e798a6a7fcbc427626e326103d6f7794f8f66ffde477605ce555d9b4c48970269e3194a2ddb4b47bb613d1980af006e089f8329ad8393699374d2626a4f9303736893d3d7b9a515c1c36dc4f81cd00dac6395520e1a3741c3fe060f90aeac4987b19c151667416f40f7684def3ef65fc13512f827c6c3729fd495d6c0b4a5709048b555461adb4423269305828430000b9ab1a5634bdd40ef2ab5ebfc172f7451f7dc38f44ca559a53229fecc411024d172884e43310665b3bb8c884c83232cebd3bac9267ae62c0ca800cede208b30eb46b749d8a58c07352bcb74a20bd94ba96abb70518f6b7974f4ce53ff24fd0595c81e74014cd75e59579ae6381f0b328eba28bda822986b639b074285f15957b56455eba24a932df6e6af1de16fed2d08907c2b0ffebc3d91e4d3616cc5e57e068a30d4ca1f8f4dd6899052f7f44a01adb6a64188ce3e684fecc49a919d5d1f913a3f667a40ea6299d2f8f8b46bb74c636f7e7e392f295b7b0e972a710d11084a917cb3e0d4635c64a0c24c961d3d7dfe38077daee2e43420cc9b0651a2dc31d1ebc4188b4cb1268a12b2f554ce9500eaa57737e24bd950156c11dd818e75022a8e9ab75fa21a596646a776e2dd613a4f2e8a3b57e369743587910b5c8b361888b5ccc634dda04674e22ba04c32db0587acd350e64fa645f0361788a129f93f4d80847622460d718e44af390f09c167649684afb7e531381087a00e5ac9367d20fc133249add740a062c3a29f6c351c651b747a894e2067a554335438e44327f1cde6ed0971e14a41bbf0aade71675dae7b56c1aa440b2ea16b6129923d941fe9be9f084b3a9479024144bbc135ba3fb4c3492055d86e52e98bad405a84f6148c3b7122ad2a231fc58fce6fca7e1953531255ff144f6a536ebdcff41324d423d6c8e863663b3136bf1d32b2090ac57fa5e63df301fdbb7aa86547c714c35042a23df12748362346a2af44b8156a72765608158d8cfd312387e09cb019d65c68cb6f1efaefb50e0dbbd7c659ed7b8a0360e41da91826af4f35de0077eeab2966d89a0daa850e790c2f4ff0466d5a45210623d8f69ddf0754ae6031888835886e5e29b6c7b7f308009da3c217da7df95673ba9d5fee78c30ee65f0ee602b9d47fb09db1bce5ee0a0037e7d0ee86e42c05b7a2a21ac263493b123a1ea71ade021dd042c7772fb63c7ab09d30cddad64d6ef2a5255e2b0e3206fa88a9abd063e5505beb55aa1d3f5b6bd1232b799bc9610614502f07a1d6253d6cd3e4e2ec92b870132d7d0feea64635a6fa99d2b4b6af48ef5d3562f701db50a0ec4a79453ac06f8ef5d3174c1eba73eebab31fb028e06c822ffba2e9a7ff45b6e493aae93bbb6f9af1e14ba87bef34fcf2e794bffc0d745c69ab821abdbe49752385bf4695c3063fc69ddc8e930546d71f0753e63e8923ce681e206d4ef360a8110ae281cdba388e7dda89469779443d5decb893f8ef4b57c39fcb0af7421e47017b60621737084865176dc4cf85799acd84581be2876b43e48d5ec21afa3560e40856f944352515c42d58377d100bcc33c15c77f25205e4babd3577630b3ed440168219f64f424619fc1c6ed4f63cbfde62934955223ac9a61eba5969004fb9ee2c789492242a1c80b06ff717be50403da17752cd257e7443f8358ee800094d68634b3d25ad43c2cdf560a7e12421646f6dc5641d077c9ef2d76cedfef1586b5456923870ea2450ae18c8858c6c08b028f297d8dcc13793a408bfc606a2618009ba1fd68ee62a599175b6053ff61d5a21f74885d21f3480cc869fc554f57bc95f7102847b6138bd380e95ad88c353677fc89f1496a07b5aada0e318c3c473129cb7d3ffca2160467a8250f525b5387d1d3868c382d80ae90b1981dd745c46ab7d976a28063c76f2c0767ddb6dba55fd649e9ba661cb2c3aa6c78588bcf956d6d27a6970de5f3467952322c5df5b0169cbf2625097344a5dcab9b453163936788019aad29804233d2d5cdc06bd407019532672818bc63d8d7ac4e8e618477a44620013b013f65902491f2f632edf78910e074f42b08742d02fc6fc085fa95fb495675b43d2402af8c75519d8cf4c116620addb941af0402240939facb6b80d5bb9b078eba1e25d9fd8eca9bc4571413d2b93a137c6c24d0388c73f926d054a6c9e8c6e7f3b03478abd53ea3f23a95b209c5d9296adc737f70d848c97dd1009046820267c915b6bbb8c6a7831398126798f07fdeed08e3325545ba7282e594331a21057bc30274e91be04fbd763fe1f8c5e5a747ee13f6c86ddfcd1f6e82b4b6bd2468e28296901adbe560ac6716d0a5d4876ea0471c4019e5abf58082c97032fa9050c49353a01f6a1c74f47aefd354919b3373616445ccdab782e4a6a120a78d513294d19791340174152c0174e5e4c345e794d13ed33566936366fb9b2554d574d55512d62346112b9f17f5bdc22d74849db0d1bb064e4e6e6a61d506675d224e50c4b614d1492fde55d0708af69961aacfcfe5ee932e66211e085c9c55227903a0b07b9a46e7f8214402bb6de623f1e5c5bdeba5d2dcca3d4dc2d14ea6e0857778404d76103333e0b5c956505401a10e4ef5c6f3042d6d08c86c931ea726390e0507706ff52a0ac538a933d5645fe330a555345654c7d4feeec0bdb791588310d54f61610664e60051edd993b7bc53a96f52a47e209df9e0c581f69b2086cbda2a2ea985b337fb5d4317015c46fce277d3175e7cb676fc2c1a196537425f27d077b2c4e34544b385f641da77957e5aa499d965dc71bc8f266b125e31d2e0bb82f7606ef4e5843b0f897872b493545bd1bf9af30a24f843bb211345bc43b15ed87a215153e00d2216f05e07a63186f760e1d8a8d2e16bba7a043638e9263dd71c72675172669cad6208970be4d2c19a9a46cb8d49f275a9ee69cec23c44bebcc055ad1400e0dbf55d4d839d1061856374bba5b830d5aa429a74d0d848d08a5bc7c61339be514308aa04e356c1a43a98a7574396c8e2e550510a9164da14113cfd85bb1677d2f454a0a5cd01af12c8427fa5248fdda77a16a1771cff40969ceaaec1a66c03614767c9f03f14739566925554f5f218e6271da857b3c542541e747b7479dacc820cceff4fd96cccc1d5543f00a5e6f4c0d57638c02646c1535a3e0eb38ff80f3425c351b4e158bf83da6a3cf7f452f9f566d3b10c6df394437fbd5a54a1f6ce22c51ae66938a9b22336b4e5bc19c95f02e8142ccc4702c636a7a525340e6ae1e3ac0a2d0f39533e02ee723ced16bf92b661b89349ec75962234bfc0edcee621943302100f9c5fc984b23faab93fa35d57f26ed5a6fe3bc011a05f43e9241bd1c4ac4ee5eb606ce5e1622807bccadcf2815d871fc234276d97320e6f4d1be06091f18f6d00cd61e780bb48e6e9cc732372be4ac462f3f07f739c8d2d6ecc230d4278a9bb5b7fe1c3e08e907d7d0e5753b52e3df4b95b3c7a1100169bbfcb774b77c46b8edd3837fd3396e3e1946dec81e3df1d7f51d1bc08b3d10669c6161acd20a2d9cc6dba4801f0b5941de172b9aa27fcab738c0cd60f93646942401c87bf669f9f9983d7592ac258f1fcf312c96a754f7e3d5e71b6c287295fd2138a421d4224b751f3101650a36f5edcd526e38f5501230f51b5af0b2732ed92c8d4c1a35500b0e1948898aad6e266123f6c6851e5df92fda8bd446373b28935fdb929783254982b99fe15338777d780b0732445257bbcf867cf4c12452bbab8fe31576ff41e5483f493ebd3e5a089df1a4c4cff71c420897611eff1a09a80ce436c45561057ac9ec7b839b9602902b7357cf808e75a3aca10ddf9e231b6248f14ba2751e5efef61d8dbc72a05a7394f1497371d92865a56ce84cabda24592e2133731e5a1bf4eba7279dff46154dfc9b4bacdaa82b2119e5fd083612531cf9338d516ce76f11f3aa78354d7464ec8134484625d1342ab2eda6c7a2ed2a0205bc69cd2b9946e40a5c9f8420612c5c7eef79fe36f309d80049fca572c94c202b8acf6ef4683f1811d3ae7d8e4709ae3eb4b74c8bd338073abe328b6a1371411080599591bd6717af61ec62458c4946bf551bd87e6754013c36cbcac94b53019e9293f1128c40fc1ccefbedbf9b3e518a86b440d0b540872aa52d3776ce1f044a11fe28e0c53433141fbcb06b6741a0f77a3f4296123117aef33893a0f7794daef7a2ad9d1671c552812bb0f88f1bc3648c3ffc8fdc6dc81fea292c02382b0b996f0274c493031ff7850fea187e0e3e0ffbf72d3676412f76953278c061377652e0e877725801d0895df314ec58505f2414e3f9bf0142f14ecf14a63a845d6ab26567c7696835b7fac8b69469561ad0e5919cd5453034abdd07d65cbba50bf344769d790f760abbdf99f387b8d779f8b445c0a8e788501d6543169d6d2772602c3baf0c465e3f708657b4df24bc0cfa7132efff9a4c0a44da7fec349f9329faf36ca583d8933ded7baede6f2b8e07aa361c2c3b37730588b994cd388df50e1b80bbebb8178921210b2385b7d585184b77966bbbbf643e7f99e236bc3afa7b70bdf8f0e77abf6daefa4d475bf8bc5cc052e74fdb9e3526e6f96b51f9c0de18ef57eb06236bce2fb72918b60dac9978aac18a96ac54602e88d2d6e0e5116613e3cba7fcf249c62c211697b2867e186d6d1c58c8c9b89365f7bc8ff542af1559c205d242059c850c7849473c13ec4b0ab96973c9b89e492bc9be0c502644912ed50e107f5429972f974c4f807057511cf7665054dc21ed244458f43c562acd432589eedd0335a11c005dcd93b1364420f0d7b8726a19f40afd343bfb345bd93e1993a5f9462f1f2cf892acc6107f290c14d42c2de240ae3e82071f310659175b848eac45dc3e663f497495023a45e57df4d1189fd154a359be1c88c0f011da5156f8bc7e2d1bcf2a6fede56eaaab0338ec9c3c3541788a27330587bfb5a54e379b4458320263aa26fe12f241c6eefc121a50ad8c4d0f92226d95b032a38ee03761522c99ad2eca4fb99ccdac95341244f68b599a073d16754dc95f68eb223673f329a2181a95bf471bfcd4b042e58c5ea7f53c18344530233cb64ce4ce616325d440b96c91f92a734aa1b50412c6b733ab413e091ae1c0385ac654d1e2a4167c61f9dd012b20cc5e1fafcd938f2c1075ff188f10a06d3f0e818112cba5599111b832640ca4b85f758a1fd63650ac377929362f05ccd8e232c6137f55f2ff4679a96aef0674743d1c3ee94bb8a5cc487bd86eefe4fea7401ea837983fcf2d274070d834b607467463eb1ba0055548d31d4d7d8ea6c2b2ca29025933dea2cd74254d92259736e2d552c117e49d5295f70fc2e37ebf75647c4b96c9561a7a382d38452fc26322cda1354072cd6445b20d0a768789ace911544ac61890b5ff35cf1b05af1f06f5ba4701e3f4e2b62f53c863acfcb8b6e7ecad14e5e82e22c29dc81bb0b6c2f721325847f9db55aeeee26c086eec31b868ee675b6e4757e694c7c152e186536baa968f32d382b460429fa07e0543eb228330265bbdf3ad1469f3371e0f1dbfc11cc35741431f119b6cf56b15204db2858e0366356f3c0fc4b5a5003297a56340ef9d84616afaadd27bf27a5073046568f4ebb93ad371af23df4eb6260eb6510ee4edb411155e3b634258445f38a28cec19044f65bddf6176ea026528334ece2fd158e65c6d7318bbbd08ca18f057d0b093c01f70a937fb6be579310e264c6b2637471e1877f08a6b178d62202974f08e3869fb1390e33a17907999123cf2613eae6c234825bf03f51b4e595ae7c151169f13961df0492739a9e97f187dd63cc2ce7f8e2b0ec80a1e7f666a312f316a493608187c03f7a67eff14fc1372141f799eaf8246edf96bb7b4e6fb0e5b886623319bbb319cf99c55adf82c533d8d3df9b793ec552746091acaddf30b8636ab12d2f78d71f23afe0cffb9b87bdc2edcc2b63f0c0e3d3d8fd69bab6d5d45fbf1186961ad2e1218a59dac7019492f654a26474f70304c87dae4a43e25347af8fc291c147538c74447e729198c5c10ceeaf3ca95b0663f1dd9790f38fc187c62c9a85d480214c6b6a1a429f25a114938221b7aca0b34563e972654231127f80ee2c40cfba37f33aecbcf7998f26af7a07f4c7d7d384f341e9d1cc67f976c005efb09cd113d09452deb55f7e9850ad311d8352b84dc6f1f6cbfa3c0c6877126212624c5156a3fc4853aefae55483cb362ff0ec1fbb121dedf487ce068ad5684420f84e45bcc481186b6301b3c5f2a8e49b798c0b6926e4679ab9fe349dc3ddea3d0c8e7c1da3e5b0261941b5d5c58c1c68d2323ca557af7d495e313830e116e8f45db3d4e121b1073c1485b9a1a2ecf650080b20cc9755bf0d094e3e98c2d9a916a800f14dd1ecd9fa9644cea3f1ce65115662cd5c616c8f6f5720334617096486ab615f31d398d77d0f95009993c97279a5bbbb81805d812b445ff9d5c599bcdcb2d2a7bea13e9c5d5db45dc254c4f1e5f5ce867b630af51150ec45b5b1e68adacf7bcddf22a977761acb63bbf140a6e744a03854040bbeb62c6af9e6b4f1670c92adeae11583de62c8af9f533204ff8e5f7edfa053851d79ea536c8b279fe1c6c23a73b53522609044166d60f31b4c3c1a6f67af26f9005e6f6a1f91161ee57323c62ed9c1e0cf90cb59ea3515cf2cc3c8f756df66d3e978f4db8a4ff1609cb5b1e058bed59eb2bc09435ac821c74ae6d29a0d64541e3cf3f9cad7708147f80a661ac786567ea340bf1c307984a0e5a6e4c07e90667adb19d8fd556d77a50d0b76c46b42e697af14c0425296e40f3792a6db9ca087a9d7dc8cd566462012f813f059e6b342fa0d5159fc30d391566ff5f447dea9c7ac83ccfc8ec611221a5c02825591d4e78bb04331c4b96497043b23255c4a67f191dba3c629b6b423ec3f4f31141e07f0d4e361d79b2e4f35e0da018f23895e305f5c41574e6569a02df2ca091b2217e6a051c7ac358ac5f5cc9688e3d2b3c4e579bd73af14ab9d3749631e8d039456c2f3c5e9198a49480468172460335e3757fa9f7328743d69d2cf9e996a1567ccb7ec89d9649fa9b1f3b7b382491bbcb502f638a08b51ca1625aec460a260c968a78f03a73e95283b94fb2620c555af5984fbfe42906921e9c2f4312db0e2b3b9729dbf0c3282ba0920fab495fa5474e961e20a597d8937c190ed7a2a53fa8aa2377351cd0b5473e841d531ab1dc7d41770a854312795c406956f52dff31b92d480026e8d9641f4b655e2ab52aad2df58c1919b0c3ecbd9dd30cb37aaa743db6d77f9d4efd9ae424d52faa70a4116b1783006019e8f696a4bc77ec32e8660925631f7456f020080dca0ada93962d42e477640955eadb311f17410a7585160d3b397b0d849e152663f751b0222ed5c515462f56b290a1f0c0ae6d6e322b7d92e117605a1a3ac7838d8b6cb3c4d4f00fbe830a2f55c05aab978b32340ba8f43779be6dc67085552480533748d1b5f5e84ca53753817ba96aeb8733341d61acc58f5d75a81b18a67ec05c02f85ab04dc855a640051e6049e6c66547c70b0ec3445e4c4775409d03654cb61221815d3b632b0376c5a1b2e4efa65b1e4a2e208d4e6742650d68c108f3aaa5512b8dd89b97d61c63079787e610313732e57fb9362c29c4763c3cd10496057d6e4804ba61cec0867312bc94e5ef287624cf70128d9c238101369ea0a4fbe7320dec09d2eb1467fe24f945257094de8713c7ac3625f3efd2237d4767939fd49006f0a1fae5568a1067f0305519a4f9de0479afd94034ba682bdc5026e09ae62163039f580decd2e12074ffd0e3d6ab48212b01c0b0c7e9180eafc16398cfc6525d1527de36e78b234a9e25520342f46a2f6cfe9b761e374d52d36690bb1af26305ba26ad32bd84a705958e062baf62603693745e240f3958653956c790313e0a3844f280233079167371130a98a0cf9d14be55feba11ec3a7f6bf8b82e92948e0e78e07bfa8bb4d20880d201ae7a24662640c364622057a61b4ba7d17926690e50d1f51d134d63fc5fd2a80b13effb5e489398a8fc2a9cf24acbfd5e2737d7da2ed3bdeb48a3c9ab4e6279af2f972d9977b01b92c5bd221b035e3f167d46b4b956c96e7015af21ec498eba01ef13d72b76e9b947b2842c045d6cbdbed3da521d6b5a5f34edccddd471d1b7c9fdded40f79ed606b7292f82e6297ed7f921f40dc1f2892b68cf4e7bc388eb8833bf6023c69af45e779e6abd960ce2ea920a1bdad6fdbaad64b1e8284045cccffb48496a6672ae8e4da5962387ca72fa9707f068e4d71b919778c85d12c7193aad22764d27db670edcde5af035e6e105ada3755467eb3fcfa5ba1401313779aa76c485e610c012626f0f35b323fb6ba097b2af7f41ab3d37adba0d1e10a7bfebb80a98f58348d9924a183c98d57cabb115c498f3e6e8ec1b875e3866b30bbe38b0a5f4d6a45133d09c41b969e15bbddee1a3f7b3f14b621cf313914e27d12156d162b9baf690e314b8f2ba3796ccab12583f1030270b1643d050c25aa4983ef85023961333df860a1f35c38ff12589d0515c59a900d14fdc790d8b4751779fef4c3e189cc2a1a9c84ad5a0a3378642a5ca92bbf0f1e816de9c8d63ce953d6b96b5a2dc3f432d1db2f621f3e681d323ff503111e4338f2edbc8b60fcac567a28285e6127b45ecbd586f9118dc24105cc979646e6410afca368400668d23358458d755b34d305f072f45052f98d46cae89008d8a59f36dcaaef0850488569cef96c222863247b2a8a3c214e4d191faca0cf78856d0b4d5aa8664fbb344b58ec8a81588d6b1d663dea22b29682187191d0b3f118fdef3b05b97cd0ca74365f2a6bca3c343f6e16d28bb4aaa9999305f565081080c4f9175490be2b82298645f00e6b57100340427d5255e2140a7021ece52eeeae6a3a539873ab37790e032e8d7f93bfea9fbc65bed72855086ceb74645171270eba6f74bf3562142098e550bc25e6361275ac307c5970f776ca3703a1e02cd76223df2df0e081e0fe2f7926f2d798e286b46126ffa2abb54978fe76949a8cbf94f2116645b84532f4cc3255d396e94d62198a137e05d504cf95776922088c6744c7451be9ff9cce6e2f3135d501e2b28fb0137910793d9ac816364f89b5748b518f2c36f12808bb2e0efb6fd7b6de059d73b17ce71854e35585225c8da181e88f91a7070e58a2c078558b466cb5ca52b624f11405f7a5393b49e0290d51b201f43583458d0d77a0bbcfa66750921c671491343c7978b427a2895235328544de2dac4313f414ad2dd23f6e3c55b5ad78ae14a65f0c33cc583ddced02ea347e88ed278d1095b174ff2f39e47598f21f7e173bba2d5ee5380934d747778806fc5d0559b7614c482526835caf2bb7f815e9e15c726ce7c5f6097e0e367793f8bc5b2b6bfa7afc8f31a467ae29034596141dac03be1b1ab623948b61d64db866ac7bde64a3183255a4874220037d0d0b4482494dcb703ba076e18e8e055d9980a331a55b1d573a2d4f01a7455e05b2a5867f1d54046a65c44a80257a583ea5fe123d822d284dededbc779dcd170bbd8f6bcceb7a85452e081e29b60a13601bb9af0cd6dd5f10497c9c232bfb2659724f1efdeb8cfa01f0903e9396e9673c456286cf159682577bccd5cdbd793941ad3afd3059142572c0ae1c469fcc7a5eeba020378aa9bc24cec6821eb72c447657fd40d1e79895597707ef9986c34752ad8947a2668e34037ed8fd1f9743296d6ba6efa28ca8777c357ac083b9239d6ff12a33bf8c19231bcebcb03f6a4a0e33dd82032db3e9de5600c36decceb0495b3a8e2e6c1069e17cca0a704858b6e6156b8ca5371f70bb084cddbfc8ab374c1e725504db1ca123735f780841a5d95149567d7fbdf4edc4352ed9dfcd55e72f01588ebaadbbc231366831969779fdad26c1c6f52624358c654ca14d92e419dd62cc26fdea659f9b1526d74591b277e9687f4c6fa02d75b111b970aefb72016805fe6748b5ca3df71186aa7039c8537748bd690ca772da683fc171c4063da68e294be253c5424b626f7c7d27a25cc7c274332e16c126c75a64bc363b98c0c76c2d7d7019633578623a13fcee82d639e452037ddd6fbae8f836d67a3f169bf6776c16c5a2f887e3666c05372ed369547253ac5d8635099e465c0ae79a36868ffa057c57ac7740f25a66800459cf5becb0726328eb581a0f243d8977c1665db9233bb8a095b1fefb7520a9616b11575134505ea761b32cbe2e7fa29ea858678d9a45a2cb6b01a4aea11e038a08ad7f6666008e21cb0a19cfb231d60e54113f577a42f7bcf901e4550d0d48e6a6d7e4914a3bacbf1d200a43f97d3d3446174d53316ffe6047bb4caac55d30247f7b811a5432463bee4d24865642954cb9617714d773586e53e110b0f500fabf512ec275ff577687a277bd806b7b4876af669bd82a1bb4f42c1092c9bc0930ee46e4d885040b4b10eaf0725fb5282631d578a0a3642d15928432b7103b3fbd54b930c5785c3c8f5be57411c55613ab5436c39e35a9738a18ce4500d2533a2c545338e719126173eef8047626c024e997dd0c47ffde79ac45bbde46a13d6150dfb6428de1d46e43d451b03ca4fc4e270ca4970ab80c2acd33735ea1cce52f4f68aba922fc4d073d91b1e4ae714a06b69348c5025aa908141e8aa5918a330eba81ffa550a57123a553a587f8d8833e838658f17ce0d30bbfa2bc4187f2994ea15dd5d28e5b495c046c1fafb5210f145d36ddf4cdbe6d26aef464f362b2ab4cba56e59b02b1b022d0b4f6e80082c0626d571cafea5b7f1d11517f7d40c24048e9930aa1c38bee537a443b7e4aa9d82acbfe79f46a039d152bfc54abcfd29d0c8c52ff9387e1611f69c835a52000d26686abb7c1c3ca4c13cedf8839c8bc7b59a82e0a9ca96bb21664a5a3ccc6bcc9292bed327a895fd03dfb143b57a6d7a925458efef2f635bd0da232db9692e62574574e9c4911091d48a2335d6bcfa490746271a6e2cf774503c8d3a5213cc08213f71ee693acde2f63c410a0ddc25f112302bbc4ad9035870489fbea6f362e06418f4b74fdfae40b7cbebc591fe7dd3969c28222f8852fa33e97e21da8c99f996a0a5f4e77eb142919f9061ec65d46537df480134ab71e796640225157631bc309671356f98c67215bf721b492e01e312d4e024384d7c63f515aa2a457ea00382343142e709c4d0973a148ad699519795e82e4f1d42a1c48405e3eb591fb593f177efb78eac191fe60fcfb65816d92c749b2d037f6ec878565d202acddeebe994c3140d3189b80ec120147e38345f4da47876ac9dac0ad3a3605a296ce63ceff40e8dc8570d4b576239e14c14ecc7a9748985b7577f84cc064e8ff940f8935b92b29dc7e86e4da3531e07cba3b9865c35864a083f5b51dd95089f1d76834d62a2cceec77a9f81d2c726e5967846d7a344dc3ed732ab8aee146b6cffcf302cdfc4aa8e66dacee1a5f454bfb87ec3672260de14622488c3ea825b13492c3a8ffc443421f6be6b0995476918fb85ac0d9cb6ed7212396afeb9f0bc1dc9ebc4b6f2b182b23d92af82c4d630d18aa16cc20d00db6299bf50a7c2e1b17483d96f7866e1366d4b4a635eb2d59316ea6cd13baf91bc2e1b9640ea5a613ac7903fb1f8d7137ee0c822a7c22373f3481aafcad1e1452d8bc70f43b968f15c9ca6a657cde1c249a93fa1375fb6711ca21fec66dd38535a7db70716b3c20075fb4a55764835f562f1ae7acd6f5d80bbaca88c27ffec56f2ad79a54fc6a68494306262178dc9972a0b54a05f0e4e04ee11f3cb8fb541723ee35b2553eb0c30868111123e4057c6887ac62212c4296088f870fae8eeeb150a8770640e86f5c3cd97ac5bf2aa64f7035e1c40b4cb5f814ad8a7e38b66e6c4ddb5be1cc6171ce0cca81453bc11837295a5b88fee5e8275e6f1aed73ee94f348e7129a86881bd13ded48293205cb2a3b3e576ded0994cd3c7cc0c383a1bd05368dfd54ae7eb0a13e77b5ef62410aa75bf0b1349626053e52455d09c7574d9b2fbe0c5bf7888442726908fbad9588d74b9900a033e31c0f7486b9f6b20d2db4297a72c8a26c3db703b8ef286677ef5f281f4cd56258f633387a3f10c5ae38036843dbd8f7ae86475b4a9debd34575ec74e6e06b3fa8ad2f7c3f90282c2cf1540ff391a852c857d767057a18bb0a60f304ac6453715bbcef0f0b55b91e5d1a2e5749dcc6d61e3e3c7109034422c6ea872163db266fba399536a1995d1e10f5c5164dc1722e9a1de514a1c4675878cc490a22257ec7be62ed7d92fcc7a31e740502ce09224e316da555a4620b5890a645433b0a738e0cd8ad2ac70cd5364163cc5b31cc87ae95745756b99a83ad7236ed40dc85354cbaed91203f17d2b27c6e680ce5df733f1280e373ae76a1c01faec71f7d6b653c431f5420e62708cee2f6e63a1561aeb972510e2a5c8e4b37dd716233ebc2524022d84332813cfa57056f986494793b927298ba2ba2c4662e957402753c2a465bb7d9a23c1e7c383557b62434da4f35a9530a5952f8d81c19c18d380ac090e425d7c3524529018b099f7a2c591764f81a565436302f0bac70094402544bbc091865b6f4635d852dab699c0d7dacc32f25865361153aeb0a34e91dc41afe37bde27113f432595b78dc82e19a6d02d13bb9eb2231075bf35150c0284c7ab7b753cd21d5f4673203811e34c26857af63cce81ef5d12169c5877ec1a4727ea9f325ca8ecd4c2c222b78175eec2d1e5ba9a15d5b645c54778bc919a38dd6298aff89be6361377caff9c5f27cb9c27c6997dde7fceadc0c507a411a9666cf6bacb173a19d9144068edb529d61952742c94c813a6bbe2675dc960edda3511215c8309e2d2d631a28ad28a5de67c0554553fee3e2e70ad66a281782cc60dd56201198996dccaa8f6532588c4319470e1cc037cf5dca0a022df9f7fbe91eb23730d184cdcf26e779028f491440961a831e09668b98adb4eb1b66389a3c5a867b1b90bc7194793ef5584e2d307e0a3d69218b230c7ac12f221d684ecba07d49a208cef9d0538b17983571324a7f836d115d5d4338826c09226066ab0437f56a296730c6b4fcf142525dbb42098ee5a39a2b9fd6023e7dda8a291c31eedf12614024a44e51b6ddf2b15f6a6a39d5006c8508472fd7cb6c67e50aae221f40ab8db51c7dd1cdcc0baff76d8862a7e814602950ade599e28974b73c97b99affed0ef409dfa9a6d161460268c796ab31f131e14e0830136fd9675907e56f9c3bb509a4796d9e086bb958ef0d18fd56dfdf17d266d74c061e2264e247fe51140d55384d420fce3cadd78a6b5f202087d7bd38e7319c36636902865709bbc1680b6cfd62504a98edad537f3d61b7663d43ebb9053b951c55746449bb6b26456998f276cc1c7c27deaad96b7b1cf801b29c49141d02bc2d764fa7eeec01dc82d398e9d6542e325ac6c4db5b622a5fc7849c68e0de3a636b551fed1cc4723bdccd5698e33322ac8369ef4d59266136b351908c769542610dfa542b741b4ee2c7770172f36e410458b613b632774492b6ea39ca33e54d7210f48ae8dff63898e42feb2fd82c41baf06a1ad257072e96b6e5e25e5418521ed58c7d1707d525627eaa9a6262734675570c456100df1b09c6f432f914d913fe81090564a9594d1a45b854ac6ccc33429f6d0747d3f01df571735013a22b4da49698e36c78ab1e50a5d5e4b7749162fac0f05aa7d2cc2e8dd80429e2569e78e69550e92c173836f44e56eda9d4d56afd29a9ac4d2e592dca6a569374813b5abbb201dedc58c91207d99aa684217b46039a260c004bc548c3dc4b6892335572ee03cd082d087155f4bca67494b2a814e69d90d95a2f5a6f1446e500f39e7f3ad1f3467eac8ce60b0c7bffbcf139dd767ba07d0b5c84e71d5e3df5e622716154c394ba7806d83f594a7b3220d062824cdba479acde8b2155db63dcea81cc2e7d23ab07a2819a905220293e1eae38b30444573d3915f1cc388e9a625d03aa2816564f01dba5203476cc33734ab2fc595d50285ad5700a9714793f15e637334e345154c85f37d75f2322c604496517eb6fbefaf124afac5a61e71654e4351aae67e53e9c07c5b89526788207c8f01e866f2b85a4322473e45bf9667721837aed07189d2da3b4f2347771e754d25a6d8e37711bf044401e73715b41002b30b6aa016c0050ad0e1d451c46e33dc2e1eeff66f5af919e6b324736119ffef6f260a8453e52675a1de12852d7d48a235b365248be98df1fb8b692614986beae1b3b0f1a763e131a331ca551cb8b1fd0e2624b376cc1732d33ee0066b8c2c38a650c4609ee184988d7d4ba6c85dff41fffa84869630e80d2bd544178c1522c0a20d049282ed71d35e63c9f69f9f94cec1ddf9a1087a6d9a9738bb3425bc24a2901c58d4a96ccf1288b13822691e8273cf8aaa41d48e36e38560d6346769f6f567837954086965651ee718565d6ffe6749b88b6501e2ce21e5754f35cd1c862d57c266058ad193d70fe0af346972bf1a90b271e0257c0394c5477e924764cde482ba51d03a0c0397eb4baae28e0d64a7dba629707199b814312ebfb250362e54be93c723d48f449cc609cb764edefd3d43e9921271b199e39d99fe974bd5e8117a0f9115c640c34c519cba67ce41d56231727e769bf41d03061c79b56f52b7740e231fb19012f6f31645b0e50722154bb48c65d1cba15a7a1d71e052ba78aba4442e75f15e890dd18484afa1aafdf5d7ce4a860448993faf7d99df01cd6bc76255e35f275c13fa3d9a3756404f03d0d083f77b800d78a32291da91049a1c0428bd3d5bc1ad1d2bba40587a102f8fe079b90e8dd5efc8ab02cfd37a86bb013859b480f271a82f2d911325d065dd4cacee05e8a4647e4e4875e86e81766295054190c3c4a172912e562f134d3596ff1a7cd9638f33aa532479b77366b67dc733b82b2206a67814948b45a1ba917471e106bbfb63061bd708c260b515f0d5982c19b90a9f44e883f4d4cef3fe03edc5f535826ffa86ea59dc54194435c2eea3a5bd7590e870eeda10c01fc82ae7d904d026aa4b834582c30f6f2e3b3ba43e41e62b5e308e4141a9dba37f3569421f048b24640f18a310703ac2917942a391837e222e00765799711aef901039b2a642afc64fe8cfd0d6bce5020a344037b8c7eafd5c748fe09af2bde529f8333099fd68d42918f38733ad4b712b645d5530e336c8354c5631bd40cecd595b05211015abe7ad1460c1cb6229bf291eb520b023160d3efb65e643ba86f84a362de15d937eea378a47e38274fcd312a70894060f8d4634f7f2248b822b47ab590bf18004f3436250a7b5c4cd705c17c70715433b024ab8d7bc65916a65b9b58f8ee69714bce865a3f9955838850d87b1c3b48b15fad66b56aa67b7725de815020fb44c56e31c73ef7af0c17cf2e15cb9ed5311d5cb2475aabe1250db50280e2e5596374f4edf3148cf646b0a07d8499bc4715fa0f63f46db4ea1a8d0bba89f52f29042a91a1d7b1e21d5553f997b92e5c8b5193137a2d7e9a0a27df07802046803c7f898651d4a1e038232cb9a0741c31eb307f681b09a9578270887af8aa61fc0f2c351642b5ad60f34edb575a373b7e44100d4e5f5063bad71ff63db2d817713d29c8cc3e06ef36831f8b321cff4e455408ca174850a3a06f7ac1dd408f51e5c94c383b17cd6730c90574d48185dd90f833a7b33453fabfba69778d3425444cbb78d2dec8dd4c140d0b5fad79abfb90fb7a8530e31b0b5fb66db406b78784e26b0a9ae5d13baeee250c844ae35b96036a71a08d06728ec83649f99bed4f15d2e36d68771fc36134e16a0cd79f564312044f9b452711e9de982f5077bcedff2908562e51f31ee3a7102c908e9848d620fa19989eeb5bf9f55775210f8d15880b9435e1f584940523330b35fa815b464f58307da3849d156350245896c00ccada4b63de32d6335b71e0746cdf90f477b2bb7069be932b90324a44b957c2919cd9be0fba1bc787d973741183f909f4f4459b5b24b05bf4b8e02d54e992edb233721145625fc5a315cb680bb57e5076c3c1c774bb676cec7eca5665491c9f4686c1de090a4f919480f74559474f3e3a90b691555b616e9adefdc367085fec316aaf9277a4a6948bcfcd0b3b2112a42e8c1cd400520b13dbacbcd408ee0673dff4ec1167bdc6de364b1c25735632bbf1a2f2f313751420a06449355f85636236a5d4b80d240b71c53e9db536e59f31de78c5aa04eda09420348ffd0605c24e174611322aecc915ad63b95212cb5686047a14d84048a2b6fac067276bf29536ff133283082ea435be24a79859f2a7ea8b1601810f16f12f5ca4c7967b5d5643327dad00682c82292a21e6e35ff5a31397ae4d7e0ce9b9eafa9d1f520ac44ee38514352844a7825e93d857ee2f0dcf6601b4ffcd10d73649c4c305ca0cd1e09a2cfda1b53f86310fd31115cb6d3545123147afa93a802c5221149b7e5e49ae9c470ee5d2507c59781af15ede13fe4806f7e703ab20c89f522fb06cd415b3b18b6379845f4f73c2b6ed368e49204f3f24cb94867644fd84ef51c8fefe172e8e683fd37a997916487bdab2411557178c81106e5f552b3b4660fd74b117713f314058d9f6b32ca25e1535c2f4506655869a6d1fd8cb732e66ee797362295f8b83f2d1fddbcb13d01675ecca6b9a42ab6d7be4762793582f405ca575ba8609650e06e64b38e11b5bdb8f44da9abd41427235e4eec5d93f029fec56d5f46659ab077fb4ed3a474837014b3b8ce9ac0c795ddc6f1b380e6d6a87fd2847469c3060215c4379eea942a9ccdfa9212de251e1ff3b780237c9286653afeb192fa6334ff044e3d6f43265c22518404e3ff84cba6d789c79ff8b1a174e80d06599ee46695499695892cb1f50febe7037ba2a7ce07b2eeec74492796197a88194e7a8508b4be6289dba8f549340609fb36b7849253d0084e2ab686318f00a23b53fbb68cf479dae4e68a5226f651bf74f394050be05b9bf719e0b5e83b6044a90c496223c771d30fa319c37a5439fbd80d6130854b327876db0f42a7a1eaf26d99467601084c4884c4f833f4a56a50c7399257878ff767e6840eb705d9f0fd34b404516a81b55be0ff2e33313de4e9ba8bf8e27efc81fe4d600a45cf93f74f753c262189822f5672858a11d4c2f46276b89d61c248f76ca6a454309033412d7402f085af086e6be41676c6212c5d99ce0e15612b5db038086a0a0523b420f06e1419a5f6a127eca9e6d12099b76d03f10983a43d00fd5b1e6b0ca167bb4434fd1bf320a5edbdc3d2510a245607c2ecc8e4e11451a66036bad620e37bc22f58f516c327aa30ac1e2c65fce7c319412d0c295967d1c86f69e01288723366054fa9dee3424cefd0b68740b796e9b03de2987271952b97372ca7694783593e5ac660ad3de429f11fd3b75d1f728009bfc01b6a1635d35fb82621fcded5c83bbf91793aa3465dd9babe68e67b91d2e9afe9ed1a2a311c09dc41012991a424cb4fa403694546f9dd3dd001bf86163b4a08fbacc8c2d1f18e858f6e52352427e96652592861867b970fe023b5c0a39c39e3a4dd72bf128e319284e3c5d89787f65814da1790a2e79d7ffa372d41c740d6e467ca15fe552a53d07acae66a317f97682d5dabc974a6cf33951d46b650d024ba3555bfae5207f2ea864715d7f2084e86217a90db051d6fce795983727105dea569c3db24401916256ac1433d836735ad6bdce7cb60b9a527f5f125087480697c05cb41c5d37d49b79b948fbc25d23b108f30de5df2014099b68c5d2864d70fc7b4d48cc7742db80b254aeb4776165239543c7943448b9a1ad50474f62022bee7f3c6fe2bb449c4afe7724cf0d377f02fb5dc2bc7a24c93306ea79c78a73e350d740cac50e47e0d9df1292ac6d169375d14453043f6f745b05a3e9a5be64d5725a74a74e0244efbdc2646473481c391082106631381870b94bd9354ecf7a68bc18faf91d41458d73ccef385c2c175cde9627dc52025bc6befb12fcd7f03d73c233de73bce91c32c3632502d8ae331b9dcaec1a09a945bf74c0b81954424a838f62fa8f0a8b18384d0ae71122a612f03808a0f2fbdd7c6b791efffc31037a06aea37376b4a40f12b12467149056633252371fb35ea87e932099f7d675eb06b66f12403ae6765b4f757d55a5b74114bdbc0cef23c7165524d510938c4be43fe1758a4101beac57e61a51831889d24a1aee1ce6dbee3969da65ea5f046b27026fc18bcfd300ed7b6963d43e19996d66fc3a52849734e530b0f4689cd34c52790cb10d26eb5de219005f8288e504af732cafa3c14254663a25a580389775b1494ab1cd9773b88560583883f6b76e165545f4c982f013bb484bd24a90de1ab176ae383f343718001a34036909d06f836dbcd6f4a2ac2e59350a7a1dbafce9c03d79f25c1052b5732bf5aeb7f37cc51824b122b34bf0acdc7f21f6c14eca45e84abed47d3c336c3f0563c8aefd7666b83093426a1f9d0c2e3317dd314977c2f639980236a848dcf044e4aee928fddf0878aff2ba88dac8ac36fd4fd9a9c409715f2e8b998bd0f0186fcd50fcb30aa9cf36 _Values: - {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -10812,6 +10815,77 @@ MonoBehaviour: - {fileID: 6108546402767822149, guid: 936c6eaae41114513a3b35c89084692f, type: 3} - {fileID: 6487201069751892291, guid: 936c6eaae41114513a3b35c89084692f, type: 3} - {fileID: 7372195850322016627, guid: 936c6eaae41114513a3b35c89084692f, type: 3} + - {fileID: 37219227} + - {fileID: 1977136769} + - {fileID: 1376222272} + - {fileID: 1376222273} + - {fileID: 1376222276} + - {fileID: 1376222274} + - {fileID: 37219228} + - {fileID: 37219229} + - {fileID: 916536460} + - {fileID: 916536461} + - {fileID: 916536464} + - {fileID: 916536463} + - {fileID: 37219226} + - {fileID: 916536462} + - {fileID: 1376222275} + - {fileID: 1977136770} + - {fileID: 1977136768} + - {fileID: 1386689730} + - {fileID: 1660674735} + - {fileID: 1660674734} + - {fileID: 1660674733} + - {fileID: 1660674731} + - {fileID: 1834821446} + - {fileID: 1834821450} + - {fileID: 1834821449} + - {fileID: 1386689731} + - {fileID: 192379642} + - {fileID: 192379644} + - {fileID: 192379643} + - {fileID: 1834821447} + - {fileID: 1834821448} + - {fileID: 192379641} + - {fileID: 1386689732} + - {fileID: 1660674732} + - {fileID: 37219226} + - {fileID: 37219227} + - {fileID: 1977136769} + - {fileID: 916536464} + - {fileID: 916536463} + - {fileID: 1376222275} + - {fileID: 37219229} + - {fileID: 1376222272} + - {fileID: 1376222273} + - {fileID: 916536460} + - {fileID: 916536461} + - {fileID: 916536462} + - {fileID: 37219228} + - {fileID: 1376222276} + - {fileID: 1376222274} + - {fileID: 1977136768} + - {fileID: 1977136770} + - {fileID: 1660674731} + - {fileID: 1660674735} + - {fileID: 1660674734} + - {fileID: 1834821446} + - {fileID: 1834821450} + - {fileID: 1834821449} + - {fileID: 192379642} + - {fileID: 192379644} + - {fileID: 1834821447} + - {fileID: 1660674733} + - {fileID: 192379641} + - {fileID: 192379643} + - {fileID: 1386689731} + - {fileID: 1834821448} + - {fileID: 1386689730} + - {fileID: 1386689732} + - {fileID: 1660674732} + - {fileID: 2800000, guid: b0f85f7da5042c0448a526d5ecacbfa9, type: 3} + - {fileID: 2800000, guid: f66c4aa44c09b6a42a2b5b9f9334d824, type: 3} + - {fileID: 2800000, guid: 93f09189124b21e479fc891dbc1b93bf, type: 3} --- !u!4 &1926461710 Transform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Console/EditorConsole.cs b/Assets/Scripts/Console/EditorConsole.cs index 889743d7..de12c451 100644 --- a/Assets/Scripts/Console/EditorConsole.cs +++ b/Assets/Scripts/Console/EditorConsole.cs @@ -47,6 +47,13 @@ namespace Ichni.Editor }catch(Exception e){Debug.LogWarning("WTF Command! "+e);} } private void Update(){ + + UIscale(); + if(InputCommand.isFocused)InputDect(); + + + } + private void UIscale(){ if(Keyboard.current.backquoteKey.wasPressedThisFrame){ ConsoleUI.SetActive(isHide); @@ -65,8 +72,10 @@ namespace Ichni.Editor } } - if(InputCommand.isFocused){ - if(Keyboard.current.downArrowKey.wasPressedThisFrame){ + } + + private void InputDect(){ + if(Keyboard.current.downArrowKey.wasPressedThisFrame){ if(historyCommand.Count-1>historycount){ historycount++; InputCommand.text=historyCommand[historycount];} @@ -80,12 +89,8 @@ namespace Ichni.Editor historycount--; InputCommand.text=historyCommand[historycount]; } - } - - } - private void Start() { diff --git a/Assets/Scripts/DynamicUI/Hierarchy/HierarchyTab.cs b/Assets/Scripts/DynamicUI/Hierarchy/HierarchyTab.cs index 6e7d785a..af8108a9 100644 --- a/Assets/Scripts/DynamicUI/Hierarchy/HierarchyTab.cs +++ b/Assets/Scripts/DynamicUI/Hierarchy/HierarchyTab.cs @@ -50,7 +50,7 @@ namespace Ichni.Editor parentElement.connectedTab.childTabList.Add(this); this.tabLayer = this.parentTab.tabLayer + 1; this.transform.SetSiblingIndex(this.parentTab.transform.GetSiblingIndex() + GetAllChildrenCount(this.parentTab)); - + if (!this.parentTab.isExpanded) { this.isExpanded = false; @@ -91,6 +91,7 @@ namespace Ichni.Editor { EditorManager.instance.operationManager.SelectElement(connectedGameElement); EditorManager.instance.uiManager.inspector.SetInspector(connectedGameElement); + EditorManager.instance.timeline.SetTimeLine(connectedGameElement); } private void ExpandOrFold() @@ -101,7 +102,7 @@ namespace Ichni.Editor if (isExpanded) { expandButton.transform.Rotate(new Vector3(0, 0, 180)); - + for (var index = 0; index < connectedGameElement.childElementList.Count; index++) { var childElement = connectedGameElement.childElementList[index]; @@ -123,9 +124,9 @@ namespace Ichni.Editor { if (!expand && isExpanded) { - for(int i=childTabList.Count;i>0;i--) + for (int i = childTabList.Count; i > 0; i--) { - childTabList[i-1].SetExpansion(expand); //false + childTabList[i - 1].SetExpansion(expand); //false } } diff --git a/Assets/Scripts/DynamicUI/Inspector/CompositeParameterWindow.cs b/Assets/Scripts/DynamicUI/Inspector/CompositeParameterWindow.cs index 00e4f499..879de38f 100644 --- a/Assets/Scripts/DynamicUI/Inspector/CompositeParameterWindow.cs +++ b/Assets/Scripts/DynamicUI/Inspector/CompositeParameterWindow.cs @@ -18,15 +18,14 @@ namespace Ichni.Editor public void Initialize(IBaseElement baseElement, string title, string parameterName) { + transform.localScale = Vector3.zero; this.connectedBaseElement = baseElement; this.parameterName = parameterName; this.title.text = title; unitList = new List(); - closeButton.onClick.AddListener(() => - { - ApplyParameters(); - Destroy(gameObject); - }); + closeButton.onClick.AddListener(Quit); + + StartCoroutine(WindowAnim.ShowPanel(gameObject)); } public void RemoveUnit(DynamicUICompositeUnit unit) @@ -47,9 +46,9 @@ namespace Ichni.Editor unitList.Add(unit); unit.SetUnit(this, content); } - + unitPrefab = EditorManager.instance.basePrefabs.stringUnit; - + //初始化:获取当前的List,并生成对应的Unit List list = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as List; foreach (string item in list) @@ -57,14 +56,14 @@ namespace Ichni.Editor GenerateUnit(item); } addNewUnitButton.GetComponent().SetAsLastSibling(); - + //为添加新的Unit的按钮设置点击事件 addNewUnitButton.onClick.AddListener(() => { GenerateUnit(""); addNewUnitButton.GetComponent().SetAsLastSibling(); }); - + //将当前所有Unit的值应用到对应的变量中 ApplyParameters = () => { @@ -86,22 +85,22 @@ namespace Ichni.Editor unitList.Add(unit); unit.SetUnit(this, content); } - + unitPrefab = EditorManager.instance.basePrefabs.animatedFloatUnit; - + FlexibleFloat flexibleFloat = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as FlexibleFloat; foreach (AnimatedFloat animatedFloat in flexibleFloat.animations) { GenerateUnit(animatedFloat); } addNewUnitButton.GetComponent().SetAsLastSibling(); - + addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new AnimatedFloat(0, 0, 0, 0, AnimationCurveType.Linear)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); - + ApplyParameters = () => { FlexibleFloat newFlexibleFloat = new FlexibleFloat(); @@ -121,22 +120,22 @@ namespace Ichni.Editor unitList.Add(unit); unit.SetUnit(this, content); } - + unitPrefab = EditorManager.instance.basePrefabs.animatedIntUnit; - + FlexibleInt flexibleInt = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as FlexibleInt; foreach (AnimatedInt animatedInt in flexibleInt.animations) { GenerateUnit(animatedInt); } addNewUnitButton.GetComponent().SetAsLastSibling(); - + addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new AnimatedInt(0, 0)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); - + ApplyParameters = () => { FlexibleInt newFlexibleInt = new FlexibleInt(); @@ -156,7 +155,7 @@ namespace Ichni.Editor unitList.Add(unit); unit.SetUnit(this, content); } - + unitPrefab = EditorManager.instance.basePrefabs.animatedBoolUnit; FlexibleBool flexibleBool = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as FlexibleBool; foreach (AnimatedBool animatedBool in flexibleBool.animations) @@ -164,13 +163,13 @@ namespace Ichni.Editor GenerateUnit(animatedBool); } addNewUnitButton.GetComponent().SetAsLastSibling(); - + addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new AnimatedBool(0, false)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); - + ApplyParameters = () => { FlexibleBool newFlexibleBool = new FlexibleBool(); @@ -181,5 +180,12 @@ namespace Ichni.Editor connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, newFlexibleBool); }; } + public void Quit() + { + ApplyParameters(); + //StartCoroutine(WindowAnim.HidePanel(gameObject, true)); + Destroy(gameObject); + + } } } \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/Inspector/InspectorSecondaryWindow.cs b/Assets/Scripts/DynamicUI/Inspector/InspectorSecondaryWindow.cs index e29235dc..5f775142 100644 --- a/Assets/Scripts/DynamicUI/Inspector/InspectorSecondaryWindow.cs +++ b/Assets/Scripts/DynamicUI/Inspector/InspectorSecondaryWindow.cs @@ -10,20 +10,25 @@ namespace Ichni.Editor public GameElement connectedGameElement; public RectTransform WindowRect { get; set; } public List Containers { get; set; } - + public void Initialize(GameElement gameElement, string title) { + StartCoroutine(WindowAnim.ShowPanel(gameObject)); WindowRect = windowRect; Containers = new List(); - + connectedGameElement = gameElement; this.title.text = title; - closeButton.onClick.AddListener(() => - { - Destroy(gameObject); - }); + closeButton.onClick.AddListener(Quit); + + } + public void Quit() + { + Destroy(gameObject); + //StartCoroutine(WindowAnim.HidePanel(gameObject, true)); + } } - - + + } \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs b/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs index ca5cd766..690aebdc 100644 --- a/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs +++ b/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs @@ -12,15 +12,15 @@ namespace Ichni.Editor { private Timeline timeline => EditorManager.instance.uiManager.timeline; private SongInformation songInformation => EditorManager.instance.songInformation; - + public GameObject timePointerPrefab; public List timePointerList; - + public RectTransform timePointerArea; public RectTransform visibleTimePointerArea; - + public RectTransform mainTimePointer; - + public float intervalUnit; public float timePointerInterval; public float sizeNegative, sizePositive; @@ -29,7 +29,7 @@ namespace Ichni.Editor /// delay时间区间中,(-delay, 0)的距离偏移量 /// public float delayDistanceOffset; - + public float leftSideSongTime, rightSideSongTime, songTimeDistance; private void Start() @@ -62,20 +62,20 @@ namespace Ichni.Editor /// /// public void Initialize(float delay, float bpm) - { + { timePointerInterval = 30; ClearPointers(); - + int beatDivider = 1; - + intervalUnit = (60f / bpm) / beatDivider * 1000; - + sizeNegative = delay * beatDivider / timeline.timePerBeat; sizePositive = songInformation.song.length * beatDivider / timeline.timePerBeat; - + negativePointerAmount = Mathf.CeilToInt(sizeNegative); positivePointerAmount = Mathf.CeilToInt(sizePositive); - + totalPointerAmount = negativePointerAmount + positivePointerAmount; timePointerArea.sizeDelta = new Vector2(timePointerInterval * (sizeNegative + sizePositive), 60f); @@ -90,12 +90,12 @@ namespace Ichni.Editor { CreatePointer(beatDivider, i); } - + //ChangeSongTimeDistance(0); SetRange(timeline.beatmapStartTime); } } - + public partial class TimePointerModule { /// @@ -115,7 +115,7 @@ namespace Ichni.Editor leftSideSongTime = startTime - songTimeDistance * proportion; rightSideSongTime = startTime + songTimeDistance * (1 - proportion); } - + /// /// 生成指示线 /// @@ -132,13 +132,16 @@ namespace Ichni.Editor pointer.time = index * intervalUnit / 1000f; pointer.intervalUnitText.text = Mathf.RoundToInt(index * intervalUnit).ToString(); - + if (beatDivider > 1) + { + + } } - + /// /// 更新指示线位置 /// - private void UpdatePointers() + public void UpdatePointers() { delayDistanceOffset = timePointerInterval * (negativePointerAmount - sizeNegative); timePointerArea.sizeDelta = new Vector2(timePointerInterval * totalPointerAmount, 55f); @@ -149,7 +152,7 @@ namespace Ichni.Editor new Vector2((pointer.index + negativePointerAmount) * timePointerInterval + 15f - delayDistanceOffset, 0); } } - + /// /// 清楚所有指示线 /// @@ -161,7 +164,7 @@ namespace Ichni.Editor } timePointerList.Clear(); } - + /// /// 缩放时间线的展示时间宽度 /// diff --git a/Assets/Scripts/DynamicUI/Timeline/Timeline.cs b/Assets/Scripts/DynamicUI/Timeline/Timeline.cs index 3292a6df..40a35ce2 100644 --- a/Assets/Scripts/DynamicUI/Timeline/Timeline.cs +++ b/Assets/Scripts/DynamicUI/Timeline/Timeline.cs @@ -1,18 +1,119 @@ +using System; using System.Collections; using System.Collections.Generic; +using System.Linq; +using Ichni.RhythmGame; +using Sirenix.Utilities; +using TMPro; +using Unity.VisualScripting; using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.UI; namespace Ichni.Editor { - public class Timeline : MonoBehaviour + public partial class Timeline : MonoBehaviour { public float songTime => EditorManager.instance.songInformation.songTime; public float songBeat => EditorManager.instance.songInformation.songBeat; public float beatmapStartTime => -EditorManager.instance.songInformation.delay; public float timePerBeat => 60f / EditorManager.instance.songInformation.bpm; - + + + + public GameObject timelineTabRect; public TimePointerModule timePointerModule; public MusicPlayer musicPlayer; + + + public TMP_InputField TimeField; + public TMP_InputField BeatField; + + public RectTransform GetinputArea; + public void Update() + { + if (musicPlayer.isPlaying) UpdateTime(); + if (RectTransformUtility.RectangleContainsScreenPoint(GetinputArea, Mouse.current.position.ReadValue())) + { + + DetectSetRange(); + } + + + + } + private void DetectSetRange() + { + if (Mouse.current.scroll.ReadValue().y != 0) + { + + if (Keyboard.current.leftCtrlKey.isPressed || Keyboard.current.rightCtrlKey.isPressed) + { + float scrollValue = Mouse.current.scroll.ReadValue().y / 12; + if (timePointerModule.timePointerInterval + scrollValue >= 30) + { + timePointerModule.timePointerInterval += scrollValue; + timePointerModule.UpdatePointers(); + timePointerModule.SetRange(songTime); + } + + } + else + { + if (Mouse.current.scroll.ReadValue().y >= 0) + { + SetTime((EditorManager.instance.songInformation.songTime + timePerBeat).ToString()); + } + else + { + if (EditorManager.instance.songInformation.songTime - timePerBeat >= 0) + SetTime((EditorManager.instance.songInformation.songTime - timePerBeat).ToString()); + else + SetTime("0"); + + } + UpdateTime(); + } + } + } + private void UpdateTime() + { + TimeField.text = songTime.ToString("F2"); + BeatField.text = songBeat.ToString("F2"); + } + + public void SetTime(string time) + { + musicPlayer.PauseMusic(); + musicPlayer.audioSource.time = float.Parse(time); + EditorManager.instance.songInformation.songTime = float.Parse(time); + + timePointerModule.UpdatePointers(); + timePointerModule.SetRange(songTime); + + } + public void SetBeat(string beat) + { + musicPlayer.PauseMusic(); + musicPlayer.audioSource.time = float.Parse(beat) * timePerBeat; + EditorManager.instance.songInformation.songTime = float.Parse(beat) * timePerBeat; + + timePointerModule.UpdatePointers(); + timePointerModule.SetRange(songTime); + } + + + } + + + public partial class Timeline + { + public TimelineTab timelineTabPrefab; + public Dictionary timelineTabList = new Dictionary(); + public void SetTimeLine(GameElement element) + { + //在做了 + + } } - } \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs b/Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs new file mode 100644 index 00000000..8388067a --- /dev/null +++ b/Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Ichni.RhythmGame; +using TMPro; +using UnityEngine; + +public class TimelineTab : MonoBehaviour +{ + public TMP_Text Title; + public GameElement connectedGameElement; + public List GelementPointer; + public void SetTab(GameElement element, Type DisplayType) + { + connectedGameElement = element; + Title.text = DisplayType.ToString(); + foreach (var i in element.childElementList) if (i.GetType() == DisplayType) GelementPointer.Add(i); + } + public void AddElement(GameElement gameElement) + { + + } +} diff --git a/Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs.meta b/Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs.meta new file mode 100644 index 00000000..7b5b34b0 --- /dev/null +++ b/Assets/Scripts/DynamicUI/Timeline/TimelineTab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2508d5efc83bb294aa25a45eb1d2f59d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/DynamicUI/WindowAnim.cs b/Assets/Scripts/DynamicUI/WindowAnim.cs new file mode 100644 index 00000000..8201262d --- /dev/null +++ b/Assets/Scripts/DynamicUI/WindowAnim.cs @@ -0,0 +1,45 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public static class WindowAnim +{ + public static IEnumerator ShowPanel(GameObject gameObject) + { + AnimationCurve animationCurve = new AnimationCurve( + new Keyframe(0, 0), + new Keyframe(0.25f, 0.55f), + new Keyframe(0.5f, 0.85f), + new Keyframe(0.75f, 0.97f), + new Keyframe(1, 1) + ); + float timer = 0; + while (timer <= 1) + { + gameObject.transform.localScale = Vector3.one * animationCurve.Evaluate(timer); + timer += Time.deltaTime * 5f; + yield return null; + } + gameObject.transform.localScale = Vector3.one; + } + public static IEnumerator HidePanel(GameObject gameObject, bool DestoryOrNot = false) + { + AnimationCurve animationCurve = new AnimationCurve( + new Keyframe(0, 0), + new Keyframe(0.25f, 0.55f), + new Keyframe(0.5f, 0.85f), + new Keyframe(0.75f, 0.97f), + new Keyframe(1, 1) + ); + float timer = 1; + while (timer >= 0) + { + gameObject.transform.localScale = Vector3.one * animationCurve.Evaluate(timer); + timer += Time.deltaTime * 5f; + yield return null; + } + gameObject.transform.localScale = Vector3.zero; + + } + +} diff --git a/Assets/Scripts/DynamicUI/WindowAnim.cs.meta b/Assets/Scripts/DynamicUI/WindowAnim.cs.meta new file mode 100644 index 00000000..8c79b26f --- /dev/null +++ b/Assets/Scripts/DynamicUI/WindowAnim.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e4e9f7cedbb8ef246b2a3920b1ce4402 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Manager/EditorManager.cs b/Assets/Scripts/Manager/EditorManager.cs index 128489e0..b3a35438 100644 --- a/Assets/Scripts/Manager/EditorManager.cs +++ b/Assets/Scripts/Manager/EditorManager.cs @@ -20,7 +20,7 @@ namespace Ichni public OperationManager operationManager; public BackgroundController backgroundController; public CameraManager cameraManager; - + public Timeline timeline; public ProjectInformation projectInformation; public SongInformation songInformation; public BeatmapContainer beatmapContainer;