diff --git a/Assets/Quiz/Animations/DownCount.meta b/Assets/Quiz/Animations/DownCount.meta new file mode 100644 index 0000000..c2a58b2 --- /dev/null +++ b/Assets/Quiz/Animations/DownCount.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e26b29d023a83104bad3a43b232d941b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Animations/DownCount/Clock.controller b/Assets/Quiz/Animations/DownCount/Clock.controller new file mode 100644 index 0000000..51712fd --- /dev/null +++ b/Assets/Quiz/Animations/DownCount/Clock.controller @@ -0,0 +1,171 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-8934255257250182465 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: StartCountdown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 2483005746106864429} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-8112651299121446679 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1308585228758632073} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-7650337592695408333 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -1308585228758632073} + m_Position: {x: 260, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 2483005746106864429} + m_Position: {x: 550, y: 120, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: + - {fileID: -7475803862312237024} + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -1308585228758632073} +--- !u!1109 &-7475803862312237024 +AnimatorTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1308585228758632073} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 1 +--- !u!1102 &-1308585228758632073 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -8934255257250182465} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 1cde83f30b5343547b8ce43c9a70aca0, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Clock + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: StartCountdown + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -7650337592695408333} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1102 &2483005746106864429 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: CountingDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -8112651299121446679} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: fbac9cb5948dec04484ce2ebfa85955a, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Assets/Quiz/Animations/DownCount/Clock.controller.meta b/Assets/Quiz/Animations/DownCount/Clock.controller.meta new file mode 100644 index 0000000..33010e9 --- /dev/null +++ b/Assets/Quiz/Animations/DownCount/Clock.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f771b5b5b4575104180bfd588828c309 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Animations/DownCount/CountingDown.anim b/Assets/Quiz/Animations/DownCount/CountingDown.anim new file mode 100644 index 0000000..3ab3702 --- /dev/null +++ b/Assets/Quiz/Animations/DownCount/CountingDown.anim @@ -0,0 +1,213 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: CountingDown + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: -180, z: 90} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 30 + value: {x: -180, y: -180, z: 90} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: ClockHand + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 1027255185 + attribute: 4 + script: {fileID: 0} + typeID: 4 + customType: 4 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 30 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 30 + value: -180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.x + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 30 + value: -180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.y + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 90 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 30 + value: 90 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.z + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 16 + m_EulerEditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 0 + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Quiz/Animations/DownCount/CountingDown.anim.meta b/Assets/Quiz/Animations/DownCount/CountingDown.anim.meta new file mode 100644 index 0000000..788ab6e --- /dev/null +++ b/Assets/Quiz/Animations/DownCount/CountingDown.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fbac9cb5948dec04484ce2ebfa85955a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Animations/DownCount/Idle.anim b/Assets/Quiz/Animations/DownCount/Idle.anim new file mode 100644 index 0000000..7bb0e22 --- /dev/null +++ b/Assets/Quiz/Animations/DownCount/Idle.anim @@ -0,0 +1,177 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: -180, z: 90} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: ClockHand + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 1027255185 + attribute: 4 + script: {fileID: 0} + typeID: 4 + customType: 4 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.x + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.y + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 90 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.z + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 16 + m_EulerEditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: ClockHand + classID: 4 + script: {fileID: 0} + flags: 0 + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Quiz/Animations/DownCount/Idle.anim.meta b/Assets/Quiz/Animations/DownCount/Idle.anim.meta new file mode 100644 index 0000000..55dea70 --- /dev/null +++ b/Assets/Quiz/Animations/DownCount/Idle.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1cde83f30b5343547b8ce43c9a70aca0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/SFX/DownCount.meta b/Assets/Quiz/Audio/SFX/DownCount.meta new file mode 100644 index 0000000..9b9d945 --- /dev/null +++ b/Assets/Quiz/Audio/SFX/DownCount.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c05057fa56a21de40b12f09500cd48fe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/SFX/DownCount/CountdownTimer.mp3 b/Assets/Quiz/Audio/SFX/DownCount/CountdownTimer.mp3 new file mode 100644 index 0000000..9ee2d7a Binary files /dev/null and b/Assets/Quiz/Audio/SFX/DownCount/CountdownTimer.mp3 differ diff --git a/Assets/Quiz/Audio/SFX/DownCount/CountdownTimer.mp3.meta b/Assets/Quiz/Audio/SFX/DownCount/CountdownTimer.mp3.meta new file mode 100644 index 0000000..913216a --- /dev/null +++ b/Assets/Quiz/Audio/SFX/DownCount/CountdownTimer.mp3.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 135849770b7f9b54093c9691d5ef5ee8 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/Card.mat b/Assets/Quiz/Materials/DownCount/Card.mat new file mode 100644 index 0000000..7f300f6 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/Card.mat @@ -0,0 +1,3787 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Card + m_Shader: {fileID: 4800000, guid: 931c86be62d1b634eb508d9474035ca2, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - VIGNETTE_MASKED + - _LIGHTINGMODE_FLAT + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + AllLockedGUIDS: f61de072c139b1046b4331e609b5ec8d + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT VIGNETTE_MASKED _LIGHTINGMODE_FLAT _RIM2STYLE_POIYOMI + _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: Opaque + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 3ab03b267d4f34e4c810937fc0638a69, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 1 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 1 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 0 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.5 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 0 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.1 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 0.5 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0 + - _DissolveToTextureUV: 0 + - _DissolveType: 1 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 0 + - _DstBlendAlpha: 10 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 0 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 5 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 0 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 0 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 0 + - _OutlineDstBlendAlpha: 0 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 1 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 0 + - m_mainCategory: 1 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 0 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 0 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 0 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 0 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 0 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 0 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 0 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 0 + - s_start_EdgeMenu: 0 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 0 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveEndPoint: {r: 0, g: 1, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/DownCount/Card.mat.meta b/Assets/Quiz/Materials/DownCount/Card.mat.meta new file mode 100644 index 0000000..c610f30 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/Card.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f61de072c139b1046b4331e609b5ec8d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/CardStack.mat b/Assets/Quiz/Materials/DownCount/CardStack.mat new file mode 100644 index 0000000..9491161 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/CardStack.mat @@ -0,0 +1,3809 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: CardStack + m_Shader: {fileID: 4800000, guid: 01db5f458e40d624f9b53760e88db9d6, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - DISTORT + - VIGNETTE_MASKED + - _LIGHTINGMODE_REALISTIC + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + AllLockedGUIDS: 02ce03781605f3f4f85c80bfdacfbe00 + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT DISTORT VIGNETTE_MASKED _LIGHTINGMODE_REALISTIC + _RIM2STYLE_POIYOMI _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: Opaque + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__EmissionMask1: 2bfa17182ebd06b4f998edfb4cf30955 + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DissolveDetailNoise: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DissolveEdgeGradient: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DissolveMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DissolveNoiseTexture: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DissolveToTexture: + m_Texture: {fileID: 2800000, guid: 2bfa17182ebd06b4f998edfb4cf30955, type: 3} + m_Scale: {x: 1, y: 50} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 3ab03b267d4f34e4c810937fc0638a69, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 1 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 1 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 0 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.5 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 1 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.019 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 1 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0.29 + - _DissolveToTextureUV: 0 + - _DissolveType: 2 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 0 + - _DstBlendAlpha: 10 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0.1 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 1 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 6 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 0 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 0 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 0 + - _OutlineDstBlendAlpha: 0 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 1 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 1 + - m_mainCategory: 1 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 1 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 1 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 0 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 0 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 0 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 1 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 1 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 1 + - s_start_EdgeMenu: 1 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 1 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 0.09019608, g: 0.1137255, b: 0.40784317, a: 1} + - _DissolveEndPoint: {r: 0, g: 0.48, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/DownCount/CardStack.mat.meta b/Assets/Quiz/Materials/DownCount/CardStack.mat.meta new file mode 100644 index 0000000..b5b6687 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/CardStack.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02ce03781605f3f4f85c80bfdacfbe00 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/LetterStand.mat b/Assets/Quiz/Materials/DownCount/LetterStand.mat new file mode 100644 index 0000000..0043f90 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/LetterStand.mat @@ -0,0 +1,3801 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LetterStand + m_Shader: {fileID: 4800000, guid: 8fc88ee9dbb1d67448a21f62e99db855, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - MOCHIE_PBR + - PROP_LIGHTINGAOMAPS + - VIGNETTE_MASKED + - _LIGHTINGMODE_REALISTIC + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + AllLockedGUIDS: 90e2c2c675ad56247b8ce0101848274e + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT MOCHIE_PBR PROP_LIGHTINGAOMAPS VIGNETTE_MASKED + _LIGHTINGMODE_REALISTIC _RIM2STYLE_POIYOMI _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: Opaque + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _AnisotropyMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 3caec58ac203052438785a1c15a7495c, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 2800000, guid: ee3a6180c5a761c4caa8fc65c01d4cdb, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 79c4122583962874480739c96b272069, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MochieMetallicMaps: + m_Texture: {fileID: 2800000, guid: 40e7604b6d18cf449bc6a34016a9b404, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MochieReflCube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 1 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 1 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 0 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.5 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 0 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.1 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 0.5 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0 + - _DissolveToTextureUV: 0 + - _DissolveType: 1 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 0 + - _DstBlendAlpha: 10 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 0 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 6 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 1 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 0 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 0 + - _OutlineDstBlendAlpha: 0 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 1 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 1 + - m_mainCategory: 0 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 0 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 0 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 0 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 1 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 1 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 0 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 0 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 0 + - s_start_EdgeMenu: 0 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 0 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveEndPoint: {r: 0, g: 1, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/DownCount/LetterStand.mat.meta b/Assets/Quiz/Materials/DownCount/LetterStand.mat.meta new file mode 100644 index 0000000..f333d12 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/LetterStand.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 90e2c2c675ad56247b8ce0101848274e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card.meta new file mode 100644 index 0000000..d3e9c8b --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e8d61956244920044a6dcec67e9acebd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card/Poiyomi Pro World.shader b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card/Poiyomi Pro World.shader new file mode 100644 index 0000000..1cc5e7c --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card/Poiyomi Pro World.shader @@ -0,0 +1,11791 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/f61de072c139b1046b4331e609b5ec8d" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + [ToggleUI]_ForceFlatRampedLightmap ("Force Ramped Lightmap--{condition_showS:(_LightingMode==5)}", Range(0, 1)) = 1 + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_FLAT + #define _STOCHASTICMODE_DELIOT_HEITZ + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + #ifdef _LIGHTINGMODE_FLAT + float _ForceFlatRampedLightmap; + #endif + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_FLAT + poiLight.finalLighting = poiLight.directColor * attenuation * shadowAttenuation; + if (1.0) + { + poiLight.rampedLightMap = smoothstep(0.4, 0.6, poiLight.nDotLNormalized); + } + else + { + poiLight.rampedLightMap = 1; + } + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (0.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_FLAT + #define _STOCHASTICMODE_DELIOT_HEITZ + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + #ifdef _LIGHTINGMODE_FLAT + float _ForceFlatRampedLightmap; + #endif + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_FLAT + poiLight.finalLighting = poiLight.directColor * attenuation * shadowAttenuation; + if (1.0) + { + poiLight.rampedLightMap = smoothstep(0.4, 0.6, poiLight.nDotLNormalized); + } + else + { + poiLight.rampedLightMap = 1; + } + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (0.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_FLAT + #define _STOCHASTICMODE_DELIOT_HEITZ + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_FLAT + #define _STOCHASTICMODE_DELIOT_HEITZ + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..21b45d4 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Card/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 931c86be62d1b634eb508d9474035ca2 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack.meta new file mode 100644 index 0000000..c3a5f70 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ee1dfcb35b545494a8ed32f610410d67 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack/Poiyomi Pro World.shader b/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack/Poiyomi Pro World.shader new file mode 100644 index 0000000..575fd69 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack/Poiyomi Pro World.shader @@ -0,0 +1,13700 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/02ce03781605f3f4f85c80bfdacfbe00" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_start_dissolve ("Dissolve--{reference_property:_EnableDissolve,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/special-fx/dissolve},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(DISTORT)]_EnableDissolve ("Enable Dissolve", Float) = 0 + [Enum(Basic, 1, Point2Point, 2, Spherical, 3, CenterOut, 4)] _DissolveType ("Dissolve Type", Int) = 1 + [HideInInspector] s_start_EdgeMenu ("Edge--{persistent_expand:true,default_expand:true}", Float) = 0 + _DissolveEdgeWidth ("Edge Width--{condition_show:_DissolveType!=2}", Range(0, .5)) = 0.025 + _DissolveEdgeHardness ("Edge Hardness", Range(0, 1)) = 0.5 + _DissolveEdgeColor ("Edge Color--{reference_property:_DissolveEdgeColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _DissolveEdgeColorThemeIndex ("", Int) = 0 + [sRGBWarning][Gradient]_DissolveEdgeGradient ("Edge Gradient", 2D) = "white" { } + _DissolveEdgeEmission ("Edge Emission", Range(0, 20)) = 0 + [HideInInspector] s_end_EdgeMenu ("", Float) = 0 + [HideInInspector] s_start_DissolvedMenu ("Dissolved--{persistent_expand:true,default_expand:true}", Float) = 0 + _DissolveTextureColor ("Dissolved Color--{reference_property:_DissolveTextureColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _DissolveTextureColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_DissolveToTexture ("Dissolved Texture--{reference_properties:[_DissolveToTexturePan, _DissolveToTextureUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_DissolveToTexturePan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _DissolveToTextureUV ("UV", Int) = 0 + _DissolveToEmissionStrength ("Dissolved Emission Strength", Range(0, 20)) = 0 + [HideInInspector] s_end_DissolvedMenu ("", Float) = 0 + [HideInInspector] s_start_TransitionMenu ("Transition--{persistent_expand:true,default_expand:true}", Float) = 0 + [sRGBWarning]_DissolveNoiseTexture ("Dissolve Gradient--{condition_show:_DissolveType==1,reference_properties:[_DissolveNoiseTexturePan, _DissolveNoiseTextureUV, _DissolveInvertNoise]}", 2D) = "white" { } + [HideInInspector][Vector2]_DissolveNoiseTexturePan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _DissolveNoiseTextureUV ("UV", Int) = 0 + [HideInInspector][ToggleUI]_DissolveInvertNoise ("Invert", Float) = 0 + [sRGBWarning]_DissolveDetailNoise ("Dissolve Noise--{reference_properties:[_DissolveDetailNoisePan, _DissolveDetailNoiseUV, _DissolveInvertDetailNoise]}", 2D) = "black" { } + [HideInInspector][Vector2]_DissolveDetailNoisePan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _DissolveDetailNoiseUV ("UV", Int) = 0 + [HideInInspector][ToggleUI]_DissolveInvertDetailNoise ("Invert", Float) = 0 + _DissolveDetailEdgeSmoothing ("Detail Noise Smoothing", Range(0, 1)) = 0 + _DissolveDetailStrength ("Dissolve Detail Strength", Range(0, 1)) = 0.1 + _DissolveAlpha ("Dissolve Alpha", Range(0, 1)) = 0 + _ContinuousDissolve ("Continuous Dissolve Speed", Float) = 0 + [HideInInspector] s_end_TransitionMenu ("", Float) = 0 + [HideInInspector] s_start_MaskingMenu ("Masking--{persistent_expand:true,default_expand:true}", Float) = 0 + [sRGBWarning]_DissolveMask ("Dissolve Mask--{reference_properties:[_DissolveMaskPan, _DissolveMaskUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_DissolveMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _DissolveMaskUV ("UV", Int) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _DissolveMaskGlobalMask ("Global Mask--{reference_property:_DissolveMaskGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)]_DissolveMaskGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _DissolveApplyGlobalMaskIndex ("Dissolved to Global Mask--{reference_property:_DissolveApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _DissolveApplyGlobalMaskBlendType ("Blending", Int) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _DissolveInverseApplyGlobalMaskIndex ("Undissolved to Global Mask--{reference_property:_DissolveInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _DissolveInverseApplyGlobalMaskBlendType ("Blending", Int) = 0 + [Enum(Off, 0, Red, 1, Green, 2, Blue, 3, Alpha, 4)]_DissolveUseVertexColors ("VertexColor Mask", Int) = 0 + [HideInInspector][ToggleUI]_DissolveMaskInvert ("Invert", Float) = 0 + [HideInInspector] s_end_MaskingMenu ("", Float) = 0 + [HideInInspector] s_start_DissolveAudioLink ("Audio Link--{ reference_property:_EnableDissolveAudioLink,persistent_expand:true,default_expand:false, condition_showS:(_EnableAudioLink==1)}", Float) = 0 + [HideInInspector][ToggleUI] _EnableDissolveAudioLink ("Dissolve AudioLink Enabled", Float) = 0 + [Enum(Bass, 0, Low Mid, 1, High Mid, 2, Treble, 3, Volume, 4)] _AudioLinkDissolveAlphaBand ("Dissolve Alpha Band", Int) = 0 + [VectorLabel(Min, Max)]_AudioLinkDissolveAlpha ("Dissolve Alpha Mod", Vector) = (0, 0, 0, 0) + [Space(7)] + [Enum(Bass, 0, Low Mid, 1, High Mid, 2, Treble, 3, Volume, 4)] _AudioLinkDissolveDetailBand ("Dissolve Detail Band", Int) = 0 + [VectorLabel(Min, Max)]_AudioLinkDissolveDetail ("Dissolve Detail Mod", Vector) = (0, 0, 0, 0) + [HideInInspector] s_end_DissolveAudioLink ("Audio Link", Float) = 0 + [HideInInspector] m_start_SphericalDissolve ("Spherical--{condition_showS:(_DissolveType==3)}", Float) = 0 + [Vector3] _SphericalDissolveCenter ("Center Point", Vector) = (0, 0, 0) + _SphericalDissolveRadius ("Radius", Float) = 1.5 + [ToggleUI] _SphericalDissolveInvert ("Invert", Float) = 0 + [ToggleUI] _SphericalDissolveClamp ("Clamp Dissolve", Float) = 0 + [HideInInspector] m_end_SphericalDissolve ("Spherical", Float) = 0 + [HideInInspector] m_start_pointToPoint ("Point to Point--{condition_showS:(_DissolveType==2)}", Float) = 0 + [Enum(Local, 0, World, 1, Vertex Colors, 2)] _DissolveP2PWorldLocal ("World/Local", Int) = 0 + _DissolveP2PEdgeLength ("Edge Length", Float) = 0.1 + [Vector3]_DissolveStartPoint ("Start Point", Vector) = (0, -1, 0, 0) + [Vector3]_DissolveEndPoint ("End Point", Vector) = (0, 1, 0, 0) + [ToggleUI]_DissolveP2PClamp ("Clamp Dissolve", Float) = 0 + [HideInInspector] m_end_pointToPoint ("Point To Point", Float) = 0 + [HideInInspector] m_start_CenterOutDissolve ("CenterOut--{condition_showS:(_DissolveType==4)}", Float) = 0 + [Enum(View Direction, 1, Custom Direction, 2, Light Direction, 3)] _CenterOutDissolveMode ("CenterOut Mode", Int) = 1 + [Vector3] _CenterOutDissolveDirection ("Custom Direction--{condition_showS:(_CenterOutDissolveMode==2)}", Vector) = (0, 0, 1, 0) + [ToggleUI] _CenterOutDissolveInvert ("Invert", Float) = 0 + _CenterOutDissolveNormals ("Use Pixel Normals", Range(0, 1)) = 0 + _CenterOutDissolvePower ("Power", Range(.1, 5)) = 1 + [HideInInspector] m_end_CenterOutDissolve ("CenterOut", Float) = 0 + [HideInInspector] m_start_dissolveHueShift ("Hue Shift--{reference_property:_DissolveHueShiftEnabled}", Float) = 0 + [HideInInspector][ToggleUI]_DissolveHueShiftEnabled ("Dissolved Enabled", Float) = 0 + [ThryWideEnum(OKLab, 0, HSV, 1)] _DissolveHueShiftColorSpace ("Color Space", Int) = 0 + [ThryWideEnum(Hue Select, 0, Hue Shift, 1)] _DissolveHueSelectOrShift ("Select or Shift", Int) = 1 + _DissolveHueShiftSpeed ("Dissolved Speed", Float) = 0 + _DissolveHueShift ("Dissolved Shift", Range(0, 1)) = 0 + [ToggleUI]_DissolveEdgeHueShiftEnabled ("Edge Enabled", Float) = 0 + [ThryWideEnum(OKLab, 0, HSV, 1)] _DissolveEdgeHueShiftColorSpace ("Color Space", Int) = 0 + [ThryWideEnum(Hue Select, 0, Hue Shift, 1)] _DissolveEdgeHueSelectOrShift ("Select or Shift", Int) = 1 + _DissolveEdgeHueShiftSpeed ("Edge Speed", Float) = 0 + _DissolveEdgeHueShift ("Edge Shift", Range(0, 1)) = 0 + [HideInInspector] m_end_dissolveHueShift ("Hue Shift", Float) = 0 + [HideInInspector] m_start_UVTileDissolve ("UV Tile Dissolve--{reference_property:_UVTileDissolveEnabled}", Float) = 0 + [HideInInspector][ToggleUI]_UVTileDissolveEnabled ("Enabled", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3)]_UVTileDissolveUV ("UV Tile UV", Int) = 0 + [ToggleUI]_UVTileDissolveDiscardAtMax ("Discard Tiles at Max", Float) = 1 + [HideInInspector] s_start_UVTileDissolveRow3 ("Row 3 Alpha", Float) = 0 + _UVTileDissolveAlpha_Row3_0 ("Row 3 Column 0", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row3_1 ("Row 3 Column 1", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row3_2 ("Row 3 Column 2", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row3_3 ("Row 3 Column 3", Range(-1, 1)) = 0 + [HideInInspector] s_end_UVTileDissolveRow3 ("Row 3", Float) = 0 + [HideInInspector] s_start_UVTileDissolveRow2 ("Row 2 Alpha", Float) = 0 + _UVTileDissolveAlpha_Row2_0 ("Row 2 Column 0", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row2_1 ("Row 2 Column 1", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row2_2 ("Row 2 Column 2", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row2_3 ("Row 2 Column 3", Range(-1, 1)) = 0 + [HideInInspector] s_end_UVTileDissolveRow2 ("Row 2", Float) = 0 + [HideInInspector] s_start_UVTileDissolveRow1 ("Row 1 Alpha", Float) = 0 + _UVTileDissolveAlpha_Row1_0 ("Row 1 Column 0", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row1_1 ("Row 1 Column 1", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row1_2 ("Row 1 Column 2", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row1_3 ("Row 1 Column 3", Range(-1, 1)) = 0 + [HideInInspector] s_end_UVTileDissolveRow1 ("Row 1", Float) = 0 + [HideInInspector] s_start_UVTileDissolveRow0 ("Row 0 Alpha", Float) = 0 + _UVTileDissolveAlpha_Row0_0 ("Row 0 Column 0", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row0_1 ("Row 0 Column 1", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row0_2 ("Row 0 Column 2", Range(-1, 1)) = 0 + _UVTileDissolveAlpha_Row0_3 ("Row 0 Column 3", Range(-1, 1)) = 0 + [HideInInspector] s_end_UVTileDissolveRow0 ("Row 0", Float) = 0 + [HideInInspector] m_end_UVTileDissolve ("UV Tile Dissolve", Float) = 0 + [HideInInspector] m_start_BonusSliders ("Locked In Anim Sliders", Float) = 0 + _DissolveAlpha0 ("Dissolve Alpha 0", Range(-1, 1)) = 0 + _DissolveAlpha1 ("Dissolve Alpha 1", Range(-1, 1)) = 0 + _DissolveAlpha2 ("Dissolve Alpha 2", Range(-1, 1)) = 0 + _DissolveAlpha3 ("Dissolve Alpha 3", Range(-1, 1)) = 0 + _DissolveAlpha4 ("Dissolve Alpha 4", Range(-1, 1)) = 0 + _DissolveAlpha5 ("Dissolve Alpha 5", Range(-1, 1)) = 0 + _DissolveAlpha6 ("Dissolve Alpha 6", Range(-1, 1)) = 0 + _DissolveAlpha7 ("Dissolve Alpha 7", Range(-1, 1)) = 0 + _DissolveAlpha8 ("Dissolve Alpha 8", Range(-1, 1)) = 0 + _DissolveAlpha9 ("Dissolve Alpha 9", Range(-1, 1)) = 0 + [HideInInspector] m_end_BonusSliders ("Locked In Sliders", Float) = 0 + [HideInInspector] m_end_dissolve ("Dissolve", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define DISTORT + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_DISSOLVETOTEXTURE + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + #ifdef DISTORT + float _DissolveType; + float _DissolveEdgeWidth; + float4 _DissolveEdgeColor; + Texture2D _DissolveEdgeGradient; + float4 _DissolveEdgeGradient_ST; + float2 _DissolveEdgeGradientPan; + float _DissolveEdgeGradientUV; + float _DissolveEdgeEmission; + float4 _DissolveTextureColor; + float _DissolveEdgeColorThemeIndex; + float _DissolveTextureColorThemeIndex; + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveToTexture; + #endif + float4 _DissolveToTexture_ST; + float2 _DissolveToTexturePan; + float _DissolveToTextureUV; + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveNoiseTexture; + #endif + float4 _DissolveNoiseTexture_ST; + float2 _DissolveNoiseTexturePan; + float _DissolveNoiseTextureUV; + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveDetailNoise; + #endif + float4 _DissolveDetailNoise_ST; + float2 _DissolveDetailNoisePan; + float _DissolveDetailNoiseUV; + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveMask; + #endif + float4 _DissolveMask_ST; + float2 _DissolveMaskPan; + float _DissolveMaskUV; + float _DissolveMaskGlobalMask; + float _DissolveMaskGlobalMaskBlendType; + float _DissolveApplyGlobalMaskIndex; + float _DissolveApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskIndex; + float _DissolveMaskInvert; + float _DissolveAlpha; + float _ContinuousDissolve; + float _DissolveDetailStrength; + float _DissolveDetailEdgeSmoothing; + float _DissolveEdgeHardness; + float _DissolveInvertNoise; + float _DissolveInvertDetailNoise; + float _DissolveToEmissionStrength; + float _DissolveP2PWorldLocal; + float _DissolveP2PEdgeLength; + float _DissolveP2PClamp; + float4 _DissolveStartPoint; + float4 _DissolveEndPoint; + float3 _SphericalDissolveCenter; + float _SphericalDissolveRadius; + float _SphericalDissolveInvert; + float _SphericalDissolveClamp; + float _CenterOutDissolveMode; + float3 _CenterOutDissolveDirection; + float _CenterOutDissolveInvert; + float _CenterOutDissolveNormals; + float _CenterOutDissolvePower; + float _DissolveWorldShape; + float4 _DissolveShapePosition; + float4 _DissolveShapeRotation; + float _DissolveShapeScale; + float _DissolveInvertShape; + float _DissolveShapeEdgeLength; + float _UVTileDissolveEnabled; + float _UVTileDissolveDiscardAtMax; + float _UVTileDissolveUV; + float _UVTileDissolveAlpha_Row3_0; + float _UVTileDissolveAlpha_Row3_1; + float _UVTileDissolveAlpha_Row3_2; + float _UVTileDissolveAlpha_Row3_3; + float _UVTileDissolveAlpha_Row2_0; + float _UVTileDissolveAlpha_Row2_1; + float _UVTileDissolveAlpha_Row2_2; + float _UVTileDissolveAlpha_Row2_3; + float _UVTileDissolveAlpha_Row1_0; + float _UVTileDissolveAlpha_Row1_1; + float _UVTileDissolveAlpha_Row1_2; + float _UVTileDissolveAlpha_Row1_3; + float _UVTileDissolveAlpha_Row0_0; + float _UVTileDissolveAlpha_Row0_1; + float _UVTileDissolveAlpha_Row0_2; + float _UVTileDissolveAlpha_Row0_3; + float _DissolveAlpha0; + float _DissolveAlpha1; + float _DissolveAlpha2; + float _DissolveAlpha3; + float _DissolveAlpha4; + float _DissolveAlpha5; + float _DissolveAlpha6; + float _DissolveAlpha7; + float _DissolveAlpha8; + float _DissolveAlpha9; + float _DissolveEmissionSide; + float _DissolveEmission1Side; + float _DissolveUseVertexColors; + float4 edgeColor; + float edgeAlpha; + float dissolveAlpha; + float4 dissolveToTexture; + float _DissolveHueShiftColorSpace; + float _DissolveHueSelectOrShift; + float _DissolveHueShiftEnabled; + float _DissolveHueShiftSpeed; + float _DissolveHueShift; + float _DissolveEdgeHueShiftColorSpace; + float _DissolveEdgeHueSelectOrShift; + float _DissolveEdgeHueShiftEnabled; + float _DissolveEdgeHueShiftSpeed; + float _DissolveEdgeHueShift; + float _EnableDissolveAudioLink; + #ifdef POI_AUDIOLINK + half _AudioLinkDissolveAlphaBand; + float2 _AudioLinkDissolveAlpha; + half _AudioLinkDissolveDetailBand; + float2 _AudioLinkDissolveDetail; + #endif + #endif + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + #ifdef DISTORT + + if (0.0 && 1.0) + { + float2 dissolveUdim = 0; + dissolveUdim += (v.uv0.xy * (0.0 == 0)); + dissolveUdim += (v.uv1.xy * (0.0 == 1)); + dissolveUdim += (v.uv2.xy * (0.0 == 2)); + dissolveUdim += (v.uv3.xy * (0.0 == 3)); + float isDiscardedFromDissolve = 0; + float4 xMaskDissolve = float4((dissolveUdim.x >= 0 && dissolveUdim.x < 1), + (dissolveUdim.x >= 1 && dissolveUdim.x < 2), + (dissolveUdim.x >= 2 && dissolveUdim.x < 3), + (dissolveUdim.x >= 3 && dissolveUdim.x < 4)); + isDiscardedFromDissolve += (dissolveUdim.y >= 0 && dissolveUdim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 1 && dissolveUdim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 2 && dissolveUdim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 3 && dissolveUdim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve *= any(float4(dissolveUdim.y >= 0, dissolveUdim.y < 4, dissolveUdim.x >= 0, dissolveUdim.x < 4)); // never discard outside 4x4 grid in pos coords + const float threshold = 0.999; + if (isDiscardedFromDissolve > threshold) // Early Return skips rest of vertex shader + { + return (VertexOut)POI_NAN; + } + } + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #ifdef DISTORT + void applyDissolve(inout PoiFragData poiFragData, in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam, in PoiLight poiLight) + { + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + float dissolveMask = POI2D_SAMPLER_PAN(_DissolveMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveMask = 1; + #endif + + if (0.0 > 0) + { + dissolveMask = ceil(poiMesh.vertexColor[max(0.0 - 1, 0)] * 100000) / 100000; + } + if (0.0 > 0) + { + dissolveMask = maskBlend(dissolveMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + dissolveToTexture = POI2D_SAMPLER_PAN(_DissolveToTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,50,0,0)), float4(0,0,0,0)) * float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #else + dissolveToTexture = float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #endif + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + float dissolveNoiseTexture = POI2D_SAMPLER_PAN(_DissolveNoiseTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveNoiseTexture = 1; + #endif + float da = 0.0 + + 1.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0; + float dds = 0.019; + if (0.0) + { + float2 udim = floor(poiMesh.uv[(int)0.0]); + float4 xMask = float4((udim.x >= 0 && udim.x < 1), + (udim.x >= 1 && udim.x < 2), + (udim.x >= 2 && udim.x < 3), + (udim.x >= 3 && udim.x < 4)); + da += (udim.y >= 0 && udim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 1 && udim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 2 && udim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 3 && udim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + } + #ifdef POI_AUDIOLINK + + if (0.0 && poiMods.audioLinkAvailable) + { + da += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + dds += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + } + #endif + da = saturate(da); + dds = saturate(dds); + if (0.0) + { + dissolveMask = 1 - dissolveMask; + } + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + float dissolveDetailNoise = POI2D_SAMPLER_PAN(_DissolveDetailNoise, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #else + float dissolveDetailNoise = 0; + #endif + if (0.0) + { + dissolveNoiseTexture = 1 - dissolveNoiseTexture; + } + if (0.0) + { + dissolveDetailNoise = 1 - dissolveDetailNoise; + } + if (0.0 != 0) + { + da = sin(_Time.x * 0.0) * .5 + .5; + } + da *= dissolveMask; + dissolveAlpha = da; + edgeAlpha = 0; + [flatten] + switch(2.0) + { + default: // Basic (case 1) + { + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + float noise = saturate(dissolveNoiseTexture - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + case 2: // Point to Point + { + float3 direction; + float3 currentPos; + float distanceTo = 0; + direction = normalize(float4(0,0.48,0,0) - float4(0,-1,0,0)); + currentPos = lerp(float4(0,-1,0,0), float4(0,0.48,0,0), dissolveAlpha); + + if (0.0 != 1) + { + float3 pos = 0.0 == 0 ? poiMesh.localPos.rgb : poiMesh.vertexColor.rgb; + distanceTo = dot(pos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = step(distanceTo, 0); + edgeAlpha *= 1 - dissolveAlpha; + } + else + { + distanceTo = dot(poiMesh.worldPos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = (distanceTo < 0) ? 1 : 0; + edgeAlpha *= 1 - dissolveAlpha; + } + if (0.0) + { + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 3: // Spherical + { + if (0.0) + { + da = remap(da, 1, 0, -0.025, 1); + } + else + { + da = remap(da, 0, 1, -0.025, 1); + } + dissolveAlpha = da; + dds *= smoothstep(0, 0.2 * dds + 0.01, dissolveAlpha) * lerp(1, smoothstep(1, 1 - 0.2 * dds - 0.01, dissolveAlpha), 0.0); + float currentDistance = lerp(0, 1.5, dissolveAlpha); + float fragDistance = distance(float4(0,0,0,1), poiMesh.localPos.xyz); + float normalizedDistance; + normalizedDistance = (fragDistance - currentDistance) / (1.5 + 0.0001) - dissolveDetailNoise * dds; + if (0.0) + { + dissolveAlpha = (normalizedDistance > 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, -normalizedDistance); + } + else + { + dissolveAlpha = (normalizedDistance < 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, normalizedDistance); + } + if (0.0) + { + da = lerp(da, 1 - da, 0.0); + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 4: // CenterOut + { + float ramp = 0.5; + float noise; + [flatten] + switch(1.0) + { + case 1: // View Direction + { + ramp = saturate(lerp(poiLight.vertexNDotV, poiLight.nDotV, 0.0)); + break; + } + case 2: // Custom Direction + { + ramp = dot(normalize(float4(0,0,1,0)), lerp(poiMesh.normals[0], poiMesh.normals[1], 0.0)); + ramp = saturate(ramp * .5 + 0.5); + break; + } + case 3: // Light Direction + { + ramp = lerp(poiLight.vertexNDotL, poiLight.nDotL, 0.0); + ramp = saturate(ramp * .5 + 0.5); + break; + } + } + if (1.0 != 1) + { + ramp = pow(ramp, 1.0); + } + if (!0.0) + { + ramp = 1 - ramp; + } + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + noise = saturate(ramp - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + } + #ifndef POI_SHADOW + + if (0.0) + { + dissolveToTexture.rgb = hueShift(dissolveToTexture.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.alpha = lerp(poiFragData.alpha, dissolveToTexture.a, dissolveAlpha * .999999); + #if !defined(POI_PASS_OUTLINE) && !defined(UNITY_PASS_SHADOWCASTER) + poiFragData.baseColor = lerp(poiFragData.baseColor, dissolveToTexture.rgb, dissolveAlpha * .999999); + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, dissolveAlpha * .999999); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, 1 - (dissolveAlpha * .999999)); + } + + if (0.025 || (2.0 == 2 && 0.1 != 0)) + { + edgeColor = _DissolveEdgeGradient.Sample(sampler_MainTex, poiUV(float2(edgeAlpha, edgeAlpha), float4(1,1,0,0))) * float4(poiThemeColor(poiMods, float4(0.008568122,0.01228648,0.1384316,1).rgb, 0.0), float4(0.008568122,0.01228648,0.1384316,1).a); + #ifndef POI_SHADOW + + if (0.0 && 0.0) + { + edgeColor.rgb = hueShift(edgeColor.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.baseColor = lerp(poiFragData.baseColor, edgeColor.rgb, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + } + poiFragData.emission += lerp(0, dissolveToTexture * 0.29, dissolveAlpha) + lerp(0, edgeColor.rgb * 0.0, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + #endif + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #ifdef DISTORT + applyDissolve(poiFragData, poiMesh, poiMods, poiCam, poiLight); + #endif + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (0.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define DISTORT + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_DISSOLVETOTEXTURE + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + #ifdef DISTORT + float _DissolveType; + float _DissolveEdgeWidth; + float4 _DissolveEdgeColor; + Texture2D _DissolveEdgeGradient; + float4 _DissolveEdgeGradient_ST; + float2 _DissolveEdgeGradientPan; + float _DissolveEdgeGradientUV; + float _DissolveEdgeEmission; + float4 _DissolveTextureColor; + float _DissolveEdgeColorThemeIndex; + float _DissolveTextureColorThemeIndex; + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveToTexture; + #endif + float4 _DissolveToTexture_ST; + float2 _DissolveToTexturePan; + float _DissolveToTextureUV; + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveNoiseTexture; + #endif + float4 _DissolveNoiseTexture_ST; + float2 _DissolveNoiseTexturePan; + float _DissolveNoiseTextureUV; + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveDetailNoise; + #endif + float4 _DissolveDetailNoise_ST; + float2 _DissolveDetailNoisePan; + float _DissolveDetailNoiseUV; + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveMask; + #endif + float4 _DissolveMask_ST; + float2 _DissolveMaskPan; + float _DissolveMaskUV; + float _DissolveMaskGlobalMask; + float _DissolveMaskGlobalMaskBlendType; + float _DissolveApplyGlobalMaskIndex; + float _DissolveApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskIndex; + float _DissolveMaskInvert; + float _DissolveAlpha; + float _ContinuousDissolve; + float _DissolveDetailStrength; + float _DissolveDetailEdgeSmoothing; + float _DissolveEdgeHardness; + float _DissolveInvertNoise; + float _DissolveInvertDetailNoise; + float _DissolveToEmissionStrength; + float _DissolveP2PWorldLocal; + float _DissolveP2PEdgeLength; + float _DissolveP2PClamp; + float4 _DissolveStartPoint; + float4 _DissolveEndPoint; + float3 _SphericalDissolveCenter; + float _SphericalDissolveRadius; + float _SphericalDissolveInvert; + float _SphericalDissolveClamp; + float _CenterOutDissolveMode; + float3 _CenterOutDissolveDirection; + float _CenterOutDissolveInvert; + float _CenterOutDissolveNormals; + float _CenterOutDissolvePower; + float _DissolveWorldShape; + float4 _DissolveShapePosition; + float4 _DissolveShapeRotation; + float _DissolveShapeScale; + float _DissolveInvertShape; + float _DissolveShapeEdgeLength; + float _UVTileDissolveEnabled; + float _UVTileDissolveDiscardAtMax; + float _UVTileDissolveUV; + float _UVTileDissolveAlpha_Row3_0; + float _UVTileDissolveAlpha_Row3_1; + float _UVTileDissolveAlpha_Row3_2; + float _UVTileDissolveAlpha_Row3_3; + float _UVTileDissolveAlpha_Row2_0; + float _UVTileDissolveAlpha_Row2_1; + float _UVTileDissolveAlpha_Row2_2; + float _UVTileDissolveAlpha_Row2_3; + float _UVTileDissolveAlpha_Row1_0; + float _UVTileDissolveAlpha_Row1_1; + float _UVTileDissolveAlpha_Row1_2; + float _UVTileDissolveAlpha_Row1_3; + float _UVTileDissolveAlpha_Row0_0; + float _UVTileDissolveAlpha_Row0_1; + float _UVTileDissolveAlpha_Row0_2; + float _UVTileDissolveAlpha_Row0_3; + float _DissolveAlpha0; + float _DissolveAlpha1; + float _DissolveAlpha2; + float _DissolveAlpha3; + float _DissolveAlpha4; + float _DissolveAlpha5; + float _DissolveAlpha6; + float _DissolveAlpha7; + float _DissolveAlpha8; + float _DissolveAlpha9; + float _DissolveEmissionSide; + float _DissolveEmission1Side; + float _DissolveUseVertexColors; + float4 edgeColor; + float edgeAlpha; + float dissolveAlpha; + float4 dissolveToTexture; + float _DissolveHueShiftColorSpace; + float _DissolveHueSelectOrShift; + float _DissolveHueShiftEnabled; + float _DissolveHueShiftSpeed; + float _DissolveHueShift; + float _DissolveEdgeHueShiftColorSpace; + float _DissolveEdgeHueSelectOrShift; + float _DissolveEdgeHueShiftEnabled; + float _DissolveEdgeHueShiftSpeed; + float _DissolveEdgeHueShift; + float _EnableDissolveAudioLink; + #ifdef POI_AUDIOLINK + half _AudioLinkDissolveAlphaBand; + float2 _AudioLinkDissolveAlpha; + half _AudioLinkDissolveDetailBand; + float2 _AudioLinkDissolveDetail; + #endif + #endif + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + #ifdef DISTORT + + if (0.0 && 1.0) + { + float2 dissolveUdim = 0; + dissolveUdim += (v.uv0.xy * (0.0 == 0)); + dissolveUdim += (v.uv1.xy * (0.0 == 1)); + dissolveUdim += (v.uv2.xy * (0.0 == 2)); + dissolveUdim += (v.uv3.xy * (0.0 == 3)); + float isDiscardedFromDissolve = 0; + float4 xMaskDissolve = float4((dissolveUdim.x >= 0 && dissolveUdim.x < 1), + (dissolveUdim.x >= 1 && dissolveUdim.x < 2), + (dissolveUdim.x >= 2 && dissolveUdim.x < 3), + (dissolveUdim.x >= 3 && dissolveUdim.x < 4)); + isDiscardedFromDissolve += (dissolveUdim.y >= 0 && dissolveUdim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 1 && dissolveUdim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 2 && dissolveUdim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 3 && dissolveUdim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve *= any(float4(dissolveUdim.y >= 0, dissolveUdim.y < 4, dissolveUdim.x >= 0, dissolveUdim.x < 4)); // never discard outside 4x4 grid in pos coords + const float threshold = 0.999; + if (isDiscardedFromDissolve > threshold) // Early Return skips rest of vertex shader + { + return (VertexOut)POI_NAN; + } + } + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #ifdef DISTORT + void applyDissolve(inout PoiFragData poiFragData, in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam, in PoiLight poiLight) + { + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + float dissolveMask = POI2D_SAMPLER_PAN(_DissolveMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveMask = 1; + #endif + + if (0.0 > 0) + { + dissolveMask = ceil(poiMesh.vertexColor[max(0.0 - 1, 0)] * 100000) / 100000; + } + if (0.0 > 0) + { + dissolveMask = maskBlend(dissolveMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + dissolveToTexture = POI2D_SAMPLER_PAN(_DissolveToTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,50,0,0)), float4(0,0,0,0)) * float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #else + dissolveToTexture = float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #endif + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + float dissolveNoiseTexture = POI2D_SAMPLER_PAN(_DissolveNoiseTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveNoiseTexture = 1; + #endif + float da = 0.0 + + 1.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0; + float dds = 0.019; + if (0.0) + { + float2 udim = floor(poiMesh.uv[(int)0.0]); + float4 xMask = float4((udim.x >= 0 && udim.x < 1), + (udim.x >= 1 && udim.x < 2), + (udim.x >= 2 && udim.x < 3), + (udim.x >= 3 && udim.x < 4)); + da += (udim.y >= 0 && udim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 1 && udim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 2 && udim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 3 && udim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + } + #ifdef POI_AUDIOLINK + + if (0.0 && poiMods.audioLinkAvailable) + { + da += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + dds += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + } + #endif + da = saturate(da); + dds = saturate(dds); + if (0.0) + { + dissolveMask = 1 - dissolveMask; + } + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + float dissolveDetailNoise = POI2D_SAMPLER_PAN(_DissolveDetailNoise, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #else + float dissolveDetailNoise = 0; + #endif + if (0.0) + { + dissolveNoiseTexture = 1 - dissolveNoiseTexture; + } + if (0.0) + { + dissolveDetailNoise = 1 - dissolveDetailNoise; + } + if (0.0 != 0) + { + da = sin(_Time.x * 0.0) * .5 + .5; + } + da *= dissolveMask; + dissolveAlpha = da; + edgeAlpha = 0; + [flatten] + switch(2.0) + { + default: // Basic (case 1) + { + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + float noise = saturate(dissolveNoiseTexture - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + case 2: // Point to Point + { + float3 direction; + float3 currentPos; + float distanceTo = 0; + direction = normalize(float4(0,0.48,0,0) - float4(0,-1,0,0)); + currentPos = lerp(float4(0,-1,0,0), float4(0,0.48,0,0), dissolveAlpha); + + if (0.0 != 1) + { + float3 pos = 0.0 == 0 ? poiMesh.localPos.rgb : poiMesh.vertexColor.rgb; + distanceTo = dot(pos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = step(distanceTo, 0); + edgeAlpha *= 1 - dissolveAlpha; + } + else + { + distanceTo = dot(poiMesh.worldPos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = (distanceTo < 0) ? 1 : 0; + edgeAlpha *= 1 - dissolveAlpha; + } + if (0.0) + { + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 3: // Spherical + { + if (0.0) + { + da = remap(da, 1, 0, -0.025, 1); + } + else + { + da = remap(da, 0, 1, -0.025, 1); + } + dissolveAlpha = da; + dds *= smoothstep(0, 0.2 * dds + 0.01, dissolveAlpha) * lerp(1, smoothstep(1, 1 - 0.2 * dds - 0.01, dissolveAlpha), 0.0); + float currentDistance = lerp(0, 1.5, dissolveAlpha); + float fragDistance = distance(float4(0,0,0,1), poiMesh.localPos.xyz); + float normalizedDistance; + normalizedDistance = (fragDistance - currentDistance) / (1.5 + 0.0001) - dissolveDetailNoise * dds; + if (0.0) + { + dissolveAlpha = (normalizedDistance > 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, -normalizedDistance); + } + else + { + dissolveAlpha = (normalizedDistance < 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, normalizedDistance); + } + if (0.0) + { + da = lerp(da, 1 - da, 0.0); + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 4: // CenterOut + { + float ramp = 0.5; + float noise; + [flatten] + switch(1.0) + { + case 1: // View Direction + { + ramp = saturate(lerp(poiLight.vertexNDotV, poiLight.nDotV, 0.0)); + break; + } + case 2: // Custom Direction + { + ramp = dot(normalize(float4(0,0,1,0)), lerp(poiMesh.normals[0], poiMesh.normals[1], 0.0)); + ramp = saturate(ramp * .5 + 0.5); + break; + } + case 3: // Light Direction + { + ramp = lerp(poiLight.vertexNDotL, poiLight.nDotL, 0.0); + ramp = saturate(ramp * .5 + 0.5); + break; + } + } + if (1.0 != 1) + { + ramp = pow(ramp, 1.0); + } + if (!0.0) + { + ramp = 1 - ramp; + } + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + noise = saturate(ramp - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + } + #ifndef POI_SHADOW + + if (0.0) + { + dissolveToTexture.rgb = hueShift(dissolveToTexture.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.alpha = lerp(poiFragData.alpha, dissolveToTexture.a, dissolveAlpha * .999999); + #if !defined(POI_PASS_OUTLINE) && !defined(UNITY_PASS_SHADOWCASTER) + poiFragData.baseColor = lerp(poiFragData.baseColor, dissolveToTexture.rgb, dissolveAlpha * .999999); + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, dissolveAlpha * .999999); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, 1 - (dissolveAlpha * .999999)); + } + + if (0.025 || (2.0 == 2 && 0.1 != 0)) + { + edgeColor = _DissolveEdgeGradient.Sample(sampler_MainTex, poiUV(float2(edgeAlpha, edgeAlpha), float4(1,1,0,0))) * float4(poiThemeColor(poiMods, float4(0.008568122,0.01228648,0.1384316,1).rgb, 0.0), float4(0.008568122,0.01228648,0.1384316,1).a); + #ifndef POI_SHADOW + + if (0.0 && 0.0) + { + edgeColor.rgb = hueShift(edgeColor.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.baseColor = lerp(poiFragData.baseColor, edgeColor.rgb, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + } + poiFragData.emission += lerp(0, dissolveToTexture * 0.29, dissolveAlpha) + lerp(0, edgeColor.rgb * 0.0, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + #endif + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #ifdef DISTORT + applyDissolve(poiFragData, poiMesh, poiMods, poiCam, poiLight); + #endif + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (0.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define DISTORT + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_DISSOLVETOTEXTURE + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + #ifdef DISTORT + float _DissolveType; + float _DissolveEdgeWidth; + float4 _DissolveEdgeColor; + Texture2D _DissolveEdgeGradient; + float4 _DissolveEdgeGradient_ST; + float2 _DissolveEdgeGradientPan; + float _DissolveEdgeGradientUV; + float _DissolveEdgeEmission; + float4 _DissolveTextureColor; + float _DissolveEdgeColorThemeIndex; + float _DissolveTextureColorThemeIndex; + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveToTexture; + #endif + float4 _DissolveToTexture_ST; + float2 _DissolveToTexturePan; + float _DissolveToTextureUV; + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveNoiseTexture; + #endif + float4 _DissolveNoiseTexture_ST; + float2 _DissolveNoiseTexturePan; + float _DissolveNoiseTextureUV; + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveDetailNoise; + #endif + float4 _DissolveDetailNoise_ST; + float2 _DissolveDetailNoisePan; + float _DissolveDetailNoiseUV; + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveMask; + #endif + float4 _DissolveMask_ST; + float2 _DissolveMaskPan; + float _DissolveMaskUV; + float _DissolveMaskGlobalMask; + float _DissolveMaskGlobalMaskBlendType; + float _DissolveApplyGlobalMaskIndex; + float _DissolveApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskIndex; + float _DissolveMaskInvert; + float _DissolveAlpha; + float _ContinuousDissolve; + float _DissolveDetailStrength; + float _DissolveDetailEdgeSmoothing; + float _DissolveEdgeHardness; + float _DissolveInvertNoise; + float _DissolveInvertDetailNoise; + float _DissolveToEmissionStrength; + float _DissolveP2PWorldLocal; + float _DissolveP2PEdgeLength; + float _DissolveP2PClamp; + float4 _DissolveStartPoint; + float4 _DissolveEndPoint; + float3 _SphericalDissolveCenter; + float _SphericalDissolveRadius; + float _SphericalDissolveInvert; + float _SphericalDissolveClamp; + float _CenterOutDissolveMode; + float3 _CenterOutDissolveDirection; + float _CenterOutDissolveInvert; + float _CenterOutDissolveNormals; + float _CenterOutDissolvePower; + float _DissolveWorldShape; + float4 _DissolveShapePosition; + float4 _DissolveShapeRotation; + float _DissolveShapeScale; + float _DissolveInvertShape; + float _DissolveShapeEdgeLength; + float _UVTileDissolveEnabled; + float _UVTileDissolveDiscardAtMax; + float _UVTileDissolveUV; + float _UVTileDissolveAlpha_Row3_0; + float _UVTileDissolveAlpha_Row3_1; + float _UVTileDissolveAlpha_Row3_2; + float _UVTileDissolveAlpha_Row3_3; + float _UVTileDissolveAlpha_Row2_0; + float _UVTileDissolveAlpha_Row2_1; + float _UVTileDissolveAlpha_Row2_2; + float _UVTileDissolveAlpha_Row2_3; + float _UVTileDissolveAlpha_Row1_0; + float _UVTileDissolveAlpha_Row1_1; + float _UVTileDissolveAlpha_Row1_2; + float _UVTileDissolveAlpha_Row1_3; + float _UVTileDissolveAlpha_Row0_0; + float _UVTileDissolveAlpha_Row0_1; + float _UVTileDissolveAlpha_Row0_2; + float _UVTileDissolveAlpha_Row0_3; + float _DissolveAlpha0; + float _DissolveAlpha1; + float _DissolveAlpha2; + float _DissolveAlpha3; + float _DissolveAlpha4; + float _DissolveAlpha5; + float _DissolveAlpha6; + float _DissolveAlpha7; + float _DissolveAlpha8; + float _DissolveAlpha9; + float _DissolveEmissionSide; + float _DissolveEmission1Side; + float _DissolveUseVertexColors; + float4 edgeColor; + float edgeAlpha; + float dissolveAlpha; + float4 dissolveToTexture; + float _DissolveHueShiftColorSpace; + float _DissolveHueSelectOrShift; + float _DissolveHueShiftEnabled; + float _DissolveHueShiftSpeed; + float _DissolveHueShift; + float _DissolveEdgeHueShiftColorSpace; + float _DissolveEdgeHueSelectOrShift; + float _DissolveEdgeHueShiftEnabled; + float _DissolveEdgeHueShiftSpeed; + float _DissolveEdgeHueShift; + float _EnableDissolveAudioLink; + #ifdef POI_AUDIOLINK + half _AudioLinkDissolveAlphaBand; + float2 _AudioLinkDissolveAlpha; + half _AudioLinkDissolveDetailBand; + float2 _AudioLinkDissolveDetail; + #endif + #endif + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + #ifdef DISTORT + + if (0.0 && 1.0) + { + float2 dissolveUdim = 0; + dissolveUdim += (v.uv0.xy * (0.0 == 0)); + dissolveUdim += (v.uv1.xy * (0.0 == 1)); + dissolveUdim += (v.uv2.xy * (0.0 == 2)); + dissolveUdim += (v.uv3.xy * (0.0 == 3)); + float isDiscardedFromDissolve = 0; + float4 xMaskDissolve = float4((dissolveUdim.x >= 0 && dissolveUdim.x < 1), + (dissolveUdim.x >= 1 && dissolveUdim.x < 2), + (dissolveUdim.x >= 2 && dissolveUdim.x < 3), + (dissolveUdim.x >= 3 && dissolveUdim.x < 4)); + isDiscardedFromDissolve += (dissolveUdim.y >= 0 && dissolveUdim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 1 && dissolveUdim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 2 && dissolveUdim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 3 && dissolveUdim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve *= any(float4(dissolveUdim.y >= 0, dissolveUdim.y < 4, dissolveUdim.x >= 0, dissolveUdim.x < 4)); // never discard outside 4x4 grid in pos coords + const float threshold = 0.999; + if (isDiscardedFromDissolve > threshold) // Early Return skips rest of vertex shader + { + return (VertexOut)POI_NAN; + } + } + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef DISTORT + void applyDissolve(inout PoiFragData poiFragData, in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam, in PoiLight poiLight) + { + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + float dissolveMask = POI2D_SAMPLER_PAN(_DissolveMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveMask = 1; + #endif + + if (0.0 > 0) + { + dissolveMask = ceil(poiMesh.vertexColor[max(0.0 - 1, 0)] * 100000) / 100000; + } + if (0.0 > 0) + { + dissolveMask = maskBlend(dissolveMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + dissolveToTexture = POI2D_SAMPLER_PAN(_DissolveToTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,50,0,0)), float4(0,0,0,0)) * float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #else + dissolveToTexture = float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #endif + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + float dissolveNoiseTexture = POI2D_SAMPLER_PAN(_DissolveNoiseTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveNoiseTexture = 1; + #endif + float da = 0.0 + + 1.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0; + float dds = 0.019; + if (0.0) + { + float2 udim = floor(poiMesh.uv[(int)0.0]); + float4 xMask = float4((udim.x >= 0 && udim.x < 1), + (udim.x >= 1 && udim.x < 2), + (udim.x >= 2 && udim.x < 3), + (udim.x >= 3 && udim.x < 4)); + da += (udim.y >= 0 && udim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 1 && udim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 2 && udim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 3 && udim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + } + #ifdef POI_AUDIOLINK + + if (0.0 && poiMods.audioLinkAvailable) + { + da += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + dds += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + } + #endif + da = saturate(da); + dds = saturate(dds); + if (0.0) + { + dissolveMask = 1 - dissolveMask; + } + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + float dissolveDetailNoise = POI2D_SAMPLER_PAN(_DissolveDetailNoise, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #else + float dissolveDetailNoise = 0; + #endif + if (0.0) + { + dissolveNoiseTexture = 1 - dissolveNoiseTexture; + } + if (0.0) + { + dissolveDetailNoise = 1 - dissolveDetailNoise; + } + if (0.0 != 0) + { + da = sin(_Time.x * 0.0) * .5 + .5; + } + da *= dissolveMask; + dissolveAlpha = da; + edgeAlpha = 0; + [flatten] + switch(2.0) + { + default: // Basic (case 1) + { + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + float noise = saturate(dissolveNoiseTexture - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + case 2: // Point to Point + { + float3 direction; + float3 currentPos; + float distanceTo = 0; + direction = normalize(float4(0,0.48,0,0) - float4(0,-1,0,0)); + currentPos = lerp(float4(0,-1,0,0), float4(0,0.48,0,0), dissolveAlpha); + + if (0.0 != 1) + { + float3 pos = 0.0 == 0 ? poiMesh.localPos.rgb : poiMesh.vertexColor.rgb; + distanceTo = dot(pos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = step(distanceTo, 0); + edgeAlpha *= 1 - dissolveAlpha; + } + else + { + distanceTo = dot(poiMesh.worldPos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = (distanceTo < 0) ? 1 : 0; + edgeAlpha *= 1 - dissolveAlpha; + } + if (0.0) + { + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 3: // Spherical + { + if (0.0) + { + da = remap(da, 1, 0, -0.025, 1); + } + else + { + da = remap(da, 0, 1, -0.025, 1); + } + dissolveAlpha = da; + dds *= smoothstep(0, 0.2 * dds + 0.01, dissolveAlpha) * lerp(1, smoothstep(1, 1 - 0.2 * dds - 0.01, dissolveAlpha), 0.0); + float currentDistance = lerp(0, 1.5, dissolveAlpha); + float fragDistance = distance(float4(0,0,0,1), poiMesh.localPos.xyz); + float normalizedDistance; + normalizedDistance = (fragDistance - currentDistance) / (1.5 + 0.0001) - dissolveDetailNoise * dds; + if (0.0) + { + dissolveAlpha = (normalizedDistance > 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, -normalizedDistance); + } + else + { + dissolveAlpha = (normalizedDistance < 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, normalizedDistance); + } + if (0.0) + { + da = lerp(da, 1 - da, 0.0); + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 4: // CenterOut + { + float ramp = 0.5; + float noise; + [flatten] + switch(1.0) + { + case 1: // View Direction + { + ramp = saturate(lerp(poiLight.vertexNDotV, poiLight.nDotV, 0.0)); + break; + } + case 2: // Custom Direction + { + ramp = dot(normalize(float4(0,0,1,0)), lerp(poiMesh.normals[0], poiMesh.normals[1], 0.0)); + ramp = saturate(ramp * .5 + 0.5); + break; + } + case 3: // Light Direction + { + ramp = lerp(poiLight.vertexNDotL, poiLight.nDotL, 0.0); + ramp = saturate(ramp * .5 + 0.5); + break; + } + } + if (1.0 != 1) + { + ramp = pow(ramp, 1.0); + } + if (!0.0) + { + ramp = 1 - ramp; + } + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + noise = saturate(ramp - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + } + #ifndef POI_SHADOW + + if (0.0) + { + dissolveToTexture.rgb = hueShift(dissolveToTexture.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.alpha = lerp(poiFragData.alpha, dissolveToTexture.a, dissolveAlpha * .999999); + #if !defined(POI_PASS_OUTLINE) && !defined(UNITY_PASS_SHADOWCASTER) + poiFragData.baseColor = lerp(poiFragData.baseColor, dissolveToTexture.rgb, dissolveAlpha * .999999); + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, dissolveAlpha * .999999); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, 1 - (dissolveAlpha * .999999)); + } + + if (0.025 || (2.0 == 2 && 0.1 != 0)) + { + edgeColor = _DissolveEdgeGradient.Sample(sampler_MainTex, poiUV(float2(edgeAlpha, edgeAlpha), float4(1,1,0,0))) * float4(poiThemeColor(poiMods, float4(0.008568122,0.01228648,0.1384316,1).rgb, 0.0), float4(0.008568122,0.01228648,0.1384316,1).a); + #ifndef POI_SHADOW + + if (0.0 && 0.0) + { + edgeColor.rgb = hueShift(edgeColor.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.baseColor = lerp(poiFragData.baseColor, edgeColor.rgb, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + } + poiFragData.emission += lerp(0, dissolveToTexture * 0.29, dissolveAlpha) + lerp(0, edgeColor.rgb * 0.0, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + #endif + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #ifdef DISTORT + applyDissolve(poiFragData, poiMesh, poiMods, poiCam, poiLight); + #endif + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define DISTORT + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_DISSOLVETOTEXTURE + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + #ifdef DISTORT + float _DissolveType; + float _DissolveEdgeWidth; + float4 _DissolveEdgeColor; + Texture2D _DissolveEdgeGradient; + float4 _DissolveEdgeGradient_ST; + float2 _DissolveEdgeGradientPan; + float _DissolveEdgeGradientUV; + float _DissolveEdgeEmission; + float4 _DissolveTextureColor; + float _DissolveEdgeColorThemeIndex; + float _DissolveTextureColorThemeIndex; + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveToTexture; + #endif + float4 _DissolveToTexture_ST; + float2 _DissolveToTexturePan; + float _DissolveToTextureUV; + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveNoiseTexture; + #endif + float4 _DissolveNoiseTexture_ST; + float2 _DissolveNoiseTexturePan; + float _DissolveNoiseTextureUV; + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveDetailNoise; + #endif + float4 _DissolveDetailNoise_ST; + float2 _DissolveDetailNoisePan; + float _DissolveDetailNoiseUV; + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _DissolveMask; + #endif + float4 _DissolveMask_ST; + float2 _DissolveMaskPan; + float _DissolveMaskUV; + float _DissolveMaskGlobalMask; + float _DissolveMaskGlobalMaskBlendType; + float _DissolveApplyGlobalMaskIndex; + float _DissolveApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskBlendType; + float _DissolveInverseApplyGlobalMaskIndex; + float _DissolveMaskInvert; + float _DissolveAlpha; + float _ContinuousDissolve; + float _DissolveDetailStrength; + float _DissolveDetailEdgeSmoothing; + float _DissolveEdgeHardness; + float _DissolveInvertNoise; + float _DissolveInvertDetailNoise; + float _DissolveToEmissionStrength; + float _DissolveP2PWorldLocal; + float _DissolveP2PEdgeLength; + float _DissolveP2PClamp; + float4 _DissolveStartPoint; + float4 _DissolveEndPoint; + float3 _SphericalDissolveCenter; + float _SphericalDissolveRadius; + float _SphericalDissolveInvert; + float _SphericalDissolveClamp; + float _CenterOutDissolveMode; + float3 _CenterOutDissolveDirection; + float _CenterOutDissolveInvert; + float _CenterOutDissolveNormals; + float _CenterOutDissolvePower; + float _DissolveWorldShape; + float4 _DissolveShapePosition; + float4 _DissolveShapeRotation; + float _DissolveShapeScale; + float _DissolveInvertShape; + float _DissolveShapeEdgeLength; + float _UVTileDissolveEnabled; + float _UVTileDissolveDiscardAtMax; + float _UVTileDissolveUV; + float _UVTileDissolveAlpha_Row3_0; + float _UVTileDissolveAlpha_Row3_1; + float _UVTileDissolveAlpha_Row3_2; + float _UVTileDissolveAlpha_Row3_3; + float _UVTileDissolveAlpha_Row2_0; + float _UVTileDissolveAlpha_Row2_1; + float _UVTileDissolveAlpha_Row2_2; + float _UVTileDissolveAlpha_Row2_3; + float _UVTileDissolveAlpha_Row1_0; + float _UVTileDissolveAlpha_Row1_1; + float _UVTileDissolveAlpha_Row1_2; + float _UVTileDissolveAlpha_Row1_3; + float _UVTileDissolveAlpha_Row0_0; + float _UVTileDissolveAlpha_Row0_1; + float _UVTileDissolveAlpha_Row0_2; + float _UVTileDissolveAlpha_Row0_3; + float _DissolveAlpha0; + float _DissolveAlpha1; + float _DissolveAlpha2; + float _DissolveAlpha3; + float _DissolveAlpha4; + float _DissolveAlpha5; + float _DissolveAlpha6; + float _DissolveAlpha7; + float _DissolveAlpha8; + float _DissolveAlpha9; + float _DissolveEmissionSide; + float _DissolveEmission1Side; + float _DissolveUseVertexColors; + float4 edgeColor; + float edgeAlpha; + float dissolveAlpha; + float4 dissolveToTexture; + float _DissolveHueShiftColorSpace; + float _DissolveHueSelectOrShift; + float _DissolveHueShiftEnabled; + float _DissolveHueShiftSpeed; + float _DissolveHueShift; + float _DissolveEdgeHueShiftColorSpace; + float _DissolveEdgeHueSelectOrShift; + float _DissolveEdgeHueShiftEnabled; + float _DissolveEdgeHueShiftSpeed; + float _DissolveEdgeHueShift; + float _EnableDissolveAudioLink; + #ifdef POI_AUDIOLINK + half _AudioLinkDissolveAlphaBand; + float2 _AudioLinkDissolveAlpha; + half _AudioLinkDissolveDetailBand; + float2 _AudioLinkDissolveDetail; + #endif + #endif + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + #ifdef DISTORT + + if (0.0 && 1.0) + { + float2 dissolveUdim = 0; + dissolveUdim += (v.uv0.xy * (0.0 == 0)); + dissolveUdim += (v.uv1.xy * (0.0 == 1)); + dissolveUdim += (v.uv2.xy * (0.0 == 2)); + dissolveUdim += (v.uv3.xy * (0.0 == 3)); + float isDiscardedFromDissolve = 0; + float4 xMaskDissolve = float4((dissolveUdim.x >= 0 && dissolveUdim.x < 1), + (dissolveUdim.x >= 1 && dissolveUdim.x < 2), + (dissolveUdim.x >= 2 && dissolveUdim.x < 3), + (dissolveUdim.x >= 3 && dissolveUdim.x < 4)); + isDiscardedFromDissolve += (dissolveUdim.y >= 0 && dissolveUdim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 1 && dissolveUdim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 2 && dissolveUdim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve += (dissolveUdim.y >= 3 && dissolveUdim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMaskDissolve); + isDiscardedFromDissolve *= any(float4(dissolveUdim.y >= 0, dissolveUdim.y < 4, dissolveUdim.x >= 0, dissolveUdim.x < 4)); // never discard outside 4x4 grid in pos coords + const float threshold = 0.999; + if (isDiscardedFromDissolve > threshold) // Early Return skips rest of vertex shader + { + return (VertexOut)POI_NAN; + } + } + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef DISTORT + void applyDissolve(inout PoiFragData poiFragData, in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam, in PoiLight poiLight) + { + #if defined(PROP_DISSOLVEMASK) || !defined(OPTIMIZER_ENABLED) + float dissolveMask = POI2D_SAMPLER_PAN(_DissolveMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveMask = 1; + #endif + + if (0.0 > 0) + { + dissolveMask = ceil(poiMesh.vertexColor[max(0.0 - 1, 0)] * 100000) / 100000; + } + if (0.0 > 0) + { + dissolveMask = maskBlend(dissolveMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_DISSOLVETOTEXTURE) || !defined(OPTIMIZER_ENABLED) + dissolveToTexture = POI2D_SAMPLER_PAN(_DissolveToTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,50,0,0)), float4(0,0,0,0)) * float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #else + dissolveToTexture = float4(poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0), float4(1,1,1,1).a); + #endif + #if defined(PROP_DISSOLVENOISETEXTURE) || !defined(OPTIMIZER_ENABLED) + float dissolveNoiseTexture = POI2D_SAMPLER_PAN(_DissolveNoiseTexture, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).r; + #else + float dissolveNoiseTexture = 1; + #endif + float da = 0.0 + + 1.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0 + + 0.0; + float dds = 0.019; + if (0.0) + { + float2 udim = floor(poiMesh.uv[(int)0.0]); + float4 xMask = float4((udim.x >= 0 && udim.x < 1), + (udim.x >= 1 && udim.x < 2), + (udim.x >= 2 && udim.x < 3), + (udim.x >= 3 && udim.x < 4)); + da += (udim.y >= 0 && udim.y < 1) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 1 && udim.y < 2) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 2 && udim.y < 3) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + da += (udim.y >= 3 && udim.y < 4) * dot(float4(0.0, 0.0, 0.0, 0.0), xMask); + } + #ifdef POI_AUDIOLINK + + if (0.0 && poiMods.audioLinkAvailable) + { + da += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + dds += lerp(float4(0,0,0,0).x, float4(0,0,0,0).y, poiMods.audioLink[0.0]); + } + #endif + da = saturate(da); + dds = saturate(dds); + if (0.0) + { + dissolveMask = 1 - dissolveMask; + } + #if defined(PROP_DISSOLVEDETAILNOISE) || !defined(OPTIMIZER_ENABLED) + float dissolveDetailNoise = POI2D_SAMPLER_PAN(_DissolveDetailNoise, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #else + float dissolveDetailNoise = 0; + #endif + if (0.0) + { + dissolveNoiseTexture = 1 - dissolveNoiseTexture; + } + if (0.0) + { + dissolveDetailNoise = 1 - dissolveDetailNoise; + } + if (0.0 != 0) + { + da = sin(_Time.x * 0.0) * .5 + .5; + } + da *= dissolveMask; + dissolveAlpha = da; + edgeAlpha = 0; + [flatten] + switch(2.0) + { + default: // Basic (case 1) + { + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + float noise = saturate(dissolveNoiseTexture - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + case 2: // Point to Point + { + float3 direction; + float3 currentPos; + float distanceTo = 0; + direction = normalize(float4(0,0.48,0,0) - float4(0,-1,0,0)); + currentPos = lerp(float4(0,-1,0,0), float4(0,0.48,0,0), dissolveAlpha); + + if (0.0 != 1) + { + float3 pos = 0.0 == 0 ? poiMesh.localPos.rgb : poiMesh.vertexColor.rgb; + distanceTo = dot(pos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = step(distanceTo, 0); + edgeAlpha *= 1 - dissolveAlpha; + } + else + { + distanceTo = dot(poiMesh.worldPos - currentPos, direction) - dissolveDetailNoise * dds; + edgeAlpha = smoothstep(0.1 + .00001, 0, distanceTo); + dissolveAlpha = (distanceTo < 0) ? 1 : 0; + edgeAlpha *= 1 - dissolveAlpha; + } + if (0.0) + { + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 3: // Spherical + { + if (0.0) + { + da = remap(da, 1, 0, -0.025, 1); + } + else + { + da = remap(da, 0, 1, -0.025, 1); + } + dissolveAlpha = da; + dds *= smoothstep(0, 0.2 * dds + 0.01, dissolveAlpha) * lerp(1, smoothstep(1, 1 - 0.2 * dds - 0.01, dissolveAlpha), 0.0); + float currentDistance = lerp(0, 1.5, dissolveAlpha); + float fragDistance = distance(float4(0,0,0,1), poiMesh.localPos.xyz); + float normalizedDistance; + normalizedDistance = (fragDistance - currentDistance) / (1.5 + 0.0001) - dissolveDetailNoise * dds; + if (0.0) + { + dissolveAlpha = (normalizedDistance > 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, -normalizedDistance); + } + else + { + dissolveAlpha = (normalizedDistance < 0) ? 1 : 0; + edgeAlpha = smoothstep(0.025 + .00001, 0, normalizedDistance); + } + if (0.0) + { + da = lerp(da, 1 - da, 0.0); + dissolveAlpha = saturate(dissolveAlpha * smoothstep(0, 0.01, da) + smoothstep(0.99, 1, da)); + edgeAlpha *= smoothstep(0, 0.01, da); + } + break; + } + case 4: // CenterOut + { + float ramp = 0.5; + float noise; + [flatten] + switch(1.0) + { + case 1: // View Direction + { + ramp = saturate(lerp(poiLight.vertexNDotV, poiLight.nDotV, 0.0)); + break; + } + case 2: // Custom Direction + { + ramp = dot(normalize(float4(0,0,1,0)), lerp(poiMesh.normals[0], poiMesh.normals[1], 0.0)); + ramp = saturate(ramp * .5 + 0.5); + break; + } + case 3: // Light Direction + { + ramp = lerp(poiLight.vertexNDotL, poiLight.nDotL, 0.0); + ramp = saturate(ramp * .5 + 0.5); + break; + } + } + if (1.0 != 1) + { + ramp = pow(ramp, 1.0); + } + if (!0.0) + { + ramp = 1 - ramp; + } + da = remap(da, 0, 1, -0.025, 1); + dissolveAlpha = da; + dds *= smoothstep(1, 0.99, da) * lerp(1, smoothstep(0, lerp(0.01, 0.1, dds), da), 0.0); + noise = saturate(ramp - dissolveDetailNoise * dds); + noise = saturate(noise * 0.998 + 0.001); + dissolveAlpha = dissolveAlpha >= noise; + edgeAlpha = remapClamped(da + 0.025, da, noise) * (1 - dissolveAlpha); + break; + } + } + #ifndef POI_SHADOW + + if (0.0) + { + dissolveToTexture.rgb = hueShift(dissolveToTexture.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.alpha = lerp(poiFragData.alpha, dissolveToTexture.a, dissolveAlpha * .999999); + #if !defined(POI_PASS_OUTLINE) && !defined(UNITY_PASS_SHADOWCASTER) + poiFragData.baseColor = lerp(poiFragData.baseColor, dissolveToTexture.rgb, dissolveAlpha * .999999); + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, dissolveAlpha * .999999); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 0.0, 1 - (dissolveAlpha * .999999)); + } + + if (0.025 || (2.0 == 2 && 0.1 != 0)) + { + edgeColor = _DissolveEdgeGradient.Sample(sampler_MainTex, poiUV(float2(edgeAlpha, edgeAlpha), float4(1,1,0,0))) * float4(poiThemeColor(poiMods, float4(0.008568122,0.01228648,0.1384316,1).rgb, 0.0), float4(0.008568122,0.01228648,0.1384316,1).a); + #ifndef POI_SHADOW + + if (0.0 && 0.0) + { + edgeColor.rgb = hueShift(edgeColor.rgb, 0.0 + _Time.x * 0.0, 0.0, 1.0); + } + #endif + poiFragData.baseColor = lerp(poiFragData.baseColor, edgeColor.rgb, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + } + poiFragData.emission += lerp(0, dissolveToTexture * 0.29, dissolveAlpha) + lerp(0, edgeColor.rgb * 0.0, smoothstep(0, 1 - 1.0 * .99999999999, edgeAlpha)); + #endif + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #ifdef DISTORT + applyDissolve(poiFragData, poiMesh, poiMods, poiCam, poiLight); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..353b385 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/CardStack/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 01db5f458e40d624f9b53760e88db9d6 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand.meta new file mode 100644 index 0000000..237daef --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5018d2e328c91445a7809312d5c2e0f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand/Poiyomi Pro World.shader b/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand/Poiyomi Pro World.shader new file mode 100644 index 0000000..807d453 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand/Poiyomi Pro World.shader @@ -0,0 +1,12790 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/90e2c2c675ad56247b8ce0101848274e" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_start_brdf (" Reflections & Specular--{reference_property:_MochieBRDF,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/reflections-and-specular},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(MOCHIE_PBR)]_MochieBRDF ("Enable", Float) = 0 + _MochieMetallicMultiplier ("Metallic", Range(0, 1)) = 0 + _MochieRoughnessMultiplier ("Smoothness", Range(0, 1)) = 1 + _MochieReflectionTint ("Reflection Tint--{reference_property:_MochieReflectionTintThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _MochieReflectionTintThemeIndex ("", Int) = 0 + _MochieSpecularTint ("Specular Tint--{reference_property:_MochieSpecularTintThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _MochieSpecularTintThemeIndex ("", Int) = 0 + [sRGBWarning][ThryRGBAPacker(R Metallic Map, G Smoothness Map, B Reflection Mask, A Specular Mask, linear, false)]_MochieMetallicMaps ("Packed Maps [Click to Expand]--{reference_properties:[_MochieMetallicMapsPan, _MochieMetallicMapsUV, _MochieMetallicMapsStochastic, _MochieMetallicMapsMetallicChannel, _MochieMetallicMapsRoughnessChannel, _MochieMetallicMapsReflectionMaskChannel, _MochieMetallicMapsSpecularMaskChannel, _MochieMetallicMapInvert, _MochieRoughnessMapInvert, _MochieReflectionMaskInvert, _MochieSpecularMaskInvert]}", 2D) = "white" { } + [HideInInspector][Vector2]_MochieMetallicMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)]_MochieMetallicMapsUV ("UV", Int) = 0 + [HideInInspector][ToggleUI]_MochieMetallicMapsStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsMetallicChannel ("Metallic Channel", Float) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsRoughnessChannel ("Smoothness Channel", Float) = 1 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsReflectionMaskChannel ("Reflection Mask Channel", Float) = 2 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsSpecularMaskChannel ("Specular Mask Channel", Float) = 3 + [HideInInspector][ToggleUI]_MochieMetallicMapInvert ("Invert Metallic", Float) = 0 + [HideInInspector][ToggleUI]_MochieRoughnessMapInvert ("Invert Smoothness", Float) = 0 + [HideInInspector][ToggleUI]_MochieReflectionMaskInvert ("Invert Reflection Mask", Float) = 0 + [HideInInspector][ToggleUI]_MochieSpecularMaskInvert ("Invert Specular Mask", Float) = 0 + [Space(10)] + _MochieReflectionStrength ("Reflection Visibility", Range(0, 1)) = 1 + _MochieSpecularStrength ("Specular Visibility", Range(0, 5)) = 1 + _RefSpecFresnelStrength ("Fresnel Strength", Range(0, 1)) = .5 + _SFExposureOcclusion ("Exposure Occlusion", Range(0, 1)) = 0 + [Space(10)] + [ThryTexture][NoScaleOffset]_MochieReflCube ("Cubemap", Cube) = "" { } + [ToggleUI]_MochieForceFallback ("Force Fallback", Int) = 0 + [HideInInspector] s_start_BRDFTPSMaskGroup ("TPS--{condition_showS:(_TPSPenetratorEnabled==1)}", Float) = 0 + [ThryToggleUI(true)] _BRDFTPSDepthEnabled (" TPS Depth Enabled", Float) = 0 + _BRDFTPSReflectionMaskStrength ("Reflection Mask Strength--{condition_showS:(_BRDFTPSDepthEnabled==1)}", Range(0, 1)) = 1 + _BRDFTPSSpecularMaskStrength ("Specular Mask Strength--{condition_showS:(_BRDFTPSDepthEnabled==1)}", Range(0, 1)) = 1 + [HideInInspector] s_end_BRDFTPSMaskGroup ("", Float) = 0 + [HideInInspector] s_start_ggxanisotropics(" Anisotropics--{reference_property:_GGXAnisotropics,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ThryToggle(GGX_ANISOTROPICS)]_GGXAnisotropics ("Enable", Float) = 0 + [sRGBWarning]_AnisotropyMap("Anisotropy Map--{reference_properties:[_AnisotropyMapPan, _AnisotropyMapUV, _AnisotropyMapChannel]}", 2D) = "bump" { } + [HideInInspector][Vector2]_AnisotropyMapPan("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AnisotropyMapUV ("UV", Int) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3)]_AnisotropyMapChannel ("Channel", Float) = 0 + _Anisotropy ("Anisotropy", Range(-1, 1)) = 0 + _ReflectionAnisotropicStretch("Reflection Stretch", Range(1, 5)) = 1 + _RoughnessAnisotropy("Roughness Anisotropy", Range(0, 1)) = 1 + [HideInInspector] s_end_ggxanisotropics ("", Float) = 0 + [HideInInspector] s_start_PBRSecondSpecular ("2nd Specular--{reference_property:_Specular2ndLayer,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ToggleUI]_Specular2ndLayer ("2nd Specular", Float) = 0 + _MochieSpecularStrength2 ("Visibility", Range(0, 5)) = 1 + _MochieRoughnessMultiplier2 ("Smoothness", Range(0, 1)) = 1 + [HideInInspector] s_end_PBRSecondSpecular ("Name", Float) = 0 + [HideInInspector] s_start_PBRSplitMaskSample ("Split Mask Sampling--{reference_property:_PBRSplitMaskSample,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ToggleUI]_PBRSplitMaskSample ("Split Mask Sampling", Float) = 0 + [VectorLabel(tX, tY, oX, oY)]_PBRMaskScaleTiling ("Tiling/Offset", Vector) = (1, 1, 0, 0) + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)]_MochieMetallicMasksUV ("UV", Int) = 0 + [ToggleUI]_PBRSplitMaskStochastic ("Stochastic Sampling", Float) = 0 + [Vector2]_MochieMetallicMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector] s_end_PBRSplitMaskSample ("Split Mask Sampling", Float) = 0 + [HideInInspector] s_start_brdfadvanced ("GSAA & Advanced Controls--{persistent_expand:true,default_expand:false}", Float) = 0 + [ToggleUI]_MochieLitFallback ("Lit Fallback", Float) = 1 + [ToggleUI]_IgnoreCastedShadows ("Ignore Casted Shadows", Float) = 0 + _PBRNormalSelect ("Pixel Normal Mix", Range(0, 1)) = 1 + [ThryToggleUI(true)]_MochieGSAAEnabled (" GSAA", Float) = 1 + _PoiGSAAVariance ("GSAA Variance--{condition_showS:(_MochieGSAAEnabled==1)}", Range(0, 1)) = 0.15 + _PoiGSAAThreshold ("GSAA Threshold--{condition_showS:(_MochieGSAAEnabled==1)}", Range(0, 1)) = 0.1 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieMetallicGlobalMask ("Metallic--{reference_property:_MochieMetallicGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieMetallicGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieSmoothnessGlobalMask ("Smoothness--{reference_property:_MochieSmoothnessGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieSmoothnessGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieReflectionStrengthGlobalMask ("Reflection Strength--{reference_property:_MochieReflectionStrengthGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieReflectionStrengthGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieSpecularStrengthGlobalMask ("Specular Strength--{reference_property:_MochieSpecularStrengthGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieSpecularStrengthGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_brdfadvanced ("", Float) = 0 + [HideInInspector] m_end_brdf ("", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + #ifdef MOCHIE_PBR + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + Texture2D _MochieMetallicMaps; + float _PBRMapsStochastic; + #endif + float4 _MochieMetallicMaps_ST; + float2 _MochieMetallicMapsPan; + float _MochieMetallicMapsUV; + float _MochieMetallicMapsStochastic; + float _MochieMetallicMapInvert; + float _MochieRoughnessMapInvert; + float _MochieReflectionMaskInvert; + float _MochieSpecularMaskInvert; + float _MochieMetallicMapsMetallicChannel; + float _MochieMetallicMapsRoughnessChannel; + float _MochieMetallicMapsReflectionMaskChannel; + float _MochieMetallicMapsSpecularMaskChannel; + float _PBRNormalSelect; + float _MochieReflectionTintThemeIndex; + float _MochieSpecularTintThemeIndex; + float _MochieRoughnessMultiplier; + float _MochieMetallicMultiplier; + float _MochieReflectionStrength; + float _MochieSpecularStrength; + float4 _MochieSpecularTint; + float4 _MochieReflectionTint; + float _MochieLitFallback; + float _IgnoreCastedShadows; + float _PBRSplitMaskSample; + float _PBRSplitMaskStochastic; + float4 _PBRMaskScaleTiling; + float _MochieMetallicMasksUV; + float4 _MochieMetallicMasksPan; + float _Specular2ndLayer; + float _MochieSpecularStrength2; + float _MochieRoughnessMultiplier2; + float _RefSpecFresnelStrength; + float _SFExposureOcclusion; + TextureCube _MochieReflCube; + float4 _MochieReflCube_HDR; + float _MochieForceFallback; + float _MochieGSAAEnabled; + float _PoiGSAAVariance; + float _PoiGSAAThreshold; + float _BRDFTPSReflectionMaskStrength; + float _BRDFTPSSpecularMaskStrength; + float _BRDFTPSDepthEnabled; + float _MochieMetallicGlobalMask; + float _MochieMetallicGlobalMaskBlendType; + float _MochieSmoothnessGlobalMask; + float _MochieSmoothnessGlobalMaskBlendType; + float _MochieReflectionStrengthGlobalMask; + float _MochieReflectionStrengthGlobalMaskBlendType; + float _MochieSpecularStrengthGlobalMask; + float _MochieSpecularStrengthGlobalMaskBlendType; + #endif + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #if defined(MOCHIE_PBR) || defined(POI_CLEARCOAT) + float GSAA_Filament(float3 worldNormal, float perceptualRoughness, float gsaaVariance, float gsaaThreshold) + { + float3 du = ddx(worldNormal); + float3 dv = ddy(worldNormal); + float variance = gsaaVariance * (dot(du, du) + dot(dv, dv)); + float roughness = perceptualRoughness * perceptualRoughness; + float kernelRoughness = min(2.0 * variance, gsaaThreshold); + float squareRoughness = saturate(roughness * roughness + kernelRoughness); + return sqrt(sqrt(squareRoughness)); + } + float3 GetWorldReflections(float3 reflDir, float3 worldPos, float roughness) + { + float3 baseReflDir = reflDir; + reflDir = BoxProjection(reflDir, worldPos, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); + float4 envSample0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflDir, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p0 = DecodeHDR(envSample0, unity_SpecCube0_HDR); + float interpolator = unity_SpecCube0_BoxMin.w; + + if (interpolator < 0.99999) + { + float3 refDirBlend = BoxProjection(baseReflDir, worldPos, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); + float4 envSample1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, refDirBlend, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p1 = DecodeHDR(envSample1, unity_SpecCube1_HDR); + p0 = lerp(p1, p0, interpolator); + } + return p0; + } + float3 GetReflections(in PoiCam poiCam, in PoiLight pl, in PoiMesh poiMesh, float roughness, float ForceFallback, float LightFallback, TextureCube reflectionCube, float4 hdrData, float3 reflectionDir) + { + float3 reflections = 0; + float3 lighting = pl.finalLighting; + if (ForceFallback == 0) + { + + if (SceneHasReflections()) + { + #ifdef UNITY_PASS_FORWARDBASE + reflections = GetWorldReflections(reflectionDir, poiMesh.worldPos.xyz, roughness); + #endif + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + reflections *= pl.occlusion; + return reflections; + } + float GetGGXTerm(float nDotL, float nDotV, float nDotH, float roughness) + { + float visibilityTerm = 0; + if (nDotL > 0) + { + float lambdaV = nDotL * (nDotV * (1 - roughness) + roughness); + float lambdaL = nDotV * (nDotL * (1 - roughness) + roughness); + visibilityTerm = 0.5f / (lambdaV + lambdaL + 1e-5f); + float a = nDotH * roughness; + float k = roughness / (1.0 - nDotH * nDotH + a * a+ 1e-5f); + float dotTerm = k * k * UNITY_INV_PI; + visibilityTerm *= dotTerm; + } + return visibilityTerm; + } + void GetSpecFresTerm(float nDotL, float nDotV, float nDotH, float lDotH, inout float3 specularTerm, inout float3 fresnelTerm, float3 specCol, float roughness) + { + specularTerm = GetGGXTerm(nDotL, nDotV, nDotH, roughness); + fresnelTerm = FresnelTerm(specCol, lDotH); + specularTerm = max(0, specularTerm * max(0.00001, nDotL)); + } + float GetRoughness(float smoothness) + { + float rough = 1 - smoothness; + rough *= 1.7 - 0.7 * rough; + return rough; + } + float SFVisibility(float brdfRoughness, float3 directColor, float NDotV, float ExposureOcclusion) + { + float Visibility = saturate(length(directColor + EPSILON) * (1.0/(ExposureOcclusion))); //Using direct color because I think it should be generally more forgiving + return saturate(pow(NDotV + Visibility, exp2(-16.0 * brdfRoughness - 1.0)) - 1.0 + Visibility); + } + #endif + #ifdef MOCHIE_PBR + void MetallicAndSpecularFragDataInit(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods) + { + float smoothness = 1.0; + float smoothness2 = 1.0; + float metallic = 0.0; + float specularMask = 1; + float reflectionMask = 1; + smoothness *= poiFragData.smoothness; + smoothness2 *= poiFragData.smoothness2; + metallic *= poiFragData.metallic; + specularMask *= poiFragData.specularMask; + reflectionMask *= poiFragData.reflectionMask; + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + float4 PBRMaps = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), 0.0); + + if (0.0) + { + float4 PBRSplitMask = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy, 0.0); + assignValueToVectorFromIndex(PBRMaps, 2.0, PBRSplitMask[2.0]); + assignValueToVectorFromIndex(PBRMaps, 3.0, PBRSplitMask[3.0]); + } + if (0.0 < 4) + { + metallic *= PBRMaps[0.0]; + } + if (1.0 < 4) + { + smoothness *= PBRMaps[1.0]; + smoothness2 *= PBRMaps[1.0]; + } + if (2.0 < 4) + { + reflectionMask *= PBRMaps[2.0]; + } + if (3.0 < 4) + { + specularMask *= PBRMaps[3.0]; + } + #endif + reflectionMask *= 1.0; + specularMask *= 1.0; + if (0.0) + { + metallic = 1 - metallic; + } + if (0.0) + { + smoothness = 1 - smoothness; + smoothness2 = 1 - smoothness2; + } + if (0.0) + { + reflectionMask = 1 - reflectionMask; + } + if (0.0) + { + specularMask = 1 - specularMask; + } + poiFragData.smoothness *= smoothness; + poiFragData.smoothness2 *= smoothness2; + poiFragData.metallic *= metallic; + poiFragData.specularMask *= specularMask; + poiFragData.reflectionMask *= reflectionMask; + } + void MochieBRDF(inout PoiFragData poiFragData, in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, inout PoiMods poiMods) + { + float smoothness = poiFragData.smoothness; + float smoothness2 = poiFragData.smoothness2; + float metallic = poiFragData.metallic; + float specularMask = poiFragData.specularMask; + float reflectionMask = poiFragData.reflectionMask; + if (0.0 > 0) + { + metallic = customBlend(metallic, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + smoothness = customBlend(smoothness, poiMods.globalMask[0.0 - 1], 2.0); + smoothness2 = customBlend(smoothness2, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + reflectionMask = customBlend(reflectionMask, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + specularMask = customBlend(specularMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef TPS_Penetrator + if (0.0) + { + reflectionMask = lerp(0, reflectionMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + specularMask = lerp(0, specularMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + } + #endif + float roughness = GetRoughness(smoothness); + float roughness2 = GetRoughness(smoothness2); + float3 specCol = lerp(unity_ColorSpaceDielectricSpec.rgb, poiFragData.baseColor, metallic); + float omr = unity_ColorSpaceDielectricSpec.a - metallic * unity_ColorSpaceDielectricSpec.a; + float percepRough = 1 - smoothness; + float percepRough2 = 1 - smoothness2; + + if (1.0) + { + float3 normals = lerp(poiMesh.normals[0], poiMesh.normals[1], 1.0); + percepRough = GSAA_Filament(normals, percepRough, 0.15, 0.1); + if (0.0 == 1 && 1.0 > 0) + { + percepRough2 = GSAA_Filament(normals, percepRough2, 0.15, 0.1); + } + } + float brdfRoughness = percepRough * percepRough; + brdfRoughness = max(brdfRoughness, 0.002); + float brdfRoughness2 = percepRough2 * percepRough2; + brdfRoughness2 = max(brdfRoughness2, 0.002); + float3 diffuse = poiFragData.baseColor; + float3 specular = 0; + float3 specular2 = 0; + float3 vSpecular = 0; + float3 vSpecular2 = 0; + float3 reflections = 0; + float3 environment = 0; + #if defined(POINT) || defined(SPOT) + float attenuation = lerp(poiLight.additiveShadow, 1, 0.0); + #else + float attenuation = min(poiLight.nDotLSaturated, lerp(poiLight.attenuation, 1, 0.0)); + #endif + float3 fresnelTerm = 1; + float3 specularTerm = 1; + float pbrNDotL = lerp(poiLight.vertexNDotL, poiLight.nDotL, 1.0); + float pbrNDotV = lerp(poiLight.vertexNDotV, poiLight.nDotV, 1.0); + float pbrNDotH = lerp(poiLight.vertexNDotH, poiLight.nDotH, 1.0); + float3 pbrReflectionDir = lerp(poiCam.vertexReflectionDir, poiCam.reflectionDir, 1.0); + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness); + specular = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness); + vSpecular += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion; + } + #endif + } + if (0.0 == 1) + { + float3 fresnelTerm = 1; + float3 specularTerm = 1; + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness2); + specular2 = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation * 1.0; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness2); + vSpecular2 += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * 1.0; + } + #endif + } + } + float surfaceReduction = (1.0 / (brdfRoughness * brdfRoughness + 1.0)); + float grazingTerm = saturate(smoothness + (1 - omr)); + float3 reflCol = GetReflections(poiCam, poiLight, poiMesh, roughness, 0.0, 1.0, _MochieReflCube, _MochieReflCube_HDR, pbrReflectionDir); + reflections = surfaceReduction * reflCol * FresnelLerp(specCol, specCol + lerp(specCol, 1, 0.5) * 0.5, pbrNDotV) * SFVisibility(brdfRoughness, poiLight.directColor, pbrNDotV, 0.0); + reflections *= poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + reflections *= reflectionMask; + diffuse = lerp(diffuse, diffuse * omr, reflectionMask); + environment = max(specular + vSpecular, specular2 + vSpecular2); + environment += reflections; + diffuse *= poiLight.finalLighting; + poiFragData.finalColor = diffuse; + poiLight.finalLightAdd += environment; + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #if defined(MOCHIE_PBR) + MetallicAndSpecularFragDataInit(poiFragData, poiMesh, poiMods); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #ifdef MOCHIE_PBR + MochieBRDF(poiFragData, poiCam, poiLight, poiMesh, poiMods); + #endif + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (0.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + #ifdef MOCHIE_PBR + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + Texture2D _MochieMetallicMaps; + float _PBRMapsStochastic; + #endif + float4 _MochieMetallicMaps_ST; + float2 _MochieMetallicMapsPan; + float _MochieMetallicMapsUV; + float _MochieMetallicMapsStochastic; + float _MochieMetallicMapInvert; + float _MochieRoughnessMapInvert; + float _MochieReflectionMaskInvert; + float _MochieSpecularMaskInvert; + float _MochieMetallicMapsMetallicChannel; + float _MochieMetallicMapsRoughnessChannel; + float _MochieMetallicMapsReflectionMaskChannel; + float _MochieMetallicMapsSpecularMaskChannel; + float _PBRNormalSelect; + float _MochieReflectionTintThemeIndex; + float _MochieSpecularTintThemeIndex; + float _MochieRoughnessMultiplier; + float _MochieMetallicMultiplier; + float _MochieReflectionStrength; + float _MochieSpecularStrength; + float4 _MochieSpecularTint; + float4 _MochieReflectionTint; + float _MochieLitFallback; + float _IgnoreCastedShadows; + float _PBRSplitMaskSample; + float _PBRSplitMaskStochastic; + float4 _PBRMaskScaleTiling; + float _MochieMetallicMasksUV; + float4 _MochieMetallicMasksPan; + float _Specular2ndLayer; + float _MochieSpecularStrength2; + float _MochieRoughnessMultiplier2; + float _RefSpecFresnelStrength; + float _SFExposureOcclusion; + TextureCube _MochieReflCube; + float4 _MochieReflCube_HDR; + float _MochieForceFallback; + float _MochieGSAAEnabled; + float _PoiGSAAVariance; + float _PoiGSAAThreshold; + float _BRDFTPSReflectionMaskStrength; + float _BRDFTPSSpecularMaskStrength; + float _BRDFTPSDepthEnabled; + float _MochieMetallicGlobalMask; + float _MochieMetallicGlobalMaskBlendType; + float _MochieSmoothnessGlobalMask; + float _MochieSmoothnessGlobalMaskBlendType; + float _MochieReflectionStrengthGlobalMask; + float _MochieReflectionStrengthGlobalMaskBlendType; + float _MochieSpecularStrengthGlobalMask; + float _MochieSpecularStrengthGlobalMaskBlendType; + #endif + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #if defined(MOCHIE_PBR) || defined(POI_CLEARCOAT) + float GSAA_Filament(float3 worldNormal, float perceptualRoughness, float gsaaVariance, float gsaaThreshold) + { + float3 du = ddx(worldNormal); + float3 dv = ddy(worldNormal); + float variance = gsaaVariance * (dot(du, du) + dot(dv, dv)); + float roughness = perceptualRoughness * perceptualRoughness; + float kernelRoughness = min(2.0 * variance, gsaaThreshold); + float squareRoughness = saturate(roughness * roughness + kernelRoughness); + return sqrt(sqrt(squareRoughness)); + } + float3 GetWorldReflections(float3 reflDir, float3 worldPos, float roughness) + { + float3 baseReflDir = reflDir; + reflDir = BoxProjection(reflDir, worldPos, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); + float4 envSample0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflDir, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p0 = DecodeHDR(envSample0, unity_SpecCube0_HDR); + float interpolator = unity_SpecCube0_BoxMin.w; + + if (interpolator < 0.99999) + { + float3 refDirBlend = BoxProjection(baseReflDir, worldPos, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); + float4 envSample1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, refDirBlend, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p1 = DecodeHDR(envSample1, unity_SpecCube1_HDR); + p0 = lerp(p1, p0, interpolator); + } + return p0; + } + float3 GetReflections(in PoiCam poiCam, in PoiLight pl, in PoiMesh poiMesh, float roughness, float ForceFallback, float LightFallback, TextureCube reflectionCube, float4 hdrData, float3 reflectionDir) + { + float3 reflections = 0; + float3 lighting = pl.finalLighting; + if (ForceFallback == 0) + { + + if (SceneHasReflections()) + { + #ifdef UNITY_PASS_FORWARDBASE + reflections = GetWorldReflections(reflectionDir, poiMesh.worldPos.xyz, roughness); + #endif + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + reflections *= pl.occlusion; + return reflections; + } + float GetGGXTerm(float nDotL, float nDotV, float nDotH, float roughness) + { + float visibilityTerm = 0; + if (nDotL > 0) + { + float lambdaV = nDotL * (nDotV * (1 - roughness) + roughness); + float lambdaL = nDotV * (nDotL * (1 - roughness) + roughness); + visibilityTerm = 0.5f / (lambdaV + lambdaL + 1e-5f); + float a = nDotH * roughness; + float k = roughness / (1.0 - nDotH * nDotH + a * a+ 1e-5f); + float dotTerm = k * k * UNITY_INV_PI; + visibilityTerm *= dotTerm; + } + return visibilityTerm; + } + void GetSpecFresTerm(float nDotL, float nDotV, float nDotH, float lDotH, inout float3 specularTerm, inout float3 fresnelTerm, float3 specCol, float roughness) + { + specularTerm = GetGGXTerm(nDotL, nDotV, nDotH, roughness); + fresnelTerm = FresnelTerm(specCol, lDotH); + specularTerm = max(0, specularTerm * max(0.00001, nDotL)); + } + float GetRoughness(float smoothness) + { + float rough = 1 - smoothness; + rough *= 1.7 - 0.7 * rough; + return rough; + } + float SFVisibility(float brdfRoughness, float3 directColor, float NDotV, float ExposureOcclusion) + { + float Visibility = saturate(length(directColor + EPSILON) * (1.0/(ExposureOcclusion))); //Using direct color because I think it should be generally more forgiving + return saturate(pow(NDotV + Visibility, exp2(-16.0 * brdfRoughness - 1.0)) - 1.0 + Visibility); + } + #endif + #ifdef MOCHIE_PBR + void MetallicAndSpecularFragDataInit(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods) + { + float smoothness = 1.0; + float smoothness2 = 1.0; + float metallic = 0.0; + float specularMask = 1; + float reflectionMask = 1; + smoothness *= poiFragData.smoothness; + smoothness2 *= poiFragData.smoothness2; + metallic *= poiFragData.metallic; + specularMask *= poiFragData.specularMask; + reflectionMask *= poiFragData.reflectionMask; + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + float4 PBRMaps = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), 0.0); + + if (0.0) + { + float4 PBRSplitMask = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy, 0.0); + assignValueToVectorFromIndex(PBRMaps, 2.0, PBRSplitMask[2.0]); + assignValueToVectorFromIndex(PBRMaps, 3.0, PBRSplitMask[3.0]); + } + if (0.0 < 4) + { + metallic *= PBRMaps[0.0]; + } + if (1.0 < 4) + { + smoothness *= PBRMaps[1.0]; + smoothness2 *= PBRMaps[1.0]; + } + if (2.0 < 4) + { + reflectionMask *= PBRMaps[2.0]; + } + if (3.0 < 4) + { + specularMask *= PBRMaps[3.0]; + } + #endif + reflectionMask *= 1.0; + specularMask *= 1.0; + if (0.0) + { + metallic = 1 - metallic; + } + if (0.0) + { + smoothness = 1 - smoothness; + smoothness2 = 1 - smoothness2; + } + if (0.0) + { + reflectionMask = 1 - reflectionMask; + } + if (0.0) + { + specularMask = 1 - specularMask; + } + poiFragData.smoothness *= smoothness; + poiFragData.smoothness2 *= smoothness2; + poiFragData.metallic *= metallic; + poiFragData.specularMask *= specularMask; + poiFragData.reflectionMask *= reflectionMask; + } + void MochieBRDF(inout PoiFragData poiFragData, in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, inout PoiMods poiMods) + { + float smoothness = poiFragData.smoothness; + float smoothness2 = poiFragData.smoothness2; + float metallic = poiFragData.metallic; + float specularMask = poiFragData.specularMask; + float reflectionMask = poiFragData.reflectionMask; + if (0.0 > 0) + { + metallic = customBlend(metallic, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + smoothness = customBlend(smoothness, poiMods.globalMask[0.0 - 1], 2.0); + smoothness2 = customBlend(smoothness2, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + reflectionMask = customBlend(reflectionMask, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + specularMask = customBlend(specularMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef TPS_Penetrator + if (0.0) + { + reflectionMask = lerp(0, reflectionMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + specularMask = lerp(0, specularMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + } + #endif + float roughness = GetRoughness(smoothness); + float roughness2 = GetRoughness(smoothness2); + float3 specCol = lerp(unity_ColorSpaceDielectricSpec.rgb, poiFragData.baseColor, metallic); + float omr = unity_ColorSpaceDielectricSpec.a - metallic * unity_ColorSpaceDielectricSpec.a; + float percepRough = 1 - smoothness; + float percepRough2 = 1 - smoothness2; + + if (1.0) + { + float3 normals = lerp(poiMesh.normals[0], poiMesh.normals[1], 1.0); + percepRough = GSAA_Filament(normals, percepRough, 0.15, 0.1); + if (0.0 == 1 && 1.0 > 0) + { + percepRough2 = GSAA_Filament(normals, percepRough2, 0.15, 0.1); + } + } + float brdfRoughness = percepRough * percepRough; + brdfRoughness = max(brdfRoughness, 0.002); + float brdfRoughness2 = percepRough2 * percepRough2; + brdfRoughness2 = max(brdfRoughness2, 0.002); + float3 diffuse = poiFragData.baseColor; + float3 specular = 0; + float3 specular2 = 0; + float3 vSpecular = 0; + float3 vSpecular2 = 0; + float3 reflections = 0; + float3 environment = 0; + #if defined(POINT) || defined(SPOT) + float attenuation = lerp(poiLight.additiveShadow, 1, 0.0); + #else + float attenuation = min(poiLight.nDotLSaturated, lerp(poiLight.attenuation, 1, 0.0)); + #endif + float3 fresnelTerm = 1; + float3 specularTerm = 1; + float pbrNDotL = lerp(poiLight.vertexNDotL, poiLight.nDotL, 1.0); + float pbrNDotV = lerp(poiLight.vertexNDotV, poiLight.nDotV, 1.0); + float pbrNDotH = lerp(poiLight.vertexNDotH, poiLight.nDotH, 1.0); + float3 pbrReflectionDir = lerp(poiCam.vertexReflectionDir, poiCam.reflectionDir, 1.0); + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness); + specular = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness); + vSpecular += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion; + } + #endif + } + if (0.0 == 1) + { + float3 fresnelTerm = 1; + float3 specularTerm = 1; + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness2); + specular2 = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation * 1.0; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness2); + vSpecular2 += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * 1.0; + } + #endif + } + } + float surfaceReduction = (1.0 / (brdfRoughness * brdfRoughness + 1.0)); + float grazingTerm = saturate(smoothness + (1 - omr)); + float3 reflCol = GetReflections(poiCam, poiLight, poiMesh, roughness, 0.0, 1.0, _MochieReflCube, _MochieReflCube_HDR, pbrReflectionDir); + reflections = surfaceReduction * reflCol * FresnelLerp(specCol, specCol + lerp(specCol, 1, 0.5) * 0.5, pbrNDotV) * SFVisibility(brdfRoughness, poiLight.directColor, pbrNDotV, 0.0); + reflections *= poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + reflections *= reflectionMask; + diffuse = lerp(diffuse, diffuse * omr, reflectionMask); + environment = max(specular + vSpecular, specular2 + vSpecular2); + environment += reflections; + diffuse *= poiLight.finalLighting; + poiFragData.finalColor = diffuse; + poiLight.finalLightAdd += environment; + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #if defined(MOCHIE_PBR) + MetallicAndSpecularFragDataInit(poiFragData, poiMesh, poiMods); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #ifdef MOCHIE_PBR + MochieBRDF(poiFragData, poiCam, poiLight, poiMesh, poiMods); + #endif + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (0.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..c9c90d1 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/LetterStand/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8fc88ee9dbb1d67448a21f62e99db855 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand.meta new file mode 100644 index 0000000..87b6af2 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cdba881407e8f38459c338be8a62cba8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand/Poiyomi Pro World.shader b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand/Poiyomi Pro World.shader new file mode 100644 index 0000000..6c54525 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand/Poiyomi Pro World.shader @@ -0,0 +1,12782 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/50a00808aba6c2c488f11f4b0baff9eb" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_start_brdf (" Reflections & Specular--{reference_property:_MochieBRDF,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/reflections-and-specular},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(MOCHIE_PBR)]_MochieBRDF ("Enable", Float) = 0 + _MochieMetallicMultiplier ("Metallic", Range(0, 1)) = 0 + _MochieRoughnessMultiplier ("Smoothness", Range(0, 1)) = 1 + _MochieReflectionTint ("Reflection Tint--{reference_property:_MochieReflectionTintThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _MochieReflectionTintThemeIndex ("", Int) = 0 + _MochieSpecularTint ("Specular Tint--{reference_property:_MochieSpecularTintThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _MochieSpecularTintThemeIndex ("", Int) = 0 + [sRGBWarning][ThryRGBAPacker(R Metallic Map, G Smoothness Map, B Reflection Mask, A Specular Mask, linear, false)]_MochieMetallicMaps ("Packed Maps [Click to Expand]--{reference_properties:[_MochieMetallicMapsPan, _MochieMetallicMapsUV, _MochieMetallicMapsStochastic, _MochieMetallicMapsMetallicChannel, _MochieMetallicMapsRoughnessChannel, _MochieMetallicMapsReflectionMaskChannel, _MochieMetallicMapsSpecularMaskChannel, _MochieMetallicMapInvert, _MochieRoughnessMapInvert, _MochieReflectionMaskInvert, _MochieSpecularMaskInvert]}", 2D) = "white" { } + [HideInInspector][Vector2]_MochieMetallicMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)]_MochieMetallicMapsUV ("UV", Int) = 0 + [HideInInspector][ToggleUI]_MochieMetallicMapsStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsMetallicChannel ("Metallic Channel", Float) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsRoughnessChannel ("Smoothness Channel", Float) = 1 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsReflectionMaskChannel ("Reflection Mask Channel", Float) = 2 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsSpecularMaskChannel ("Specular Mask Channel", Float) = 3 + [HideInInspector][ToggleUI]_MochieMetallicMapInvert ("Invert Metallic", Float) = 0 + [HideInInspector][ToggleUI]_MochieRoughnessMapInvert ("Invert Smoothness", Float) = 0 + [HideInInspector][ToggleUI]_MochieReflectionMaskInvert ("Invert Reflection Mask", Float) = 0 + [HideInInspector][ToggleUI]_MochieSpecularMaskInvert ("Invert Specular Mask", Float) = 0 + [Space(10)] + _MochieReflectionStrength ("Reflection Visibility", Range(0, 1)) = 1 + _MochieSpecularStrength ("Specular Visibility", Range(0, 5)) = 1 + _RefSpecFresnelStrength ("Fresnel Strength", Range(0, 1)) = .5 + _SFExposureOcclusion ("Exposure Occlusion", Range(0, 1)) = 0 + [Space(10)] + [ThryTexture][NoScaleOffset]_MochieReflCube ("Cubemap", Cube) = "" { } + [ToggleUI]_MochieForceFallback ("Force Fallback", Int) = 0 + [HideInInspector] s_start_BRDFTPSMaskGroup ("TPS--{condition_showS:(_TPSPenetratorEnabled==1)}", Float) = 0 + [ThryToggleUI(true)] _BRDFTPSDepthEnabled (" TPS Depth Enabled", Float) = 0 + _BRDFTPSReflectionMaskStrength ("Reflection Mask Strength--{condition_showS:(_BRDFTPSDepthEnabled==1)}", Range(0, 1)) = 1 + _BRDFTPSSpecularMaskStrength ("Specular Mask Strength--{condition_showS:(_BRDFTPSDepthEnabled==1)}", Range(0, 1)) = 1 + [HideInInspector] s_end_BRDFTPSMaskGroup ("", Float) = 0 + [HideInInspector] s_start_ggxanisotropics(" Anisotropics--{reference_property:_GGXAnisotropics,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ThryToggle(GGX_ANISOTROPICS)]_GGXAnisotropics ("Enable", Float) = 0 + [sRGBWarning]_AnisotropyMap("Anisotropy Map--{reference_properties:[_AnisotropyMapPan, _AnisotropyMapUV, _AnisotropyMapChannel]}", 2D) = "bump" { } + [HideInInspector][Vector2]_AnisotropyMapPan("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AnisotropyMapUV ("UV", Int) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3)]_AnisotropyMapChannel ("Channel", Float) = 0 + _Anisotropy ("Anisotropy", Range(-1, 1)) = 0 + _ReflectionAnisotropicStretch("Reflection Stretch", Range(1, 5)) = 1 + _RoughnessAnisotropy("Roughness Anisotropy", Range(0, 1)) = 1 + [HideInInspector] s_end_ggxanisotropics ("", Float) = 0 + [HideInInspector] s_start_PBRSecondSpecular ("2nd Specular--{reference_property:_Specular2ndLayer,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ToggleUI]_Specular2ndLayer ("2nd Specular", Float) = 0 + _MochieSpecularStrength2 ("Visibility", Range(0, 5)) = 1 + _MochieRoughnessMultiplier2 ("Smoothness", Range(0, 1)) = 1 + [HideInInspector] s_end_PBRSecondSpecular ("Name", Float) = 0 + [HideInInspector] s_start_PBRSplitMaskSample ("Split Mask Sampling--{reference_property:_PBRSplitMaskSample,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ToggleUI]_PBRSplitMaskSample ("Split Mask Sampling", Float) = 0 + [VectorLabel(tX, tY, oX, oY)]_PBRMaskScaleTiling ("Tiling/Offset", Vector) = (1, 1, 0, 0) + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)]_MochieMetallicMasksUV ("UV", Int) = 0 + [ToggleUI]_PBRSplitMaskStochastic ("Stochastic Sampling", Float) = 0 + [Vector2]_MochieMetallicMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector] s_end_PBRSplitMaskSample ("Split Mask Sampling", Float) = 0 + [HideInInspector] s_start_brdfadvanced ("GSAA & Advanced Controls--{persistent_expand:true,default_expand:false}", Float) = 0 + [ToggleUI]_MochieLitFallback ("Lit Fallback", Float) = 1 + [ToggleUI]_IgnoreCastedShadows ("Ignore Casted Shadows", Float) = 0 + _PBRNormalSelect ("Pixel Normal Mix", Range(0, 1)) = 1 + [ThryToggleUI(true)]_MochieGSAAEnabled (" GSAA", Float) = 1 + _PoiGSAAVariance ("GSAA Variance--{condition_showS:(_MochieGSAAEnabled==1)}", Range(0, 1)) = 0.15 + _PoiGSAAThreshold ("GSAA Threshold--{condition_showS:(_MochieGSAAEnabled==1)}", Range(0, 1)) = 0.1 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieMetallicGlobalMask ("Metallic--{reference_property:_MochieMetallicGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieMetallicGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieSmoothnessGlobalMask ("Smoothness--{reference_property:_MochieSmoothnessGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieSmoothnessGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieReflectionStrengthGlobalMask ("Reflection Strength--{reference_property:_MochieReflectionStrengthGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieReflectionStrengthGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieSpecularStrengthGlobalMask ("Specular Strength--{reference_property:_MochieSpecularStrengthGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieSpecularStrengthGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_brdfadvanced ("", Float) = 0 + [HideInInspector] m_end_brdf ("", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + #ifdef MOCHIE_PBR + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + Texture2D _MochieMetallicMaps; + float _PBRMapsStochastic; + #endif + float4 _MochieMetallicMaps_ST; + float2 _MochieMetallicMapsPan; + float _MochieMetallicMapsUV; + float _MochieMetallicMapsStochastic; + float _MochieMetallicMapInvert; + float _MochieRoughnessMapInvert; + float _MochieReflectionMaskInvert; + float _MochieSpecularMaskInvert; + float _MochieMetallicMapsMetallicChannel; + float _MochieMetallicMapsRoughnessChannel; + float _MochieMetallicMapsReflectionMaskChannel; + float _MochieMetallicMapsSpecularMaskChannel; + float _PBRNormalSelect; + float _MochieReflectionTintThemeIndex; + float _MochieSpecularTintThemeIndex; + float _MochieRoughnessMultiplier; + float _MochieMetallicMultiplier; + float _MochieReflectionStrength; + float _MochieSpecularStrength; + float4 _MochieSpecularTint; + float4 _MochieReflectionTint; + float _MochieLitFallback; + float _IgnoreCastedShadows; + float _PBRSplitMaskSample; + float _PBRSplitMaskStochastic; + float4 _PBRMaskScaleTiling; + float _MochieMetallicMasksUV; + float4 _MochieMetallicMasksPan; + float _Specular2ndLayer; + float _MochieSpecularStrength2; + float _MochieRoughnessMultiplier2; + float _RefSpecFresnelStrength; + float _SFExposureOcclusion; + TextureCube _MochieReflCube; + float4 _MochieReflCube_HDR; + float _MochieForceFallback; + float _MochieGSAAEnabled; + float _PoiGSAAVariance; + float _PoiGSAAThreshold; + float _BRDFTPSReflectionMaskStrength; + float _BRDFTPSSpecularMaskStrength; + float _BRDFTPSDepthEnabled; + float _MochieMetallicGlobalMask; + float _MochieMetallicGlobalMaskBlendType; + float _MochieSmoothnessGlobalMask; + float _MochieSmoothnessGlobalMaskBlendType; + float _MochieReflectionStrengthGlobalMask; + float _MochieReflectionStrengthGlobalMaskBlendType; + float _MochieSpecularStrengthGlobalMask; + float _MochieSpecularStrengthGlobalMaskBlendType; + #endif + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #if defined(MOCHIE_PBR) || defined(POI_CLEARCOAT) + float GSAA_Filament(float3 worldNormal, float perceptualRoughness, float gsaaVariance, float gsaaThreshold) + { + float3 du = ddx(worldNormal); + float3 dv = ddy(worldNormal); + float variance = gsaaVariance * (dot(du, du) + dot(dv, dv)); + float roughness = perceptualRoughness * perceptualRoughness; + float kernelRoughness = min(2.0 * variance, gsaaThreshold); + float squareRoughness = saturate(roughness * roughness + kernelRoughness); + return sqrt(sqrt(squareRoughness)); + } + float3 GetWorldReflections(float3 reflDir, float3 worldPos, float roughness) + { + float3 baseReflDir = reflDir; + reflDir = BoxProjection(reflDir, worldPos, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); + float4 envSample0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflDir, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p0 = DecodeHDR(envSample0, unity_SpecCube0_HDR); + float interpolator = unity_SpecCube0_BoxMin.w; + + if (interpolator < 0.99999) + { + float3 refDirBlend = BoxProjection(baseReflDir, worldPos, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); + float4 envSample1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, refDirBlend, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p1 = DecodeHDR(envSample1, unity_SpecCube1_HDR); + p0 = lerp(p1, p0, interpolator); + } + return p0; + } + float3 GetReflections(in PoiCam poiCam, in PoiLight pl, in PoiMesh poiMesh, float roughness, float ForceFallback, float LightFallback, TextureCube reflectionCube, float4 hdrData, float3 reflectionDir) + { + float3 reflections = 0; + float3 lighting = pl.finalLighting; + if (ForceFallback == 0) + { + + if (SceneHasReflections()) + { + #ifdef UNITY_PASS_FORWARDBASE + reflections = GetWorldReflections(reflectionDir, poiMesh.worldPos.xyz, roughness); + #endif + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + reflections *= pl.occlusion; + return reflections; + } + float GetGGXTerm(float nDotL, float nDotV, float nDotH, float roughness) + { + float visibilityTerm = 0; + if (nDotL > 0) + { + float lambdaV = nDotL * (nDotV * (1 - roughness) + roughness); + float lambdaL = nDotV * (nDotL * (1 - roughness) + roughness); + visibilityTerm = 0.5f / (lambdaV + lambdaL + 1e-5f); + float a = nDotH * roughness; + float k = roughness / (1.0 - nDotH * nDotH + a * a+ 1e-5f); + float dotTerm = k * k * UNITY_INV_PI; + visibilityTerm *= dotTerm; + } + return visibilityTerm; + } + void GetSpecFresTerm(float nDotL, float nDotV, float nDotH, float lDotH, inout float3 specularTerm, inout float3 fresnelTerm, float3 specCol, float roughness) + { + specularTerm = GetGGXTerm(nDotL, nDotV, nDotH, roughness); + fresnelTerm = FresnelTerm(specCol, lDotH); + specularTerm = max(0, specularTerm * max(0.00001, nDotL)); + } + float GetRoughness(float smoothness) + { + float rough = 1 - smoothness; + rough *= 1.7 - 0.7 * rough; + return rough; + } + float SFVisibility(float brdfRoughness, float3 directColor, float NDotV, float ExposureOcclusion) + { + float Visibility = saturate(length(directColor + EPSILON) * (1.0/(ExposureOcclusion))); //Using direct color because I think it should be generally more forgiving + return saturate(pow(NDotV + Visibility, exp2(-16.0 * brdfRoughness - 1.0)) - 1.0 + Visibility); + } + #endif + #ifdef MOCHIE_PBR + void MetallicAndSpecularFragDataInit(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods) + { + float smoothness = 1.0; + float smoothness2 = 1.0; + float metallic = 0.0; + float specularMask = 1; + float reflectionMask = 1; + smoothness *= poiFragData.smoothness; + smoothness2 *= poiFragData.smoothness2; + metallic *= poiFragData.metallic; + specularMask *= poiFragData.specularMask; + reflectionMask *= poiFragData.reflectionMask; + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + float4 PBRMaps = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), 0.0); + + if (0.0) + { + float4 PBRSplitMask = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy, 0.0); + assignValueToVectorFromIndex(PBRMaps, 2.0, PBRSplitMask[2.0]); + assignValueToVectorFromIndex(PBRMaps, 3.0, PBRSplitMask[3.0]); + } + if (0.0 < 4) + { + metallic *= PBRMaps[0.0]; + } + if (1.0 < 4) + { + smoothness *= PBRMaps[1.0]; + smoothness2 *= PBRMaps[1.0]; + } + if (2.0 < 4) + { + reflectionMask *= PBRMaps[2.0]; + } + if (3.0 < 4) + { + specularMask *= PBRMaps[3.0]; + } + #endif + reflectionMask *= 1.0; + specularMask *= 1.0; + if (0.0) + { + metallic = 1 - metallic; + } + if (0.0) + { + smoothness = 1 - smoothness; + smoothness2 = 1 - smoothness2; + } + if (0.0) + { + reflectionMask = 1 - reflectionMask; + } + if (0.0) + { + specularMask = 1 - specularMask; + } + poiFragData.smoothness *= smoothness; + poiFragData.smoothness2 *= smoothness2; + poiFragData.metallic *= metallic; + poiFragData.specularMask *= specularMask; + poiFragData.reflectionMask *= reflectionMask; + } + void MochieBRDF(inout PoiFragData poiFragData, in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, inout PoiMods poiMods) + { + float smoothness = poiFragData.smoothness; + float smoothness2 = poiFragData.smoothness2; + float metallic = poiFragData.metallic; + float specularMask = poiFragData.specularMask; + float reflectionMask = poiFragData.reflectionMask; + if (0.0 > 0) + { + metallic = customBlend(metallic, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + smoothness = customBlend(smoothness, poiMods.globalMask[0.0 - 1], 2.0); + smoothness2 = customBlend(smoothness2, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + reflectionMask = customBlend(reflectionMask, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + specularMask = customBlend(specularMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef TPS_Penetrator + if (0.0) + { + reflectionMask = lerp(0, reflectionMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + specularMask = lerp(0, specularMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + } + #endif + float roughness = GetRoughness(smoothness); + float roughness2 = GetRoughness(smoothness2); + float3 specCol = lerp(unity_ColorSpaceDielectricSpec.rgb, poiFragData.baseColor, metallic); + float omr = unity_ColorSpaceDielectricSpec.a - metallic * unity_ColorSpaceDielectricSpec.a; + float percepRough = 1 - smoothness; + float percepRough2 = 1 - smoothness2; + + if (1.0) + { + float3 normals = lerp(poiMesh.normals[0], poiMesh.normals[1], 1.0); + percepRough = GSAA_Filament(normals, percepRough, 0.15, 0.1); + if (0.0 == 1 && 1.0 > 0) + { + percepRough2 = GSAA_Filament(normals, percepRough2, 0.15, 0.1); + } + } + float brdfRoughness = percepRough * percepRough; + brdfRoughness = max(brdfRoughness, 0.002); + float brdfRoughness2 = percepRough2 * percepRough2; + brdfRoughness2 = max(brdfRoughness2, 0.002); + float3 diffuse = poiFragData.baseColor; + float3 specular = 0; + float3 specular2 = 0; + float3 vSpecular = 0; + float3 vSpecular2 = 0; + float3 reflections = 0; + float3 environment = 0; + #if defined(POINT) || defined(SPOT) + float attenuation = lerp(poiLight.additiveShadow, 1, 0.0); + #else + float attenuation = min(poiLight.nDotLSaturated, lerp(poiLight.attenuation, 1, 0.0)); + #endif + float3 fresnelTerm = 1; + float3 specularTerm = 1; + float pbrNDotL = lerp(poiLight.vertexNDotL, poiLight.nDotL, 1.0); + float pbrNDotV = lerp(poiLight.vertexNDotV, poiLight.nDotV, 1.0); + float pbrNDotH = lerp(poiLight.vertexNDotH, poiLight.nDotH, 1.0); + float3 pbrReflectionDir = lerp(poiCam.vertexReflectionDir, poiCam.reflectionDir, 1.0); + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness); + specular = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness); + vSpecular += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion; + } + #endif + } + if (0.0 == 1) + { + float3 fresnelTerm = 1; + float3 specularTerm = 1; + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness2); + specular2 = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation * 1.0; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness2); + vSpecular2 += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * 1.0; + } + #endif + } + } + float surfaceReduction = (1.0 / (brdfRoughness * brdfRoughness + 1.0)); + float grazingTerm = saturate(smoothness + (1 - omr)); + float3 reflCol = GetReflections(poiCam, poiLight, poiMesh, roughness, 0.0, 1.0, _MochieReflCube, _MochieReflCube_HDR, pbrReflectionDir); + reflections = surfaceReduction * reflCol * FresnelLerp(specCol, specCol + lerp(specCol, 1, 0.5) * 0.5, pbrNDotV) * SFVisibility(brdfRoughness, poiLight.directColor, pbrNDotV, 0.0); + reflections *= poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + reflections *= reflectionMask; + diffuse = lerp(diffuse, diffuse * omr, reflectionMask); + environment = max(specular + vSpecular, specular2 + vSpecular2); + environment += reflections; + diffuse *= poiLight.finalLighting; + poiFragData.finalColor = diffuse; + poiLight.finalLightAdd += environment; + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #if defined(MOCHIE_PBR) + MetallicAndSpecularFragDataInit(poiFragData, poiMesh, poiMods); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #ifdef MOCHIE_PBR + MochieBRDF(poiFragData, poiCam, poiLight, poiMesh, poiMods); + #endif + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (0.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + #ifdef MOCHIE_PBR + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + Texture2D _MochieMetallicMaps; + float _PBRMapsStochastic; + #endif + float4 _MochieMetallicMaps_ST; + float2 _MochieMetallicMapsPan; + float _MochieMetallicMapsUV; + float _MochieMetallicMapsStochastic; + float _MochieMetallicMapInvert; + float _MochieRoughnessMapInvert; + float _MochieReflectionMaskInvert; + float _MochieSpecularMaskInvert; + float _MochieMetallicMapsMetallicChannel; + float _MochieMetallicMapsRoughnessChannel; + float _MochieMetallicMapsReflectionMaskChannel; + float _MochieMetallicMapsSpecularMaskChannel; + float _PBRNormalSelect; + float _MochieReflectionTintThemeIndex; + float _MochieSpecularTintThemeIndex; + float _MochieRoughnessMultiplier; + float _MochieMetallicMultiplier; + float _MochieReflectionStrength; + float _MochieSpecularStrength; + float4 _MochieSpecularTint; + float4 _MochieReflectionTint; + float _MochieLitFallback; + float _IgnoreCastedShadows; + float _PBRSplitMaskSample; + float _PBRSplitMaskStochastic; + float4 _PBRMaskScaleTiling; + float _MochieMetallicMasksUV; + float4 _MochieMetallicMasksPan; + float _Specular2ndLayer; + float _MochieSpecularStrength2; + float _MochieRoughnessMultiplier2; + float _RefSpecFresnelStrength; + float _SFExposureOcclusion; + TextureCube _MochieReflCube; + float4 _MochieReflCube_HDR; + float _MochieForceFallback; + float _MochieGSAAEnabled; + float _PoiGSAAVariance; + float _PoiGSAAThreshold; + float _BRDFTPSReflectionMaskStrength; + float _BRDFTPSSpecularMaskStrength; + float _BRDFTPSDepthEnabled; + float _MochieMetallicGlobalMask; + float _MochieMetallicGlobalMaskBlendType; + float _MochieSmoothnessGlobalMask; + float _MochieSmoothnessGlobalMaskBlendType; + float _MochieReflectionStrengthGlobalMask; + float _MochieReflectionStrengthGlobalMaskBlendType; + float _MochieSpecularStrengthGlobalMask; + float _MochieSpecularStrengthGlobalMaskBlendType; + #endif + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #if defined(MOCHIE_PBR) || defined(POI_CLEARCOAT) + float GSAA_Filament(float3 worldNormal, float perceptualRoughness, float gsaaVariance, float gsaaThreshold) + { + float3 du = ddx(worldNormal); + float3 dv = ddy(worldNormal); + float variance = gsaaVariance * (dot(du, du) + dot(dv, dv)); + float roughness = perceptualRoughness * perceptualRoughness; + float kernelRoughness = min(2.0 * variance, gsaaThreshold); + float squareRoughness = saturate(roughness * roughness + kernelRoughness); + return sqrt(sqrt(squareRoughness)); + } + float3 GetWorldReflections(float3 reflDir, float3 worldPos, float roughness) + { + float3 baseReflDir = reflDir; + reflDir = BoxProjection(reflDir, worldPos, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); + float4 envSample0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflDir, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p0 = DecodeHDR(envSample0, unity_SpecCube0_HDR); + float interpolator = unity_SpecCube0_BoxMin.w; + + if (interpolator < 0.99999) + { + float3 refDirBlend = BoxProjection(baseReflDir, worldPos, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); + float4 envSample1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, refDirBlend, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p1 = DecodeHDR(envSample1, unity_SpecCube1_HDR); + p0 = lerp(p1, p0, interpolator); + } + return p0; + } + float3 GetReflections(in PoiCam poiCam, in PoiLight pl, in PoiMesh poiMesh, float roughness, float ForceFallback, float LightFallback, TextureCube reflectionCube, float4 hdrData, float3 reflectionDir) + { + float3 reflections = 0; + float3 lighting = pl.finalLighting; + if (ForceFallback == 0) + { + + if (SceneHasReflections()) + { + #ifdef UNITY_PASS_FORWARDBASE + reflections = GetWorldReflections(reflectionDir, poiMesh.worldPos.xyz, roughness); + #endif + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + reflections *= pl.occlusion; + return reflections; + } + float GetGGXTerm(float nDotL, float nDotV, float nDotH, float roughness) + { + float visibilityTerm = 0; + if (nDotL > 0) + { + float lambdaV = nDotL * (nDotV * (1 - roughness) + roughness); + float lambdaL = nDotV * (nDotL * (1 - roughness) + roughness); + visibilityTerm = 0.5f / (lambdaV + lambdaL + 1e-5f); + float a = nDotH * roughness; + float k = roughness / (1.0 - nDotH * nDotH + a * a+ 1e-5f); + float dotTerm = k * k * UNITY_INV_PI; + visibilityTerm *= dotTerm; + } + return visibilityTerm; + } + void GetSpecFresTerm(float nDotL, float nDotV, float nDotH, float lDotH, inout float3 specularTerm, inout float3 fresnelTerm, float3 specCol, float roughness) + { + specularTerm = GetGGXTerm(nDotL, nDotV, nDotH, roughness); + fresnelTerm = FresnelTerm(specCol, lDotH); + specularTerm = max(0, specularTerm * max(0.00001, nDotL)); + } + float GetRoughness(float smoothness) + { + float rough = 1 - smoothness; + rough *= 1.7 - 0.7 * rough; + return rough; + } + float SFVisibility(float brdfRoughness, float3 directColor, float NDotV, float ExposureOcclusion) + { + float Visibility = saturate(length(directColor + EPSILON) * (1.0/(ExposureOcclusion))); //Using direct color because I think it should be generally more forgiving + return saturate(pow(NDotV + Visibility, exp2(-16.0 * brdfRoughness - 1.0)) - 1.0 + Visibility); + } + #endif + #ifdef MOCHIE_PBR + void MetallicAndSpecularFragDataInit(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods) + { + float smoothness = 1.0; + float smoothness2 = 1.0; + float metallic = 0.0; + float specularMask = 1; + float reflectionMask = 1; + smoothness *= poiFragData.smoothness; + smoothness2 *= poiFragData.smoothness2; + metallic *= poiFragData.metallic; + specularMask *= poiFragData.specularMask; + reflectionMask *= poiFragData.reflectionMask; + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + float4 PBRMaps = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), 0.0); + + if (0.0) + { + float4 PBRSplitMask = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy, 0.0); + assignValueToVectorFromIndex(PBRMaps, 2.0, PBRSplitMask[2.0]); + assignValueToVectorFromIndex(PBRMaps, 3.0, PBRSplitMask[3.0]); + } + if (0.0 < 4) + { + metallic *= PBRMaps[0.0]; + } + if (1.0 < 4) + { + smoothness *= PBRMaps[1.0]; + smoothness2 *= PBRMaps[1.0]; + } + if (2.0 < 4) + { + reflectionMask *= PBRMaps[2.0]; + } + if (3.0 < 4) + { + specularMask *= PBRMaps[3.0]; + } + #endif + reflectionMask *= 1.0; + specularMask *= 1.0; + if (0.0) + { + metallic = 1 - metallic; + } + if (0.0) + { + smoothness = 1 - smoothness; + smoothness2 = 1 - smoothness2; + } + if (0.0) + { + reflectionMask = 1 - reflectionMask; + } + if (0.0) + { + specularMask = 1 - specularMask; + } + poiFragData.smoothness *= smoothness; + poiFragData.smoothness2 *= smoothness2; + poiFragData.metallic *= metallic; + poiFragData.specularMask *= specularMask; + poiFragData.reflectionMask *= reflectionMask; + } + void MochieBRDF(inout PoiFragData poiFragData, in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, inout PoiMods poiMods) + { + float smoothness = poiFragData.smoothness; + float smoothness2 = poiFragData.smoothness2; + float metallic = poiFragData.metallic; + float specularMask = poiFragData.specularMask; + float reflectionMask = poiFragData.reflectionMask; + if (0.0 > 0) + { + metallic = customBlend(metallic, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + smoothness = customBlend(smoothness, poiMods.globalMask[0.0 - 1], 2.0); + smoothness2 = customBlend(smoothness2, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + reflectionMask = customBlend(reflectionMask, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + specularMask = customBlend(specularMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef TPS_Penetrator + if (0.0) + { + reflectionMask = lerp(0, reflectionMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + specularMask = lerp(0, specularMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + } + #endif + float roughness = GetRoughness(smoothness); + float roughness2 = GetRoughness(smoothness2); + float3 specCol = lerp(unity_ColorSpaceDielectricSpec.rgb, poiFragData.baseColor, metallic); + float omr = unity_ColorSpaceDielectricSpec.a - metallic * unity_ColorSpaceDielectricSpec.a; + float percepRough = 1 - smoothness; + float percepRough2 = 1 - smoothness2; + + if (1.0) + { + float3 normals = lerp(poiMesh.normals[0], poiMesh.normals[1], 1.0); + percepRough = GSAA_Filament(normals, percepRough, 0.15, 0.1); + if (0.0 == 1 && 1.0 > 0) + { + percepRough2 = GSAA_Filament(normals, percepRough2, 0.15, 0.1); + } + } + float brdfRoughness = percepRough * percepRough; + brdfRoughness = max(brdfRoughness, 0.002); + float brdfRoughness2 = percepRough2 * percepRough2; + brdfRoughness2 = max(brdfRoughness2, 0.002); + float3 diffuse = poiFragData.baseColor; + float3 specular = 0; + float3 specular2 = 0; + float3 vSpecular = 0; + float3 vSpecular2 = 0; + float3 reflections = 0; + float3 environment = 0; + #if defined(POINT) || defined(SPOT) + float attenuation = lerp(poiLight.additiveShadow, 1, 0.0); + #else + float attenuation = min(poiLight.nDotLSaturated, lerp(poiLight.attenuation, 1, 0.0)); + #endif + float3 fresnelTerm = 1; + float3 specularTerm = 1; + float pbrNDotL = lerp(poiLight.vertexNDotL, poiLight.nDotL, 1.0); + float pbrNDotV = lerp(poiLight.vertexNDotV, poiLight.nDotV, 1.0); + float pbrNDotH = lerp(poiLight.vertexNDotH, poiLight.nDotH, 1.0); + float3 pbrReflectionDir = lerp(poiCam.vertexReflectionDir, poiCam.reflectionDir, 1.0); + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness); + specular = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness); + vSpecular += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion; + } + #endif + } + if (0.0 == 1) + { + float3 fresnelTerm = 1; + float3 specularTerm = 1; + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness2); + specular2 = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation * 1.0; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness2); + vSpecular2 += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * 1.0; + } + #endif + } + } + float surfaceReduction = (1.0 / (brdfRoughness * brdfRoughness + 1.0)); + float grazingTerm = saturate(smoothness + (1 - omr)); + float3 reflCol = GetReflections(poiCam, poiLight, poiMesh, roughness, 0.0, 1.0, _MochieReflCube, _MochieReflCube_HDR, pbrReflectionDir); + reflections = surfaceReduction * reflCol * FresnelLerp(specCol, specCol + lerp(specCol, 1, 0.5) * 0.5, pbrNDotV) * SFVisibility(brdfRoughness, poiLight.directColor, pbrNDotV, 0.0); + reflections *= poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + reflections *= reflectionMask; + diffuse = lerp(diffuse, diffuse * omr, reflectionMask); + environment = max(specular + vSpecular, specular2 + vSpecular2); + environment += reflections; + diffuse *= poiLight.finalLighting; + poiFragData.finalColor = diffuse; + poiLight.finalLightAdd += environment; + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #if defined(MOCHIE_PBR) + MetallicAndSpecularFragDataInit(poiFragData, poiMesh, poiMods); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #ifdef MOCHIE_PBR + MochieBRDF(poiFragData, poiCam, poiLight, poiMesh, poiMods); + #endif + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (0.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..b7195a2 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/OptimizedShaders/Stand/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b97979b5d5e4f20458574c82ae0b9c13 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/DownCount/Stand.mat b/Assets/Quiz/Materials/DownCount/Stand.mat new file mode 100644 index 0000000..106c446 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/Stand.mat @@ -0,0 +1,3800 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Stand + m_Shader: {fileID: 4800000, guid: b97979b5d5e4f20458574c82ae0b9c13, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - MOCHIE_PBR + - VIGNETTE_MASKED + - _LIGHTINGMODE_REALISTIC + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + AllLockedGUIDS: 50a00808aba6c2c488f11f4b0baff9eb + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT MOCHIE_PBR VIGNETTE_MASKED _LIGHTINGMODE_REALISTIC + _RIM2STYLE_POIYOMI _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: Opaque + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _AnisotropyMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 35d5ee8836afb8d45946aa19aca8c6fd, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 07ba9cde956dc0b45af9f2b15c7a9430, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MochieMetallicMaps: + m_Texture: {fileID: 2800000, guid: 72189fd231a42114280c5410fe1bc762, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MochieReflCube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 1 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 1 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 0 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.5 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 0 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.1 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 0.5 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0 + - _DissolveToTextureUV: 0 + - _DissolveType: 1 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 0 + - _DstBlendAlpha: 10 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 0 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 6 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 1 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 0 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 0 + - _OutlineDstBlendAlpha: 0 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 1 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 1 + - m_mainCategory: 0 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 0 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 0 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 0 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 1 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 1 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 0 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 0 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 0 + - s_start_EdgeMenu: 0 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 0 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveEndPoint: {r: 0, g: 1, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/DownCount/Stand.mat.meta b/Assets/Quiz/Materials/DownCount/Stand.mat.meta new file mode 100644 index 0000000..9e06d33 --- /dev/null +++ b/Assets/Quiz/Materials/DownCount/Stand.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50a00808aba6c2c488f11f4b0baff9eb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Models/DownCount/Clock.fbx b/Assets/Quiz/Models/DownCount/Clock.fbx index 81a64b3..c6dd5b8 100644 Binary files a/Assets/Quiz/Models/DownCount/Clock.fbx and b/Assets/Quiz/Models/DownCount/Clock.fbx differ diff --git a/Assets/Quiz/Models/DownCount/ClockHand.fbx b/Assets/Quiz/Models/DownCount/ClockHand.fbx index 60edfb2..73d9363 100644 Binary files a/Assets/Quiz/Models/DownCount/ClockHand.fbx and b/Assets/Quiz/Models/DownCount/ClockHand.fbx differ diff --git a/Assets/Quiz/Models/DownCount/ClockHand.fbx.meta b/Assets/Quiz/Models/DownCount/ClockHand.fbx.meta index efb5b79..9d73d6a 100644 --- a/Assets/Quiz/Models/DownCount/ClockHand.fbx.meta +++ b/Assets/Quiz/Models/DownCount/ClockHand.fbx.meta @@ -48,7 +48,7 @@ ModelImporter: nodeNameCollisionStrategy: 1 fileIdsGeneration: 2 swapUVChannels: 0 - generateSecondaryUV: 0 + generateSecondaryUV: 1 useFileUnits: 1 keepQuads: 0 weldVertices: 1 diff --git a/Assets/Quiz/Models/DownCount/Floor.fbx b/Assets/Quiz/Models/DownCount/Floor.fbx index ce66267..c922f13 100644 Binary files a/Assets/Quiz/Models/DownCount/Floor.fbx and b/Assets/Quiz/Models/DownCount/Floor.fbx differ diff --git a/Assets/Quiz/Models/DownCount/Floor.fbx.meta b/Assets/Quiz/Models/DownCount/Floor.fbx.meta index d6e4b6e..7fe14e9 100644 --- a/Assets/Quiz/Models/DownCount/Floor.fbx.meta +++ b/Assets/Quiz/Models/DownCount/Floor.fbx.meta @@ -30,8 +30,7 @@ ModelImporter: animationScaleError: 0.5 animationWrapMode: 0 extraExposedTransformPaths: [] - extraUserProperties: - - '#BAKERY{"meshName":["Cylinder"],"padding":[3],"unwrapper":[0]}' + extraUserProperties: [] clipAnimations: [] isReadable: 0 meshes: @@ -49,7 +48,7 @@ ModelImporter: nodeNameCollisionStrategy: 1 fileIdsGeneration: 2 swapUVChannels: 0 - generateSecondaryUV: 1 + generateSecondaryUV: 0 useFileUnits: 1 keepQuads: 0 weldVertices: 1 diff --git a/Assets/Quiz/Models/DownCount/LetterStand.fbx b/Assets/Quiz/Models/DownCount/LetterStand.fbx new file mode 100644 index 0000000..697c061 Binary files /dev/null and b/Assets/Quiz/Models/DownCount/LetterStand.fbx differ diff --git a/Assets/Quiz/Models/DownCount/LetterStand.fbx.meta b/Assets/Quiz/Models/DownCount/LetterStand.fbx.meta new file mode 100644 index 0000000..17d668c --- /dev/null +++ b/Assets/Quiz/Models/DownCount/LetterStand.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: ed793830fbeb0c949812ce50d71b23eb +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 1 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Models/DownCount/Stand.fbx b/Assets/Quiz/Models/DownCount/Stand.fbx new file mode 100644 index 0000000..e539f01 Binary files /dev/null and b/Assets/Quiz/Models/DownCount/Stand.fbx differ diff --git a/Assets/Quiz/Models/DownCount/Stand.fbx.meta b/Assets/Quiz/Models/DownCount/Stand.fbx.meta new file mode 100644 index 0000000..6f4ee92 --- /dev/null +++ b/Assets/Quiz/Models/DownCount/Stand.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 125e0defe859bf54f9f7eed5ca462168 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Prefabs/DownCount.meta b/Assets/Quiz/Prefabs/DownCount.meta new file mode 100644 index 0000000..448a066 --- /dev/null +++ b/Assets/Quiz/Prefabs/DownCount.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5a026321f368442479fabb07276fa5d8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Prefabs/DownCount/LetterCard.prefab b/Assets/Quiz/Prefabs/DownCount/LetterCard.prefab new file mode 100644 index 0000000..d78665a --- /dev/null +++ b/Assets/Quiz/Prefabs/DownCount/LetterCard.prefab @@ -0,0 +1,519 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &841727096361682873 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 345541844055757684} + - component: {fileID: 1008299836836558101} + - component: {fileID: 6470064145534193905} + m_Layer: 0 + m_Name: Card + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &345541844055757684 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 841727096361682873} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.25, y: 0.007353402, z: 0.25} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 176992625948006363} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!33 &1008299836836558101 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 841727096361682873} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6470064145534193905 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 841727096361682873} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f61de072c139b1046b4331e609b5ec8d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &2000358557829342357 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 176992625948006363} + - component: {fileID: 7126836771304552972} + - component: {fileID: 2185780046591466009} + - component: {fileID: 163591083243836859} + - component: {fileID: 4784992930875503610} + - component: {fileID: 2360640589464103809} + - component: {fileID: 6872897633369187201} + m_Layer: 0 + m_Name: LetterCard + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &176992625948006363 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + serializedVersion: 2 + m_LocalRotation: {x: -4.6622322e-24, y: -0, z: 0.7071069, w: 0.7071067} + m_LocalPosition: {x: -0.5833011, y: 1.7568002, z: 0.07680127} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 345541844055757684} + - {fileID: 1528227771584500144} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7126836771304552972 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1783056023, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + AllowCollisionOwnershipTransfer: 1 + ForceKinematicOnRemote: 0 +--- !u!65 &2185780046591466009 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 0.21, y: 0.01, z: 0.21} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &163591083243836859 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &4784992930875503610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1804438810, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + MomentumTransferMethod: 0 + DisallowTheft: 0 + ExactGun: {fileID: 0} + ExactGrip: {fileID: 0} + allowManipulationWhenEquipped: 0 + orientation: 0 + AutoHold: 0 + InteractionText: + UseText: Use + useEventBroadcastType: 0 + UseDownEventName: + UseUpEventName: + pickupDropEventBroadcastType: 0 + PickupEventName: + DropEventName: + ThrowVelocityBoostMinSpeed: 1 + ThrowVelocityBoostScale: 1 + currentlyHeldBy: {fileID: 0} + pickupable: 1 + proximity: 2 + version: 1 +--- !u!114 &2360640589464103809 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3433cbb3076d31b4e8629a10775bc308, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 6872897633369187201} + letterText: {fileID: 9107695317571756728} + currentLetter: + currentPoint: {fileID: 0} +--- !u!114 &6872897633369187201 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2000358557829342357} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: 64cc93137b785844886bfc947cc722a8, type: 2} + programSource: {fileID: 11400000, guid: c53b49d553e00a648aa3280ae05f8ddc, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!1 &2610636538441312849 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1528227771584500144} + - component: {fileID: 5126975562803914251} + - component: {fileID: 8528657736068468140} + - component: {fileID: 4828853696483477455} + - component: {fileID: 7656204577202503542} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1528227771584500144 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2610636538441312849} + m_LocalRotation: {x: -0.49999994, y: -0.5000004, z: 0.49999994, w: -0.49999976} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.0009999997, y: 0.0009999999, z: 0.0009999996} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 366974132030253724} + m_Father: {fileID: 176992625948006363} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 270} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0.0037} + m_SizeDelta: {x: 250, y: 250} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &5126975562803914251 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2610636538441312849} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &8528657736068468140 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2610636538441312849} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &4828853696483477455 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2610636538441312849} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &7656204577202503542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2610636538441312849} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1533785930, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + AllowFocusView: 1 +--- !u!1 &8702632401082536551 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 366974132030253724} + - component: {fileID: 777252123829200612} + - component: {fileID: 9107695317571756728} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &366974132030253724 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8702632401082536551} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.0009974471} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1528227771584500144} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0002670288, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &777252123829200612 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8702632401082536551} + m_CullTransparentMesh: 1 +--- !u!114 &9107695317571756728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8702632401082536551} + 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: A + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, 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: 319.96 + m_fontSizeBase: 319.96 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 300 + 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: 1 + 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} diff --git a/Assets/Quiz/Prefabs/DownCount/LetterCard.prefab.meta b/Assets/Quiz/Prefabs/DownCount/LetterCard.prefab.meta new file mode 100644 index 0000000..0ab985b --- /dev/null +++ b/Assets/Quiz/Prefabs/DownCount/LetterCard.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8df8fbb666a0bd64b8e8939db910ecfc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/QuizScene.unity b/Assets/Quiz/QuizScene.unity index e8f1b1e..2f6a310 100644 --- a/Assets/Quiz/QuizScene.unity +++ b/Assets/Quiz/QuizScene.unity @@ -308,6 +308,50 @@ MonoBehaviour: - 11. THE COLLEGE DROPOUT - 12. THE DARK SIDE OF THE MOON answerPoints: 1500000002000000050000000d000000020000001400000009000000040000000600000012000000000000001e000000 +--- !u!114 &11057942 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} + m_Name: QuizScene_LMA3 + m_EditorClassIdentifier: + resolution: 1024 + bitmask: 1 + id: 3 + sortingID: 3 + isImplicit: 1 + area: 0 + totalVertexCount: 0 + vertexCounter: 0 + sceneLodLevel: -1 + autoResolution: 0 + sceneName: + tag: -1 + containsTerrains: 0 + probes: 0 + mode: 1 + renderMode: 1000 + renderDirMode: 1000 + atlasPacker: 1000 + holeFilling: 0 + computeSSS: 0 + sssSamples: 16 + sssDensity: 10 + sssColor: {r: 1, g: 1, b: 1, a: 1} + sssScale: 1 + fakeShadowBias: 0 + transparentSelfShadow: 0 + flipNormal: 0 + parentName: + overridePath: + fixPos3D: 0 + voxelSize: {x: 1, y: 1, z: 1} + passedFilter: 0 --- !u!1001 &15354955 PrefabInstance: m_ObjectHideFlags: 0 @@ -374,6 +418,140 @@ Transform: m_CorrespondingSourceObject: {fileID: 1863247904194952148, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 15354955} m_PrefabAsset: {fileID: 0} +--- !u!1 &18932171 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 18932172} + - component: {fileID: 18932174} + - component: {fileID: 18932173} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &18932172 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 18932171} + 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: 453854343} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &18932173 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 18932171} + 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: Start Countdown + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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: 52.9 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + 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: 1 + 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: 20, y: 20, z: 20, w: 20} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &18932174 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 18932171} + m_CullTransparentMesh: 1 --- !u!23 &32070981 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 7547418677490389003, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -479,6 +657,77 @@ MonoBehaviour: m_EditorClassIdentifier: AllowCollisionOwnershipTransfer: 1 ForceKinematicOnRemote: 0 +--- !u!1001 &34548404 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (3) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &34548405 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 34548404} + m_PrefabAsset: {fileID: 0} +--- !u!1 &34548406 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 34548404} + m_PrefabAsset: {fileID: 0} --- !u!1 &47997570 GameObject: m_ObjectHideFlags: 0 @@ -1071,12 +1320,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 77699394} serializedVersion: 2 - m_LocalRotation: {x: -0, y: 0.70710576, z: -0, w: 0.70710784} - m_LocalPosition: {x: 6.663, y: 3.0555, z: -21.5007} + m_LocalRotation: {x: -0, y: -0.70710576, z: -0, w: 0.70710784} + m_LocalPosition: {x: -16.063046, y: 2.9555, z: -7.5992055} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 303549434} m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} --- !u!1 &81331872 GameObject: @@ -1810,6 +2059,151 @@ SkinnedMeshRenderer: m_Center: {x: 0, y: 0, z: 0} m_Extent: {x: 0, y: 0, z: 0} m_DirtyAABB: 1 +--- !u!1 &131000289 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 131000290} + - component: {fileID: 131000293} + - component: {fileID: 131000292} + - component: {fileID: 131000291} + m_Layer: 0 + m_Name: Button (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &131000290 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131000289} + 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: 140770882} + m_Father: {fileID: 1517704520} + 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, y: -161} + m_SizeDelta: {x: 320, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &131000291 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131000289} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.8584906, g: 0.29079857, b: 0.24701849, a: 1} + 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_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 131000292} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1031042355} + m_TargetAssemblyTypeName: + m_MethodName: SendCustomEvent + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: ResetLetters + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 534795305} + m_TargetAssemblyTypeName: + m_MethodName: SendCustomEvent + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: ResetLetters + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &131000292 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131000289} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 35630e38b4e5ffb40b44ec5348b4333f, type: 2} + 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + 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!222 &131000293 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131000289} + m_CullTransparentMesh: 1 --- !u!1 &132126789 stripped GameObject: m_CorrespondingSourceObject: {fileID: 2880588319250313143, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -1892,6 +2286,140 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8970773725826667200, guid: 87958fc281472354fb5c86b6da9b46fa, type: 3} m_PrefabInstance: {fileID: 139112631} m_PrefabAsset: {fileID: 0} +--- !u!1 &140770881 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 140770882} + - component: {fileID: 140770884} + - component: {fileID: 140770883} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &140770882 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140770881} + 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: 131000290} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &140770883 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140770881} + 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: CLEAR LETTERS + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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: 52.9 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + 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: 1 + 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: 20, y: 20, z: 20, w: 20} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &140770884 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140770881} + m_CullTransparentMesh: 1 --- !u!1001 &145950628 PrefabInstance: m_ObjectHideFlags: 0 @@ -2140,6 +2668,77 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 200905685} m_CullTransparentMesh: 1 +--- !u!1001 &207486948 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &207486949 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 207486948} + m_PrefabAsset: {fileID: 0} +--- !u!1 &207486950 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 207486948} + m_PrefabAsset: {fileID: 0} --- !u!1001 &213150830 PrefabInstance: m_ObjectHideFlags: 0 @@ -3029,6 +3628,77 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 689256096079544507, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 267155291} m_PrefabAsset: {fileID: 0} +--- !u!1001 &272120868 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (8) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &272120869 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 272120868} + m_PrefabAsset: {fileID: 0} +--- !u!1 &272120870 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 272120868} + m_PrefabAsset: {fileID: 0} --- !u!1 &273509086 GameObject: m_ObjectHideFlags: 0 @@ -3759,7 +4429,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 1743423422} + m_TransformParent: {fileID: 445776558} m_Modifications: - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.x @@ -3880,6 +4550,9 @@ Transform: - {fileID: 178208186} - {fileID: 1673173618} - {fileID: 1389625175} + - {fileID: 77699396} + - {fileID: 688445503} + - {fileID: 1199079631} m_Father: {fileID: 1743423422} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &304729489 @@ -4039,6 +4712,77 @@ Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: e0c20034b53a10b46a77b3bd46e1c232, type: 3} m_PrefabInstance: {fileID: 350653488} m_PrefabAsset: {fileID: 0} +--- !u!1001 &355966354 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (4) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &355966355 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 355966354} + m_PrefabAsset: {fileID: 0} +--- !u!1 &355966356 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 355966354} + m_PrefabAsset: {fileID: 0} --- !u!1 &358170787 GameObject: m_ObjectHideFlags: 0 @@ -4582,6 +5326,77 @@ GameObject: m_CorrespondingSourceObject: {fileID: 8313676601306732379, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1235844105} m_PrefabAsset: {fileID: 0} +--- !u!1001 &403863348 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (7) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &403863349 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 403863348} + m_PrefabAsset: {fileID: 0} +--- !u!1 &403863350 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 403863348} + m_PrefabAsset: {fileID: 0} --- !u!1001 &414844755 PrefabInstance: m_ObjectHideFlags: 0 @@ -5174,6 +5989,13 @@ Transform: - {fileID: 448309810} - {fileID: 593901291} - {fileID: 910520423} + - {fileID: 855597967} + - {fileID: 1625315256} + - {fileID: 2067418216} + - {fileID: 2055335469} + - {fileID: 882053294} + - {fileID: 1307231587} + - {fileID: 302151437} m_Father: {fileID: 1743423422} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &445817681 @@ -5405,7 +6227,7 @@ PrefabInstance: m_Modifications: - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_LocalScale.x - value: 1.01 + value: 1.2 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_LocalScale.y @@ -5413,7 +6235,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_LocalPosition.x - value: 2.116 + value: 0.894 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_LocalPosition.y @@ -5451,6 +6273,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -180 objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} + propertyPath: m_ConstrainProportionsScale + value: 0 + objectReference: {fileID: 0} - target: {fileID: -7511558181221131132, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_Materials.Array.data[0] value: @@ -5483,6 +6309,210 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} m_PrefabInstance: {fileID: 448309809} m_PrefabAsset: {fileID: 0} +--- !u!1 &453854342 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453854343} + - component: {fileID: 453854346} + - component: {fileID: 453854345} + - component: {fileID: 453854344} + m_Layer: 0 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &453854343 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453854342} + 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: 18932172} + m_Father: {fileID: 1517704520} + 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, y: -368} + m_SizeDelta: {x: 320, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &453854344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453854342} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0, g: 0.7493696, b: 1, a: 1} + 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_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 453854345} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 910520428} + m_TargetAssemblyTypeName: + m_MethodName: SendCustomEvent + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: StartNetworkedClock + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &453854345 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453854342} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 35630e38b4e5ffb40b44ec5348b4333f, type: 2} + 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + 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!222 &453854346 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453854342} + m_CullTransparentMesh: 1 +--- !u!1001 &456079422 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (2) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &456079423 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 456079422} + m_PrefabAsset: {fileID: 0} +--- !u!1 &456079424 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 456079422} + m_PrefabAsset: {fileID: 0} --- !u!1 &458289728 GameObject: m_ObjectHideFlags: 0 @@ -5707,6 +6737,77 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1001 &484924004 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (2) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &484924005 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 484924004} + m_PrefabAsset: {fileID: 0} +--- !u!1 &484924006 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 484924004} + m_PrefabAsset: {fileID: 0} --- !u!23 &486021627 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 3578079415854012088, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -5717,6 +6818,77 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 5629896105277814212, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1121960421} m_PrefabAsset: {fileID: 0} +--- !u!1001 &496178654 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (6) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &496178655 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 496178654} + m_PrefabAsset: {fileID: 0} +--- !u!1 &496178656 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 496178654} + m_PrefabAsset: {fileID: 0} --- !u!1001 &497102803 PrefabInstance: m_ObjectHideFlags: 0 @@ -6291,6 +7463,77 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 689256096079544507, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 286595926} m_PrefabAsset: {fileID: 0} +--- !u!1001 &513274839 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (3) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &513274840 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 513274839} + m_PrefabAsset: {fileID: 0} +--- !u!1 &513274841 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 513274839} + m_PrefabAsset: {fileID: 0} --- !u!1 &524486020 GameObject: m_ObjectHideFlags: 0 @@ -6523,6 +7766,212 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8880764824548044079, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 2086896412} m_PrefabAsset: {fileID: 0} +--- !u!1 &534795301 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 534795302} + - component: {fileID: 534795304} + - component: {fileID: 534795303} + - component: {fileID: 534795307} + - component: {fileID: 534795306} + - component: {fileID: 534795305} + - component: {fileID: 534795308} + m_Layer: 0 + m_Name: ConsonantStack + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &534795302 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.25, y: 1.757, z: -0.204} + m_LocalScale: {x: 0.21334, y: 0.21334, z: 0.21334} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2141577019} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &534795303 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 02ce03781605f3f4f85c80bfdacfbe00, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &534795304 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &534795305 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: d6ecac3cb49e00b41bd6cf241876ba41, type: 2} + programSource: {fileID: 11400000, guid: 5c3949f8e99590945884ed76b6833995, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &534795306 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 429e08c78a8672c4fb221c3c5b020643, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 534795305} + letterSpawnPoint: {fileID: 2141577019} + letterPool: {fileID: 534795308} + letters: + - B + - C + - D + - F + - G + - H + - J + - K + - L + - M + - N + - P + - Q + - R + - S + - T + - V + - W + - X + - Y + - Z + counts: 020000000300000006000000020000000300000002000000010000000100000005000000040000000800000004000000010000000900000009000000090000000100000001000000010000000100000001000000 + availableLetters: [] +--- !u!65 &534795307 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.0000002, y: 0.9999998, z: 1.0000002} + m_Center: {x: 0.0000009536743, y: -0.0000009536743, z: 0} +--- !u!114 &534795308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534795301} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 454367647, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + Pool: + - {fileID: 580279920} + - {fileID: 1554993644} + - {fileID: 484924006} + - {fileID: 34548406} + - {fileID: 878269396} + - {fileID: 613187716} + - {fileID: 730246665} + - {fileID: 1855655796} + - {fileID: 748132933} + StartPositions: [] + StartRotations: [] --- !u!1 &536439964 GameObject: m_ObjectHideFlags: 0 @@ -6955,6 +8404,77 @@ Transform: m_CorrespondingSourceObject: {fileID: 8416116645870878694, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 576108662} m_PrefabAsset: {fileID: 0} +--- !u!1001 &580279918 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &580279919 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 580279918} + m_PrefabAsset: {fileID: 0} +--- !u!1 &580279920 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 580279918} + m_PrefabAsset: {fileID: 0} --- !u!1 &581128389 GameObject: m_ObjectHideFlags: 0 @@ -7324,7 +8844,10 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: b215af399afe2f14e96c213518ac905c, type: 3} + insertIndex: -1 + addedObject: {fileID: 593901294} m_SourcePrefab: {fileID: 100100000, guid: b215af399afe2f14e96c213518ac905c, type: 3} --- !u!4 &593901291 stripped Transform: @@ -7341,6 +8864,28 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: b215af399afe2f14e96c213518ac905c, type: 3} m_PrefabInstance: {fileID: 593901290} m_PrefabAsset: {fileID: 0} +--- !u!64 &593901294 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 593901292} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 5741048166884216108, guid: b215af399afe2f14e96c213518ac905c, type: 3} --- !u!23 &599148971 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 2697018564455198238, guid: acde36bc75391a540a76c589339eeb32, type: 3} @@ -7423,6 +8968,77 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8970773725826667200, guid: 87958fc281472354fb5c86b6da9b46fa, type: 3} m_PrefabInstance: {fileID: 599447120} m_PrefabAsset: {fileID: 0} +--- !u!1001 &613187714 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (5) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &613187715 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 613187714} + m_PrefabAsset: {fileID: 0} +--- !u!1 &613187716 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 613187714} + m_PrefabAsset: {fileID: 0} --- !u!1 &614442977 GameObject: m_ObjectHideFlags: 0 @@ -7739,6 +9355,77 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 620422904} m_CullTransparentMesh: 1 +--- !u!1001 &632237518 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (1) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &632237519 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 632237518} + m_PrefabAsset: {fileID: 0} +--- !u!1 &632237520 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 632237518} + m_PrefabAsset: {fileID: 0} --- !u!1001 &633509196 PrefabInstance: m_ObjectHideFlags: 0 @@ -8165,6 +9852,38 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 7547418677490389003, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 445112381} m_PrefabAsset: {fileID: 0} +--- !u!1 &658159720 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 658159721} + m_Layer: 0 + m_Name: LetterPoints + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &658159721 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 658159720} + serializedVersion: 2 + 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: 1552660477} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &660518649 PrefabInstance: m_ObjectHideFlags: 0 @@ -8293,50 +10012,6 @@ GameObject: m_CorrespondingSourceObject: {fileID: 8313676601306732379, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1725237038} m_PrefabAsset: {fileID: 0} ---- !u!114 &664424129 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} - m_Name: QuizScene_LMA1 - m_EditorClassIdentifier: - resolution: 2048 - bitmask: 1 - id: 1 - sortingID: 1 - isImplicit: 1 - area: 0 - totalVertexCount: 0 - vertexCounter: 0 - sceneLodLevel: -1 - autoResolution: 0 - sceneName: - tag: -1 - containsTerrains: 0 - probes: 0 - mode: 1 - renderMode: 1000 - renderDirMode: 1000 - atlasPacker: 1000 - holeFilling: 0 - computeSSS: 0 - sssSamples: 16 - sssDensity: 10 - sssColor: {r: 1, g: 1, b: 1, a: 1} - sssScale: 1 - fakeShadowBias: 0 - transparentSelfShadow: 0 - flipNormal: 0 - parentName: - overridePath: - fixPos3D: 0 - voxelSize: {x: 1, y: 1, z: 1} - passedFilter: 0 --- !u!1 &679006202 GameObject: m_ObjectHideFlags: 0 @@ -8643,12 +10318,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 688445501} serializedVersion: 2 - m_LocalRotation: {x: 0.70710576, y: -0, z: -0, w: 0.7071079} - m_LocalPosition: {x: 0.5020771, y: 6.682452, z: -21.673576} + m_LocalRotation: {x: 0.0000020862656, y: -0.7071079, z: 0.70710576, w: 0.000002086272} + m_LocalPosition: {x: -9.902121, y: 6.582452, z: -7.4263654} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 303549434} m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1 &694385049 GameObject: @@ -9362,6 +11037,77 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 724766005} m_CullTransparentMesh: 1 +--- !u!1001 &730246663 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (6) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &730246664 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 730246663} + m_PrefabAsset: {fileID: 0} +--- !u!1 &730246665 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 730246663} + m_PrefabAsset: {fileID: 0} --- !u!1 &732949853 GameObject: m_ObjectHideFlags: 0 @@ -9623,6 +11369,77 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 743985170} m_CullTransparentMesh: 1 +--- !u!1001 &748132931 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (8) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &748132932 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 748132931} + m_PrefabAsset: {fileID: 0} +--- !u!1 &748132933 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 748132931} + m_PrefabAsset: {fileID: 0} --- !u!1 &752396811 GameObject: m_ObjectHideFlags: 0 @@ -10606,6 +12423,194 @@ MonoBehaviour: previewTempObjects: [] previewEnabled: 0 bakeChildLightProbeGroups: 0 +--- !u!1001 &855597966 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 445776558} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalScale.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalScale.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalScale.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalPosition.x + value: -5.5781813 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalPosition.y + value: 0.05000022 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalPosition.z + value: -17.261837 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalRotation.w + value: -0.18115735 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalRotation.x + value: -3.6395947e-23 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalRotation.y + value: 0.98345417 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalRotation.z + value: -6.8413665e-23 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 90e2c2c675ad56247b8ce0101848274e, type: 2} + - target: {fileID: 919132149155446097, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_Name + value: LetterStand + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1291548462} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1136465494} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1614335402} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1031042352} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 534795302} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1517704520} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1341759404} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 1496816131} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 658159721} + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + insertIndex: -1 + addedObject: {fileID: 855597971} + m_SourcePrefab: {fileID: 100100000, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} +--- !u!4 &855597967 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + m_PrefabInstance: {fileID: 855597966} + m_PrefabAsset: {fileID: 0} +--- !u!1 &855597968 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + m_PrefabInstance: {fileID: 855597966} + m_PrefabAsset: {fileID: 0} +--- !u!23 &855597969 stripped +MeshRenderer: + m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} + m_PrefabInstance: {fileID: 855597966} + m_PrefabAsset: {fileID: 0} +--- !u!64 &855597971 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855597968} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: -485584604646427042, guid: ed793830fbeb0c949812ce50d71b23eb, type: 3} +--- !u!114 &858469376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} + m_Name: QuizScene_LM0 + m_EditorClassIdentifier: + resolution: 2048 + bitmask: 1 + id: 0 + sortingID: 0 + isImplicit: 1 + area: 5731.99 + totalVertexCount: 0 + vertexCounter: 0 + sceneLodLevel: -1 + autoResolution: 0 + sceneName: + tag: -1 + containsTerrains: 0 + probes: 0 + mode: 1 + renderMode: 1000 + renderDirMode: 1000 + atlasPacker: 1000 + holeFilling: 0 + computeSSS: 0 + sssSamples: 16 + sssDensity: 10 + sssColor: {r: 1, g: 1, b: 1, a: 1} + sssScale: 1 + fakeShadowBias: 0 + transparentSelfShadow: 0 + flipNormal: 0 + parentName: + overridePath: + fixPos3D: 0 + voxelSize: {x: 1, y: 1, z: 1} + passedFilter: 0 --- !u!1 &861281453 GameObject: m_ObjectHideFlags: 0 @@ -10844,13 +12849,84 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 73d5da89642a53445a6bfd1c9c31386f, type: 3} m_PrefabInstance: {fileID: 874610116} m_PrefabAsset: {fileID: 0} +--- !u!1001 &878269394 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (4) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &878269395 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 878269394} + m_PrefabAsset: {fileID: 0} +--- !u!1 &878269396 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 878269394} + m_PrefabAsset: {fileID: 0} --- !u!1001 &882053293 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 1743423422} + m_TransformParent: {fileID: 445776558} m_Modifications: - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.x @@ -11405,7 +13481,25 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: ee1ce01d54aed114aa407e302147481f, type: 3} insertIndex: -1 addedObject: {fileID: 2092212185} - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ee1ce01d54aed114aa407e302147481f, type: 3} + insertIndex: -1 + addedObject: {fileID: 910520426} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ee1ce01d54aed114aa407e302147481f, type: 3} + insertIndex: -1 + addedObject: {fileID: 910520427} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ee1ce01d54aed114aa407e302147481f, type: 3} + insertIndex: -1 + addedObject: {fileID: 910520430} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ee1ce01d54aed114aa407e302147481f, type: 3} + insertIndex: -1 + addedObject: {fileID: 910520429} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ee1ce01d54aed114aa407e302147481f, type: 3} + insertIndex: -1 + addedObject: {fileID: 910520428} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ee1ce01d54aed114aa407e302147481f, type: 3} + insertIndex: -1 + addedObject: {fileID: 910520432} m_SourcePrefab: {fileID: 100100000, guid: ee1ce01d54aed114aa407e302147481f, type: 3} --- !u!4 &910520423 stripped Transform: @@ -11422,6 +13516,211 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: ee1ce01d54aed114aa407e302147481f, type: 3} m_PrefabInstance: {fileID: 910520422} m_PrefabAsset: {fileID: 0} +--- !u!65 &910520426 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910520424} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.0762191, y: 4.332013, z: 2.4366357} + m_Center: {x: 0.0000346601, y: 1.6660064, z: 0.000000834465} +--- !u!95 &910520427 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910520424} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: f771b5b5b4575104180bfd588828c309, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &910520428 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910520424} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: 51da5675278beaa4c9d5412e3c2f1ad3, type: 2} + programSource: {fileID: 11400000, guid: 4a11243f2a6c0254187bde32bd2a8f41, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &910520429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910520424} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3a15e8be20e3b5c41ba4cec8b8430f71, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 910520428} + clockAnimator: {fileID: 910520427} + clockAudioSource: {fileID: 910520430} +--- !u!82 &910520430 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910520424} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: 135849770b7f9b54093c9691d5ef5ee8, type: 3} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &910520432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910520424} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -617992517, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + Gain: 10 + Far: 80 + Near: 0 + VolumetricRadius: 0 + EnableSpatialization: 0 + UseAudioSourceVolumeCurve: 0 --- !u!23 &924447930 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 7547418677490389003, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -12966,6 +15265,196 @@ GameObject: m_CorrespondingSourceObject: {fileID: 100590131341888120, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 3663352991328551858} m_PrefabAsset: {fileID: 0} +--- !u!1 &1031042351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1031042352} + - component: {fileID: 1031042354} + - component: {fileID: 1031042353} + - component: {fileID: 1031042357} + - component: {fileID: 1031042356} + - component: {fileID: 1031042355} + - component: {fileID: 1031042358} + m_Layer: 0 + m_Name: VowelStack + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1031042352 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.25, y: 1.7568, z: 0.2039} + m_LocalScale: {x: 0.21334, y: 0.21334, z: 0.21334} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1852770479} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1031042353 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 02ce03781605f3f4f85c80bfdacfbe00, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1031042354 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &1031042355 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: d6ecac3cb49e00b41bd6cf241876ba41, type: 2} + programSource: {fileID: 11400000, guid: 5c3949f8e99590945884ed76b6833995, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &1031042356 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 429e08c78a8672c4fb221c3c5b020643, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1031042355} + letterSpawnPoint: {fileID: 1852770479} + letterPool: {fileID: 1031042358} + letters: + - A + - E + - I + - O + - U + counts: 0f000000150000000d0000000d00000005000000 + availableLetters: [] +--- !u!65 &1031042357 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.0000002, y: 0.9999998, z: 1.0000002} + m_Center: {x: -0.000002861023, y: -0.0000009536743, z: 0.0000076293945} +--- !u!114 &1031042358 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1031042351} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 454367647, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + Pool: + - {fileID: 207486950} + - {fileID: 632237520} + - {fileID: 456079424} + - {fileID: 513274841} + - {fileID: 355966356} + - {fileID: 1153384511} + - {fileID: 496178656} + - {fileID: 403863350} + - {fileID: 272120870} + StartPositions: [] + StartRotations: [] --- !u!1 &1032527760 GameObject: m_ObjectHideFlags: 0 @@ -13519,6 +16008,50 @@ AudioSource: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 +--- !u!114 &1059461164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} + m_Name: QuizScene_LMA1 + m_EditorClassIdentifier: + resolution: 2048 + bitmask: 1 + id: 1 + sortingID: 1 + isImplicit: 1 + area: 0 + totalVertexCount: 0 + vertexCounter: 0 + sceneLodLevel: -1 + autoResolution: 0 + sceneName: + tag: -1 + containsTerrains: 0 + probes: 0 + mode: 1 + renderMode: 1000 + renderDirMode: 1000 + atlasPacker: 1000 + holeFilling: 0 + computeSSS: 0 + sssSamples: 16 + sssDensity: 10 + sssColor: {r: 1, g: 1, b: 1, a: 1} + sssScale: 1 + fakeShadowBias: 0 + transparentSelfShadow: 0 + flipNormal: 0 + parentName: + overridePath: + fixPos3D: 0 + voxelSize: {x: 1, y: 1, z: 1} + passedFilter: 0 --- !u!1 &1063988526 GameObject: m_ObjectHideFlags: 0 @@ -14452,11 +16985,198 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8880764824548044079, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1235844105} m_PrefabAsset: {fileID: 0} +--- !u!1 &1136465493 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1136465494} + - component: {fileID: 1136465498} + - component: {fileID: 1136465497} + - component: {fileID: 1136465496} + - component: {fileID: 1136465495} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1136465494 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136465493} + m_LocalRotation: {x: 3.308722e-24, y: 0.7071061, z: 1.952146e-22, w: 0.7071075} + m_LocalPosition: {x: 0, y: 0, z: 0.9091} + m_LocalScale: {x: 0.0009999997, y: 0.001, z: 0.0009999997} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1351573131} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.3938, y: 1.802} + m_SizeDelta: {x: 859.21, y: 261.9} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1136465495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136465493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1533785930, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + AllowFocusView: 1 +--- !u!114 &1136465496 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136465493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1136465497 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136465493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1136465498 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136465493} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!224 &1148097379 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 4190840084691999592, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1235844105} m_PrefabAsset: {fileID: 0} +--- !u!1001 &1153384509 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1341759404} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (5) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &1153384510 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 1153384509} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1153384511 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 1153384509} + m_PrefabAsset: {fileID: 0} --- !u!1001 &1158088443 PrefabInstance: m_ObjectHideFlags: 0 @@ -15216,50 +17936,6 @@ GameObject: m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} m_PrefabInstance: {fileID: 1378939246} m_PrefabAsset: {fileID: 0} ---- !u!114 &1194338542 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} - m_Name: QuizScene_LMA3 - m_EditorClassIdentifier: - resolution: 1024 - bitmask: 1 - id: 3 - sortingID: 3 - isImplicit: 1 - area: 0 - totalVertexCount: 0 - vertexCounter: 0 - sceneLodLevel: -1 - autoResolution: 0 - sceneName: - tag: -1 - containsTerrains: 0 - probes: 0 - mode: 1 - renderMode: 1000 - renderDirMode: 1000 - atlasPacker: 1000 - holeFilling: 0 - computeSSS: 0 - sssSamples: 16 - sssDensity: 10 - sssColor: {r: 1, g: 1, b: 1, a: 1} - sssScale: 1 - fakeShadowBias: 0 - transparentSelfShadow: 0 - flipNormal: 0 - parentName: - overridePath: - fixPos3D: 0 - voxelSize: {x: 1, y: 1, z: 1} - passedFilter: 0 --- !u!1001 &1196589733 PrefabInstance: m_ObjectHideFlags: 0 @@ -15343,6 +18019,73 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 2f5faf56eef0ad748ad331a95b4b2abc, type: 3} m_PrefabInstance: {fileID: 1196589733} m_PrefabAsset: {fileID: 0} +--- !u!1 &1199079630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1199079631} + - component: {fileID: 1199079632} + m_Layer: 0 + m_Name: SpotLight (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1199079631 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199079630} + serializedVersion: 2 + m_LocalRotation: {x: 0.09728082, y: -0.7198915, z: 0.64451164, w: -0.23853202} + m_LocalPosition: {x: -7.814, y: 7.832452, z: -11.243992} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 303549434} + m_LocalEulerAnglesHint: {x: 118.17, y: -83.259, z: 108.562} +--- !u!114 &1199079632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199079630} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 57f24a4aaa0761b45ba25e7e5108e2c7, type: 3} + m_Name: + m_EditorClassIdentifier: + UID: 1343850227 + color: {r: 0.990566, g: 0.92113924, b: 0.7803044, a: 1} + intensity: 2 + shadowSpread: 0.05 + cutoff: 40 + realisticFalloff: 0 + legacySampling: 1 + samples: 8 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 70.7 + innerAngle: 0 + cubemap: {fileID: 0} + iesFile: {fileID: 0} + bitmask: 1 + bakeToIndirect: 0 + shadowmask: 0 + shadowmaskFalloff: 0 + indirectIntensity: 1 + falloffMinRadius: 1 + shadowmaskGroupID: 0 + directionMode: 0 + maskChannel: -1 --- !u!23 &1200045625 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 3578079415854012088, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -17325,6 +20068,172 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 3578079415854012088, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1235844105} m_PrefabAsset: {fileID: 0} +--- !u!1001 &1291548461 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 855597967} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalScale.x + value: 2 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalScale.z + value: 2 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5000006 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalPosition.y + value: 0.3574594 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalPosition.z + value: -3.693755e-23 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalRotation.x + value: 6.123251e-17 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalRotation.y + value: 0.0000030249353 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalRotation.z + value: 6.123216e-17 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -159.125 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 50a00808aba6c2c488f11f4b0baff9eb, type: 2} + - target: {fileID: 919132149155446097, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_Name + value: LetterStand + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + propertyPath: m_StaticEditorFlags + value: 2147483647 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + insertIndex: -1 + addedObject: {fileID: 1291548466} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + insertIndex: -1 + addedObject: {fileID: 1291548465} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + insertIndex: -1 + addedObject: {fileID: 1291548468} + m_SourcePrefab: {fileID: 100100000, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} +--- !u!4 &1291548462 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + m_PrefabInstance: {fileID: 1291548461} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1291548463 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + m_PrefabInstance: {fileID: 1291548461} + m_PrefabAsset: {fileID: 0} +--- !u!23 &1291548464 stripped +MeshRenderer: + m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} + m_PrefabInstance: {fileID: 1291548461} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1291548465 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1291548463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: b8ffdfb4e1a952e44b4e632879e38929, type: 2} + programSource: {fileID: 11400000, guid: f9280f40c34dba44d856803aa60215d7, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &1291548466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1291548463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1acc8aa2b2f0afe47a95123c7a80d4bb, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1291548465} +--- !u!64 &1291548468 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1291548463} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: -7387706064836869012, guid: 125e0defe859bf54f9f7eed5ca462168, type: 3} --- !u!1001 &1299859832 PrefabInstance: m_ObjectHideFlags: 0 @@ -17467,7 +20376,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 1743423422} + m_TransformParent: {fileID: 445776558} m_Modifications: - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.x @@ -17793,9 +20702,9 @@ MonoBehaviour: renderSettingsRTPVExport: 1 renderSettingsRTPVSceneView: 1 renderSettingsRTPVHDR: 0 - renderSettingsRTPVWidth: 1645 + renderSettingsRTPVWidth: 1655 renderSettingsRTPVHeight: 901 - lastBakeTime: 45 + lastBakeTime: 46 enlightenWarningShown: 0 enlightenWarningShown2: 0 uniqueLights: @@ -17808,32 +20717,33 @@ MonoBehaviour: - {fileID: 1246946031} - {fileID: 1432026712} - {fileID: 1983330141} - - {fileID: 688445501} + - {fileID: 663255357} - {fileID: 1673173617} - {fileID: 1561780499} - {fileID: 1389625174} - {fileID: 1366527141} + - {fileID: 1199079630} - {fileID: 1028628261} - {fileID: 983561334} - {fileID: 721237959} - {fileID: 697177925} + - {fileID: 688445501} - {fileID: 565587541} - {fileID: 445817681} - {fileID: 178208185} - - {fileID: 1780240771} - - {fileID: 139112633} - - {fileID: 2005781144} - - {fileID: 402041232} - - {fileID: 970991428} - - {fileID: 446262698} - - {fileID: 1773291424} - - {fileID: 1417368005} - - {fileID: 284328717} - - {fileID: 289797912} - - {fileID: 992013953} - - {fileID: 663255357} - {fileID: 77699394} + - {fileID: 1417368005} + - {fileID: 992013953} + - {fileID: 1773291424} - {fileID: 599447122} + - {fileID: 139112633} + - {fileID: 446262698} + - {fileID: 2005781144} + - {fileID: 289797912} + - {fileID: 970991428} + - {fileID: 284328717} + - {fileID: 402041232} + - {fileID: 1780240771} - {fileID: 1826036082} lights: - tform: @@ -18116,25 +21026,25 @@ MonoBehaviour: angle: 30 UID: 9 - tform: - e00: 1 - e01: 0 - e02: 0 - e03: 0.5020771 - e10: 0 - e11: 0.0000029206276 - e12: -1.0000001 - e13: 6.682452 - e20: 0 - e21: 1.0000001 - e22: 0.0000029206276 - e23: -21.673576 + e00: 0.98817784 + e01: 0.0000006631017 + e02: -0.15331212 + e03: 32 + e10: -0.15331212 + e11: 0.0000035325672 + e12: -0.9881778 + e13: 4.18 + e20: -0.00000011508513 + e21: 1 + e22: 0.0000035912794 + e23: 5.4999995 e30: 0 e31: 0 e32: 0 e33: 1 color: {r: 1, g: 1, b: 1, a: 1} - intensity: 3 - range: 60 + intensity: 1 + range: 50 radius: 0.05 samples: 8 samples2: 0 @@ -18144,7 +21054,7 @@ MonoBehaviour: realisticFalloff: 0 projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 40 + angle: 90 UID: 10 - tform: e00: 1 @@ -18270,6 +21180,37 @@ MonoBehaviour: cookie: {fileID: 0} angle: 30 UID: 14 + - tform: + e00: 0.86727667 + e01: -0.16741581 + e02: -0.46883193 + e03: -1.5860658 + e10: -0.4475366 + e11: 0.15028238 + e12: -0.8815477 + e13: 7.932452 + e20: 0.2180422 + e21: 0.97436506 + e22: 0.05541179 + e23: -17.855963 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 0.990566, g: 0.92113924, b: 0.7803044, a: 1} + intensity: 2 + range: 40 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 70.7 + UID: 15 - tform: e00: 1 e01: 0 @@ -18300,7 +21241,7 @@ MonoBehaviour: projMode: 0 cookie: {fileID: 0} angle: 30 - UID: 15 + UID: 16 - tform: e00: 0.17787397 e01: 0.9092562 @@ -18331,7 +21272,7 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 44.9 - UID: 16 + UID: 17 - tform: e00: 0.72713447 e01: 0.64950275 @@ -18362,7 +21303,7 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 62 - UID: 17 + UID: 18 - tform: e00: 1 e01: 0 @@ -18393,7 +21334,38 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 90 - UID: 18 + UID: 19 + - tform: + e00: 1.0000002 + e01: -4.5474735e-13 + e02: -1.0302835e-12 + e03: 0.5020771 + e10: 0 + e11: 0.0000029206276 + e12: -1.0000001 + e13: 6.682452 + e20: 4.5474735e-13 + e21: 1.0000001 + e22: 0.0000032186508 + e23: -21.673576 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 3 + range: 60 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 40 + UID: 20 - tform: e00: 0.9999999 e01: 0 @@ -18424,7 +21396,7 @@ MonoBehaviour: projMode: 0 cookie: {fileID: 0} angle: 30 - UID: 19 + UID: 21 - tform: e00: 0.72713447 e01: 0.64950275 @@ -18455,7 +21427,7 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 62 - UID: 20 + UID: 22 - tform: e00: 1 e01: 0 @@ -18486,89 +21458,27 @@ MonoBehaviour: projMode: 0 cookie: {fileID: 0} angle: 30 - UID: 21 + UID: 23 - tform: - e00: 1 + e00: 0.0000029802313 e01: 0 - e02: 0 - e03: -23.075 + e02: 1 + e03: 6.663 e10: 0 e11: 1 e12: 0 - e13: 2.1 - e20: 0 + e13: 3.0555 + e20: -1 e21: 0 - e22: 1 - e23: 11.920195 + e22: 0.0000029802313 + e23: -21.5007 e30: 0 e31: 0 e32: 0 e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 10 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 0 - cookie: {fileID: 0} - angle: 30 - UID: 22 - - tform: - e00: -1 - e01: -1.1524945e-12 - e02: 0.000006079673 - e03: -10.727383 - e10: -6.960978e-13 - e11: 1 - e12: 0.000000075498264 - e13: 7.1000004 - e20: -0.000006079673 - e21: 0.00000007549826 - e22: -1 - e23: -15.100008 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 10 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 0 - cookie: {fileID: 0} - angle: 30 - UID: 23 - - tform: - e00: 1 - e01: 0 - e02: 0 - e03: 8 - e10: 0 - e11: 0.0000029961254 - e12: -1.0000001 - e13: 8 - e20: 0 - e21: 1.0000001 - e22: 0.0000029961254 - e23: 5.4999995 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 50 + color: {r: 0.9245283, g: 0.872153, b: 0.745728, a: 1} + intensity: 2 + range: 20 radius: 0.05 samples: 8 samples2: 0 @@ -18578,132 +21488,8 @@ MonoBehaviour: realisticFalloff: 0 projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 90 + angle: 179 UID: 24 - - tform: - e00: 1 - e01: 0 - e02: 0 - e03: -16 - e10: 0 - e11: 0.0000029961254 - e12: -1.0000001 - e13: 8 - e20: 0 - e21: 1.0000001 - e22: 0.0000029961254 - e23: 5.4999995 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 50 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 1 - cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 90 - UID: 25 - - tform: - e00: 0.993534 - e01: -0.0000003501773 - e02: 0.11353491 - e03: 24 - e10: 0.11353491 - e11: 0.0000031749394 - e12: -0.993534 - e13: 6.81 - e20: -0.000000019747517 - e21: 1 - e22: 0.0000031744512 - e23: 5.4999995 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 50 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 1 - cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 90 - UID: 26 - - tform: - e00: 1 - e01: 0 - e02: 0 - e03: -20 - e10: 0 - e11: 0.0000029961254 - e12: -1.0000001 - e13: 8 - e20: 0 - e21: 1.0000001 - e22: 0.0000029961254 - e23: -12.5 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 50 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 1 - cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 90 - UID: 27 - - tform: - e00: 1 - e01: 0 - e02: 0 - e03: -24 - e10: 0 - e11: 0.0000029961254 - e12: -1.0000001 - e13: 8 - e20: 0 - e21: 1.0000001 - e22: 0.0000029961254 - e23: 5.4999995 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 50 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 1 - cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 90 - UID: 28 - tform: e00: 1 e01: 0 @@ -18734,69 +21520,7 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 90 - UID: 29 - - tform: - e00: 0.0000030994415 - e01: 3.055326e-13 - e02: -1 - e03: -13.500001 - e10: -2.629008e-13 - e11: 1 - e12: 3.1240578e-13 - e13: 1.6000004 - e20: 1 - e21: 2.629008e-13 - e22: 0.0000030994415 - e23: -9.322601 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 10 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 0 - cookie: {fileID: 0} - angle: 30 - UID: 30 - - tform: - e00: 1 - e01: 0 - e02: 0 - e03: -8 - e10: 0 - e11: 0.0000029961254 - e12: -1.0000001 - e13: 8 - e20: 0 - e21: 1.0000001 - e22: 0.0000029961254 - e23: 5.4999995 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 1, g: 1, b: 1, a: 1} - intensity: 1 - range: 50 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 1 - cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 90 - UID: 31 + UID: 25 - tform: e00: 1 e01: 0 @@ -18827,19 +21551,19 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 90 - UID: 32 + UID: 26 - tform: - e00: 0.98817784 - e01: 0.0000006631017 - e02: -0.15331212 - e03: 32 - e10: -0.15331212 - e11: 0.0000035325672 - e12: -0.9881778 - e13: 4.18 - e20: -0.00000011508513 - e21: 1 - e22: 0.0000035912794 + e00: 1 + e01: 0 + e02: 0 + e03: -24 + e10: 0 + e11: 0.0000029961254 + e12: -1.0000001 + e13: 8 + e20: 0 + e21: 1.0000001 + e22: 0.0000029961254 e23: 5.4999995 e30: 0 e31: 0 @@ -18858,38 +21582,7 @@ MonoBehaviour: projMode: 1 cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} angle: 90 - UID: 33 - - tform: - e00: 0.0000029206276 - e01: 0 - e02: 1 - e03: 6.663 - e10: 0 - e11: 1 - e12: 0 - e13: 3.0555 - e20: -1 - e21: 0 - e22: 0.0000029206276 - e23: -21.5007 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - color: {r: 0.9245283, g: 0.872153, b: 0.745728, a: 1} - intensity: 2 - range: 20 - radius: 0.05 - samples: 8 - samples2: 0 - bitmask: 0 - bakeToIndirect: 0 - selfShadow: 0 - realisticFalloff: 0 - projMode: 1 - cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} - angle: 179 - UID: 34 + UID: 27 - tform: e00: -1 e01: -1.1524945e-12 @@ -18920,7 +21613,255 @@ MonoBehaviour: projMode: 0 cookie: {fileID: 0} angle: 30 + UID: 28 + - tform: + e00: -1 + e01: -1.1524945e-12 + e02: 0.000006079673 + e03: -10.727383 + e10: -6.960978e-13 + e11: 1 + e12: 0.000000075498264 + e13: 7.1000004 + e20: -0.000006079673 + e21: 0.00000007549826 + e22: -1 + e23: -15.100008 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 10 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 0 + cookie: {fileID: 0} + angle: 30 + UID: 29 + - tform: + e00: 1 + e01: 0 + e02: 0 + e03: -20 + e10: 0 + e11: 0.0000029961254 + e12: -1.0000001 + e13: 8 + e20: 0 + e21: 1.0000001 + e22: 0.0000029961254 + e23: -12.5 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 50 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 90 + UID: 30 + - tform: + e00: 1 + e01: 0 + e02: 0 + e03: 8 + e10: 0 + e11: 0.0000029961254 + e12: -1.0000001 + e13: 8 + e20: 0 + e21: 1.0000001 + e22: 0.0000029961254 + e23: 5.4999995 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 50 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 90 + UID: 31 + - tform: + e00: 1 + e01: 0 + e02: 0 + e03: -8 + e10: 0 + e11: 0.0000029961254 + e12: -1.0000001 + e13: 8 + e20: 0 + e21: 1.0000001 + e22: 0.0000029961254 + e23: 5.4999995 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 50 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 90 + UID: 32 + - tform: + e00: 0.993534 + e01: -0.0000003501773 + e02: 0.11353491 + e03: 24 + e10: 0.11353491 + e11: 0.0000031749394 + e12: -0.993534 + e13: 6.81 + e20: -0.000000019747517 + e21: 1 + e22: 0.0000031744512 + e23: 5.4999995 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 50 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 90 + UID: 33 + - tform: + e00: 0.0000030994415 + e01: 3.055326e-13 + e02: -1 + e03: -13.500001 + e10: -2.629008e-13 + e11: 1 + e12: 3.1240578e-13 + e13: 1.6000004 + e20: 1 + e21: 2.629008e-13 + e22: 0.0000030994415 + e23: -9.322601 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 10 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 0 + cookie: {fileID: 0} + angle: 30 + UID: 34 + - tform: + e00: 1 + e01: 0 + e02: 0 + e03: -16 + e10: 0 + e11: 0.0000029961254 + e12: -1.0000001 + e13: 8 + e20: 0 + e21: 1.0000001 + e22: 0.0000029961254 + e23: 5.4999995 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 50 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 1 + cookie: {fileID: 2800000, guid: 3a66602b8cc7fdd4ab57d07b4176432b, type: 3} + angle: 90 UID: 35 + - tform: + e00: 1 + e01: 0 + e02: 0 + e03: -23.075 + e10: 0 + e11: 1 + e12: 0 + e13: 2.1 + e20: 0 + e21: 0 + e22: 1 + e23: 11.920195 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + color: {r: 1, g: 1, b: 1, a: 1} + intensity: 1 + range: 10 + radius: 0.05 + samples: 8 + samples2: 0 + bitmask: 0 + bakeToIndirect: 0 + selfShadow: 0 + realisticFalloff: 0 + projMode: 0 + cookie: {fileID: 0} + angle: 30 + UID: 36 - tform: e00: 1 e01: 0 @@ -18951,46 +21892,56 @@ MonoBehaviour: projMode: 0 cookie: {fileID: 0} angle: 30 - UID: 36 + UID: 37 implicitGroups: - - {fileID: 2136442879} - - {fileID: 2136442879} - - {fileID: 664424129} - - {fileID: 1495929848} - - {fileID: 664424129} - - {fileID: 2136442879} - - {fileID: 664424129} - - {fileID: 664424129} - - {fileID: 1194338542} - - {fileID: 664424129} - - {fileID: 664424129} - - {fileID: 664424129} - - {fileID: 664424129} - - {fileID: 664424129} + - {fileID: 858469376} + - {fileID: 858469376} + - {fileID: 1059461164} + - {fileID: 1905512160} + - {fileID: 858469376} + - {fileID: 1059461164} + - {fileID: 858469376} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 858469376} + - {fileID: 11057942} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 1059461164} + - {fileID: 858469376} implicitGroupedObjects: - {fileID: 88149416} - {fileID: 139112634} - {fileID: 302151438} - {fileID: 448309811} + - {fileID: 534795301} - {fileID: 593901292} - {fileID: 599447123} + - {fileID: 855597968} - {fileID: 882053295} - {fileID: 910520424} + - {fileID: 1031042351} - {fileID: 1185645801} + - {fileID: 1291548463} - {fileID: 1307231588} - {fileID: 1625315257} - {fileID: 1851354688} - {fileID: 2055335470} - {fileID: 2067418217} + - {fileID: 2092212186} bounds: - m_Center: {x: -1.0002375, y: 4.049999, z: -21.49999} m_Extent: {x: 9.900268, y: 3.9499998, z: 7.500059} - - m_Center: {x: 1.599957, y: 2.3910067, z: -21.599934} - m_Extent: {x: 7.4000435, y: 2.1910067, z: 7.4000435} - - m_Center: {x: 1.9088712, y: 5.800132, z: -21.598242} - m_Extent: {x: 7.1201906, y: 2.5000038, z: 7.4840517} - - m_Center: {x: 1.5899221, y: 2.8001318, z: -21.59509} - m_Extent: {x: 7.049694, y: 2.5000038, z: 7.409952} + - m_Center: {x: 0.099957466, y: 2.3910067, z: -21.599945} + m_Extent: {x: 8.6176405, y: 2.1910067, z: 7.400051} + - m_Center: {x: 0.6479061, y: 5.800132, z: -21.598242} + m_Extent: {x: 8.459624, y: 2.5000038, z: 7.4840593} + - m_Center: {x: 0.53890616, y: 2.8001318, z: -21.59509} + m_Extent: {x: 8.459624, y: 2.5000038, z: 7.4099603} hasEmissive: 01010101 uvBuffOffsets: uvBuffLengths: @@ -19232,16 +22183,21 @@ MonoBehaviour: - {fileID: 139112635} - {fileID: 302151439} - {fileID: 448309812} + - {fileID: 534795303} - {fileID: 593901293} - {fileID: 599447124} + - {fileID: 855597969} - {fileID: 882053296} - {fileID: 910520425} + - {fileID: 1031042353} - {fileID: 1378939248} + - {fileID: 1291548464} - {fileID: 1307231589} - {fileID: 1625315258} - {fileID: 1851354689} - {fileID: 2055335471} - {fileID: 2067418218} + - {fileID: 2092212187} - {fileID: 267155293} - {fileID: 85469504} - {fileID: 1641041690} @@ -19402,22 +22358,27 @@ MonoBehaviour: - {fileID: 1559809794} - {fileID: 898508166} - {fileID: 1636968102} - bakedIDs: 000000000000000001000000020000000100000000000000010000000100000003000000010000000100000001000000010000000100000005000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000050000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000070000000700000007000000080000000800000007000000080000000800000008000000070000000700000007000000080000000700000008000000080000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000080000000700000008000000080000000800000008000000080000000700000008000000070000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000070000000800000007000000080000000800000008000000080000000700000008000000070000000700000008000000070000000800000008000000080000000700000007000000070000000700000007000000070000000700000008000000080000000700000007000000070000000800000007000000070000000700000007000000070000000700000008000000080000000800000007000000070000000800000007000000070000000700000008000000070000000700000008000000070000000700000007000000070000000700000007000000080000000700000007000000080000000800000008000000070000000700000007000000070000000800000008000000 + bakedIDs: 0000000000000000010000000200000000000000010000000000000001000000010000000100000000000000030000000100000001000000010000000100000001000000010000000000000005000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000050000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000070000000700000007000000080000000800000007000000080000000800000008000000070000000700000007000000080000000700000008000000080000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000080000000700000008000000080000000800000008000000080000000700000008000000070000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000070000000800000007000000080000000800000008000000080000000700000008000000070000000700000008000000070000000800000008000000080000000700000007000000070000000700000007000000070000000700000008000000080000000700000007000000070000000800000007000000070000000700000007000000070000000700000008000000080000000800000007000000070000000800000007000000070000000700000008000000070000000700000008000000070000000700000007000000070000000700000007000000080000000700000007000000080000000800000008000000070000000700000007000000070000000800000008000000 bakedScaleOffset: - - {x: 0.9763147, y: 0.97625685, z: -0.00041782347, w: -0.0004177105} - - {x: 0.01752652, y: 0.017472332, z: 0.96237993, w: 0.00056764873} - - {x: 0.07570291, y: 0.075702794, z: 0.24777927, w: 0.68150604} - - {x: 1.0012718, y: 1.0013535, z: -0.0004162471, w: -0.00041648623} - - {x: 0.24445435, y: 0.24413465, z: 0.0009855471, w: 0.6027217} - - {x: 0.01752649, y: 0.017472303, z: 0.9814724, w: 0.0005676503} - - {x: 0.07570294, y: 0.07570282, z: 0.4046089, w: 0.60309446} - - {x: 0.17672753, y: 0.17673127, z: -0.00079548685, w: 0.8232806} + - {x: 0.9730492, y: 0.9729915, z: -0.00041642596, w: -0.00041631336} + - {x: 0.0174679, y: 0.017413892, z: 0.9785463, w: 0.0005657501} + - {x: 0.07561162, y: 0.0756115, z: 0.92303455, w: 0.48453307} + - {x: 1.0015688, y: 1.0016457, z: -0.00056225393, w: -0.0005624791} + - {x: 0.019549854, y: 0.017965171, z: 0.9790315, w: 0.02375117} + - {x: 0.24415956, y: 0.24384025, z: 0.66864365, w: 0.0009825442} + - {x: 0.01746787, y: 0.017413862, z: 0.95916104, w: 0.022905722} + - {x: 0.18299559, y: 0.18301189, z: 0.6670376, w: 0.2214482} + - {x: 0.07561165, y: 0.07561153, z: 0.8447143, w: 0.4062161} + - {x: 0.17656036, y: 0.17655683, z: 0.6670387, w: 0.40424064} + - {x: 0.01954985, y: 0.017965168, z: 0.9600029, w: 0.042466655} - {x: 1.0196207, y: 1.0034717, z: -0.0015223261, w: -0.0014750147} - - {x: 0.075702935, y: 0.075702816, z: 0.4830237, w: 0.60309446} - - {x: 0.07570295, y: 0.07570283, z: 0.32619408, w: 0.60309446} - - {x: 0.6093728, y: 0.6093729, z: -0.00031559673, w: -0.000315597} - - {x: 0.07570296, y: 0.07570284, z: 0.24777927, w: 0.60309446} - - {x: 0.075702906, y: 0.07570279, z: 0.24777927, w: 0.75991756} + - {x: 0.14412759, y: 0.14409794, z: 0.8509251, w: 0.222097} + - {x: 0.07561164, y: 0.075611524, z: 0.9230346, w: 0.4062161} + - {x: 0.07561166, y: 0.07561154, z: 0.91513985, w: 0.07967188} + - {x: 0.66713893, y: 0.6670383, z: 0.00026178654, w: 0.00026395655} + - {x: 0.075611666, y: 0.07561155, z: 0.91513985, w: 0.0013548852} + - {x: 0.075611636, y: 0.07561152, z: 0.8447143, w: 0.48453307} + - {x: 0.022674289, y: 0.023216473, z: 0.9576273, w: -0.0010295087} - {x: 0.2702117, y: 0.2701885, z: -0.008445248, w: 0.7324447} - {x: 0.12100871, y: 0.12103219, z: 0.119270645, w: 0.8086851} - {x: 0.080332674, y: 0.08031833, z: 0.23948325, w: 0.8887358} @@ -19578,7 +22539,7 @@ MonoBehaviour: - {x: 0.004597126, y: 0.0045971265, z: 0.9927896, w: 0.3835466} - {x: 0.02904657, y: 0.029059397, z: 0.057081953, w: 0.97083664} - {x: 0.24484934, y: 0.24514647, z: -0.00022089905, w: 0.72809863} - bakedVertexOffset: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + bakedVertexOffset: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff bakedVertexColorMesh: - {fileID: 0} - {fileID: 0} @@ -19754,6 +22715,11 @@ MonoBehaviour: - {fileID: 0} - {fileID: 0} - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} nonBakedRenderers: [] bakedLights: [] bakedLightChannels: @@ -19786,20 +22752,25 @@ MonoBehaviour: rnmMaps2: [] mapsMode: bakedRenderers: - - {fileID: 2055335471} - - {fileID: 882053296} - - {fileID: 302151439} - - {fileID: 1625315258} - - {fileID: 2067418218} - - {fileID: 1307231589} - {fileID: 88149417} - {fileID: 139112635} + - {fileID: 302151439} - {fileID: 448309812} + - {fileID: 534795303} - {fileID: 593901293} - {fileID: 599447124} + - {fileID: 855597969} + - {fileID: 882053296} - {fileID: 910520425} + - {fileID: 1031042353} - {fileID: 1378939248} + - {fileID: 1291548464} + - {fileID: 1307231589} + - {fileID: 1625315258} - {fileID: 1851354689} + - {fileID: 2055335471} + - {fileID: 2067418218} + - {fileID: 2092212187} - {fileID: 267155293} - {fileID: 85469504} - {fileID: 1641041690} @@ -19960,22 +22931,27 @@ MonoBehaviour: - {fileID: 1559809794} - {fileID: 898508166} - {fileID: 1636968102} - bakedIDs: 010000000100000001000000010000000100000001000000000000000000000002000000010000000000000001000000030000000100000005000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000050000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000070000000700000007000000080000000800000007000000080000000800000008000000070000000700000007000000080000000700000008000000080000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000080000000700000008000000080000000800000008000000080000000700000008000000070000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000070000000800000007000000080000000800000008000000080000000700000008000000070000000700000008000000070000000800000008000000080000000700000007000000070000000700000007000000070000000700000008000000080000000700000007000000070000000800000007000000070000000700000007000000070000000700000008000000080000000800000007000000070000000800000007000000070000000700000008000000070000000700000008000000070000000700000007000000070000000700000007000000080000000700000007000000080000000800000008000000070000000700000007000000070000000800000008000000 + bakedIDs: 0000000000000000010000000200000000000000010000000000000001000000010000000100000000000000030000000100000001000000010000000100000001000000010000000000000005000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000050000000400000004000000040000000400000004000000040000000400000004000000040000000400000004000000070000000700000007000000080000000800000007000000080000000800000008000000070000000700000007000000080000000700000008000000080000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000080000000700000008000000080000000800000008000000080000000700000008000000070000000700000008000000080000000700000007000000080000000800000007000000080000000700000007000000070000000700000007000000070000000700000007000000070000000800000007000000080000000800000008000000080000000700000008000000070000000700000008000000070000000800000008000000080000000700000007000000070000000700000007000000070000000700000008000000080000000700000007000000070000000800000007000000070000000700000007000000070000000700000008000000080000000800000007000000070000000800000007000000070000000700000008000000070000000700000008000000070000000700000007000000070000000700000007000000080000000700000007000000080000000800000008000000070000000700000007000000070000000800000008000000 bakedScaleOffset: - - {x: 0.07570296, y: 0.07570284, z: 0.24777927, w: 0.60309446} - - {x: 0.07570294, y: 0.07570282, z: 0.4046089, w: 0.60309446} - - {x: 0.07570291, y: 0.075702794, z: 0.24777927, w: 0.68150604} - - {x: 0.07570295, y: 0.07570283, z: 0.32619408, w: 0.60309446} - - {x: 0.075702906, y: 0.07570279, z: 0.24777927, w: 0.75991756} - - {x: 0.075702935, y: 0.075702816, z: 0.4830237, w: 0.60309446} - - {x: 0.9763147, y: 0.97625685, z: -0.00041782347, w: -0.0004177105} - - {x: 0.01752652, y: 0.017472332, z: 0.96237993, w: 0.00056764873} - - {x: 1.0012718, y: 1.0013535, z: -0.0004162471, w: -0.00041648623} - - {x: 0.24445435, y: 0.24413465, z: 0.0009855471, w: 0.6027217} - - {x: 0.01752649, y: 0.017472303, z: 0.9814724, w: 0.0005676503} - - {x: 0.17672753, y: 0.17673127, z: -0.00079548685, w: 0.8232806} + - {x: 0.9730492, y: 0.9729915, z: -0.00041642596, w: -0.00041631336} + - {x: 0.0174679, y: 0.017413892, z: 0.9785463, w: 0.0005657501} + - {x: 0.07561162, y: 0.0756115, z: 0.92303455, w: 0.48353985} + - {x: 1.0015688, y: 1.0016457, z: -0.00056225393, w: -0.0005624791} + - {x: 0.019549847, y: 0.017965164, z: 0.9600029, w: 0.042466655} + - {x: 0.24415956, y: 0.24384025, z: 0.66864365, w: 0.0009825442} + - {x: 0.01746787, y: 0.017413862, z: 0.95916104, w: 0.022905722} + - {x: 0.17967619, y: 0.17967603, z: 0.6687677, w: 0.22317879} + - {x: 0.07561165, y: 0.07561153, z: 0.8447143, w: 0.40522286} + - {x: 0.17656036, y: 0.17655683, z: 0.6670387, w: 0.4032474} + - {x: 0.019549858, y: 0.017965175, z: 0.9790315, w: 0.02375117} - {x: 1.0196207, y: 1.0034717, z: -0.0015223261, w: -0.0014750147} - - {x: 0.6093728, y: 0.6093729, z: -0.00031559673, w: -0.000315597} + - {x: 0.14412758, y: 0.14409792, z: 0.8509354, w: 0.222097} + - {x: 0.07561164, y: 0.075611524, z: 0.9230346, w: 0.40522286} + - {x: 0.07561166, y: 0.07561154, z: 0.91513985, w: 0.07967188} + - {x: 0.66713893, y: 0.6670383, z: 0.00026178654, w: 0.00026395655} + - {x: 0.075611666, y: 0.07561155, z: 0.91513985, w: 0.0013548852} + - {x: 0.075611636, y: 0.07561152, z: 0.8447143, w: 0.48353985} + - {x: 0.022674289, y: 0.023216473, z: 0.9576273, w: -0.0010295087} - {x: 0.2702117, y: 0.2701885, z: -0.008445248, w: 0.7324447} - {x: 0.12100871, y: 0.12103219, z: 0.119270645, w: 0.8086851} - {x: 0.080332674, y: 0.08031833, z: 0.23948325, w: 0.8887358} @@ -20311,6 +23287,11 @@ MonoBehaviour: - {fileID: 0} - {fileID: 0} - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} bakedRenderersTerrain: [] bakedIDsTerrain: bakedScaleOffsetTerrain: [] @@ -20479,32 +23460,42 @@ MonoBehaviour: - {fileID: 139112635} - {fileID: 302151439} - {fileID: 448309812} + - {fileID: 534795303} - {fileID: 593901293} - {fileID: 599447124} + - {fileID: 855597969} - {fileID: 882053296} - {fileID: 910520425} + - {fileID: 1031042353} - {fileID: 1378939248} + - {fileID: 1291548464} - {fileID: 1307231589} - {fileID: 1625315258} - {fileID: 1851354689} - {fileID: 2055335471} - {fileID: 2067418218} - bakedIDs: 0000000000000000010000000200000001000000000000000100000001000000030000000100000001000000010000000100000001000000 + - {fileID: 2092212187} + bakedIDs: 00000000000000000100000002000000000000000100000000000000010000000100000001000000000000000300000001000000010000000100000001000000010000000100000000000000 bakedScaleOffset: - - {x: 0.9763147, y: 0.97625685, z: -0.00041782347, w: -0.0004177105} - - {x: 0.01752652, y: 0.017472332, z: 0.96237993, w: 0.00056764873} - - {x: 0.07570291, y: 0.075702794, z: 0.24777927, w: 0.68150604} - - {x: 1.0012718, y: 1.0013535, z: -0.0004162471, w: -0.00041648623} - - {x: 0.24445435, y: 0.24413465, z: 0.0009855471, w: 0.6027217} - - {x: 0.01752649, y: 0.017472303, z: 0.9814724, w: 0.0005676503} - - {x: 0.07570294, y: 0.07570282, z: 0.4046089, w: 0.60309446} - - {x: 0.17672753, y: 0.17673127, z: -0.00079548685, w: 0.8232806} + - {x: 0.9730492, y: 0.9729915, z: -0.00041642596, w: -0.00041631336} + - {x: 0.0174679, y: 0.017413892, z: 0.9785463, w: 0.0005657501} + - {x: 0.07561162, y: 0.0756115, z: 0.92303455, w: 0.48453307} + - {x: 1.0015688, y: 1.0016457, z: -0.00056225393, w: -0.0005624791} + - {x: 0.019549854, y: 0.017965171, z: 0.9790315, w: 0.02375117} + - {x: 0.24415956, y: 0.24384025, z: 0.66864365, w: 0.0009825442} + - {x: 0.01746787, y: 0.017413862, z: 0.95916104, w: 0.022905722} + - {x: 0.18299559, y: 0.18301189, z: 0.6670376, w: 0.2214482} + - {x: 0.07561165, y: 0.07561153, z: 0.8447143, w: 0.4062161} + - {x: 0.17656036, y: 0.17655683, z: 0.6670387, w: 0.40424064} + - {x: 0.01954985, y: 0.017965168, z: 0.9600029, w: 0.042466655} - {x: 1.0196207, y: 1.0034717, z: -0.0015223261, w: -0.0014750147} - - {x: 0.075702935, y: 0.075702816, z: 0.4830237, w: 0.60309446} - - {x: 0.07570295, y: 0.07570283, z: 0.32619408, w: 0.60309446} - - {x: 0.6093728, y: 0.6093729, z: -0.00031559673, w: -0.000315597} - - {x: 0.07570296, y: 0.07570284, z: 0.24777927, w: 0.60309446} - - {x: 0.075702906, y: 0.07570279, z: 0.24777927, w: 0.75991756} + - {x: 0.14412759, y: 0.14409794, z: 0.8509251, w: 0.222097} + - {x: 0.07561164, y: 0.075611524, z: 0.9230346, w: 0.4062161} + - {x: 0.07561166, y: 0.07561154, z: 0.91513985, w: 0.07967188} + - {x: 0.66713893, y: 0.6670383, z: 0.00026178654, w: 0.00026395655} + - {x: 0.075611666, y: 0.07561155, z: 0.91513985, w: 0.0013548852} + - {x: 0.075611636, y: 0.07561152, z: 0.8447143, w: 0.48453307} + - {x: 0.022674289, y: 0.023216473, z: 0.9576273, w: -0.0010295087} bakedVertexColorMesh: - {fileID: 0} - {fileID: 0} @@ -20520,6 +23511,11 @@ MonoBehaviour: - {fileID: 0} - {fileID: 0} - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} bakedRenderersTerrain: [] bakedIDsTerrain: bakedScaleOffsetTerrain: [] @@ -21816,11 +24812,185 @@ Transform: - {fileID: 69741268} m_Father: {fileID: 50750187} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1341759403 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1341759404} + m_Layer: 0 + m_Name: VowelCards + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1341759404 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341759403} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.62, y: 0, z: 0.47} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 207486949} + - {fileID: 632237519} + - {fileID: 456079423} + - {fileID: 513274840} + - {fileID: 355966355} + - {fileID: 1153384510} + - {fileID: 496178655} + - {fileID: 403863349} + - {fileID: 272120869} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1348252975 stripped GameObject: m_CorrespondingSourceObject: {fileID: 2880588319250313143, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 445112381} m_PrefabAsset: {fileID: 0} +--- !u!1 &1351573130 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1351573131} + - component: {fileID: 1351573133} + - component: {fileID: 1351573132} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1351573131 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1351573130} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.00035762592} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1136465494} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0010681152, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1351573132 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1351573130} + 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: VOWEL + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2902458367 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6745098} + 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: 140 + m_fontSizeBase: 140 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 256 + m_fontStyle: 1 + 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: 1 + 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!222 &1351573133 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1351573130} + m_CullTransparentMesh: 1 --- !u!1001 &1354535475 PrefabInstance: m_ObjectHideFlags: 0 @@ -22331,9 +25501,13 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 445776558} m_Modifications: + - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} + propertyPath: m_LocalScale.x + value: 1.2 + objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_LocalPosition.x - value: 1.795 + value: 0.785 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_LocalPosition.y @@ -22371,6 +25545,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: -180 objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} + propertyPath: m_ConstrainProportionsScale + value: 0 + objectReference: {fileID: 0} - target: {fileID: -7511558181221131132, guid: 85585303349fb4849b6c9f2825e34d67, type: 3} propertyPath: m_Materials.Array.data[0] value: @@ -23423,50 +26601,46 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 689256096079544507, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 1487057093} m_PrefabAsset: {fileID: 0} ---- !u!114 &1495929848 -MonoBehaviour: +--- !u!1 &1496816130 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} - m_Name: QuizScene_LMA2 - m_EditorClassIdentifier: - resolution: 2048 - bitmask: 1 - id: 2 - sortingID: 2 - isImplicit: 1 - area: 0 - totalVertexCount: 0 - vertexCounter: 0 - sceneLodLevel: -1 - autoResolution: 0 - sceneName: - tag: -1 - containsTerrains: 0 - probes: 0 - mode: 1 - renderMode: 1000 - renderDirMode: 1000 - atlasPacker: 1000 - holeFilling: 0 - computeSSS: 0 - sssSamples: 16 - sssDensity: 10 - sssColor: {r: 1, g: 1, b: 1, a: 1} - sssScale: 1 - fakeShadowBias: 0 - transparentSelfShadow: 0 - flipNormal: 0 - parentName: - overridePath: - fixPos3D: 0 - voxelSize: {x: 1, y: 1, z: 1} - passedFilter: 0 + serializedVersion: 6 + m_Component: + - component: {fileID: 1496816131} + m_Layer: 0 + m_Name: ConsonantCards + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1496816131 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496816130} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.62, y: 0, z: 0.47} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 580279919} + - {fileID: 1554993643} + - {fileID: 484924005} + - {fileID: 34548405} + - {fileID: 878269395} + - {fileID: 613187715} + - {fileID: 730246664} + - {fileID: 1855655795} + - {fileID: 748132932} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1510596813 stripped GameObject: m_CorrespondingSourceObject: {fileID: 7004038606463852389, guid: 844da2a9bfdfa474784b61993287bcc8, type: 3} @@ -23568,6 +26742,123 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: f5df33c049e47e349b68e4159cb7dcf4, type: 3} m_PrefabInstance: {fileID: 1516427551} m_PrefabAsset: {fileID: 0} +--- !u!1 &1517704519 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1517704520} + - component: {fileID: 1517704524} + - component: {fileID: 1517704523} + - component: {fileID: 1517704522} + - component: {fileID: 1517704521} + m_Layer: 0 + m_Name: ControlPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1517704520 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517704519} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -1.503} + m_LocalScale: {x: 0.0009999997, y: 0.001, z: 0.0009999997} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 453854343} + - {fileID: 131000290} + m_Father: {fileID: 855597967} + 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.004, y: 2.11} + m_SizeDelta: {x: 800.34, y: 1000} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1517704521 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517704519} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1533785930, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + AllowFocusView: 1 +--- !u!114 &1517704522 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517704519} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1517704523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517704519} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1517704524 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517704519} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &1517923882 GameObject: m_ObjectHideFlags: 0 @@ -23818,6 +27109,179 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 3.7465565, y: 0.86141926, z: 0.71520543} m_Center: {x: 0, y: 0.43070963, z: -0.00000037252903} +--- !u!1 &1552660476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1552660477} + - component: {fileID: 1552660480} + - component: {fileID: 1552660479} + - component: {fileID: 1552660478} + m_Layer: 0 + m_Name: LetterPoint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1552660477 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552660476} + serializedVersion: 2 + m_LocalRotation: {x: -0.000000029802319, y: -0.000000014901159, z: 0.7071072, w: 0.7071064} + m_LocalPosition: {x: -0.3994, y: 2.151, z: -0} + m_LocalScale: {x: 0.25, y: -0.15, z: 0.25} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 658159721} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!114 &1552660478 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552660476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: ef141fe835e78a24bb174baa36a5f880, type: 2} + programSource: {fileID: 11400000, guid: dc3ed24bdd2e124499328dde1c74cf8f, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &1552660479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552660476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 27c5517edcb7e9f4e993048dd9310c20, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1552660478} +--- !u!65 &1552660480 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552660476} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1001 &1554993642 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (1) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &1554993643 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 1554993642} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1554993644 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 1554993642} + m_PrefabAsset: {fileID: 0} --- !u!23 &1559809794 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 5629896105277814212, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -24664,13 +28128,129 @@ GameObject: m_CorrespondingSourceObject: {fileID: 6502798789971202652, guid: 89fe58bd9a2f5c240b10c836e11bb5ac, type: 3} m_PrefabInstance: {fileID: 1612549483} m_PrefabAsset: {fileID: 0} +--- !u!1 &1614335401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1614335402} + - component: {fileID: 1614335406} + - component: {fileID: 1614335405} + - component: {fileID: 1614335404} + - component: {fileID: 1614335403} + m_Layer: 0 + m_Name: Canvas (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1614335402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614335401} + m_LocalRotation: {x: 3.308722e-24, y: 0.7071061, z: 1.952146e-22, w: 0.7071075} + m_LocalPosition: {x: 0, y: 0, z: -0.902} + m_LocalScale: {x: 0.0009999997, y: 0.001, z: 0.0009999997} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2098245342} + m_Father: {fileID: 855597967} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.394, y: 1.802} + m_SizeDelta: {x: 859.21, y: 261.9} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1614335403 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614335401} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1533785930, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + AllowFocusView: 1 +--- !u!114 &1614335404 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614335401} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1614335405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614335401} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1614335406 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614335401} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1001 &1625315255 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 1743423422} + m_TransformParent: {fileID: 445776558} m_Modifications: - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.x @@ -26816,12 +30396,6 @@ Transform: - {fileID: 88149415} - {fileID: 303549434} - {fileID: 445776558} - - {fileID: 1625315256} - - {fileID: 2067418216} - - {fileID: 2055335469} - - {fileID: 882053294} - - {fileID: 1307231587} - - {fileID: 302151437} m_Father: {fileID: 1083390546} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1743423423 @@ -28979,7 +32553,10 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 031b327695a211149b112576815b9c21, type: 3} + insertIndex: -1 + addedObject: {fileID: 1851354690} m_SourcePrefab: {fileID: 100100000, guid: 031b327695a211149b112576815b9c21, type: 3} --- !u!4 &1851354687 stripped Transform: @@ -28996,6 +32573,130 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 031b327695a211149b112576815b9c21, type: 3} m_PrefabInstance: {fileID: 1851354686} m_PrefabAsset: {fileID: 0} +--- !u!64 &1851354690 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1851354688} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 2534964839176971238, guid: 031b327695a211149b112576815b9c21, type: 3} +--- !u!1 &1852770478 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1852770479} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1852770479 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852770478} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071072, y: -0.70710653, z: -0.00000032782552, w: 0.00000046193594} + m_LocalPosition: {x: -1.1718373, y: -5.484292e-23, z: -0.0000047495964} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1031042352} + m_LocalEulerAnglesHint: {x: -180, y: 0, z: -90} +--- !u!1001 &1855655794 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1496816131} + m_Modifications: + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.x + value: -0.5833011 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.y + value: 1.7568002 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07680127 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.x + value: -4.6622322e-24 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071069 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: m_Name + value: LetterCard (7) + objectReference: {fileID: 0} + - target: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 2360640589464103809, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} +--- !u!4 &1855655795 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 176992625948006363, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 1855655794} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1855655796 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2000358557829342357, guid: 8df8fbb666a0bd64b8e8939db910ecfc, type: 3} + m_PrefabInstance: {fileID: 1855655794} + m_PrefabAsset: {fileID: 0} --- !u!1 &1857316187 GameObject: m_ObjectHideFlags: 0 @@ -29348,6 +33049,50 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 3578079415854012088, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1121960421} m_PrefabAsset: {fileID: 0} +--- !u!114 &1905512160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} + m_Name: QuizScene_LMA2 + m_EditorClassIdentifier: + resolution: 2048 + bitmask: 1 + id: 2 + sortingID: 2 + isImplicit: 1 + area: 0 + totalVertexCount: 0 + vertexCounter: 0 + sceneLodLevel: -1 + autoResolution: 0 + sceneName: + tag: -1 + containsTerrains: 0 + probes: 0 + mode: 1 + renderMode: 1000 + renderDirMode: 1000 + atlasPacker: 1000 + holeFilling: 0 + computeSSS: 0 + sssSamples: 16 + sssDensity: 10 + sssColor: {r: 1, g: 1, b: 1, a: 1} + sssScale: 1 + fakeShadowBias: 0 + transparentSelfShadow: 0 + flipNormal: 0 + parentName: + overridePath: + fixPos3D: 0 + voxelSize: {x: 1, y: 1, z: 1} + passedFilter: 0 --- !u!1 &1913336476 GameObject: m_ObjectHideFlags: 0 @@ -31025,7 +34770,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 1743423422} + m_TransformParent: {fileID: 445776558} m_Modifications: - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.x @@ -31199,11 +34944,11 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 1743423422} + m_TransformParent: {fileID: 445776558} m_Modifications: - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.x - value: 0.016027616 + value: 0.016027618 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.y @@ -31211,7 +34956,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalScale.z - value: 0.016027618 + value: 0.01602762 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 4484e3331bc52724593257a69e2553b8, type: 3} propertyPath: m_LocalPosition.x @@ -31996,15 +35741,19 @@ PrefabInstance: m_Modifications: - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalScale.x - value: 0.14623012 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} + propertyPath: m_LocalScale.y + value: 1 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalScale.z - value: 0.11628806 + value: 1 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalPosition.x - value: 0.596 + value: 0.5960002 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalPosition.y @@ -32012,11 +35761,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalPosition.z - value: -0 + value: 0.00000023680978 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalRotation.w - value: 0.0000020862688 + value: 0.000002086269 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalRotation.x @@ -32028,7 +35777,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalRotation.z - value: 0.0000020862685 + value: 0.000002086269 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -32050,6 +35799,10 @@ PrefabInstance: propertyPath: m_Name value: ClockHand objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} + propertyPath: m_StaticEditorFlags + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -32060,6 +35813,150 @@ Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} m_PrefabInstance: {fileID: 2092212184} m_PrefabAsset: {fileID: 0} +--- !u!1 &2092212186 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} + m_PrefabInstance: {fileID: 2092212184} + m_PrefabAsset: {fileID: 0} +--- !u!23 &2092212187 stripped +MeshRenderer: + m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 1c7ee18c931fd454cadaa750534e1d95, type: 3} + m_PrefabInstance: {fileID: 2092212184} + m_PrefabAsset: {fileID: 0} +--- !u!1 &2098245341 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2098245342} + - component: {fileID: 2098245344} + - component: {fileID: 2098245343} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2098245342 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2098245341} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.00035762592} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1614335402} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0010681152, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2098245343 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2098245341} + 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: CONSONANT + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2902458367 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6745098} + 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: 140 + m_fontSizeBase: 140 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 256 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: -11.8 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + 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!222 &2098245344 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2098245341} + m_CullTransparentMesh: 1 --- !u!1 &2099851975 GameObject: m_ObjectHideFlags: 0 @@ -32870,50 +36767,6 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: c9fb1b8a20728b94881a9f11328bf52a, type: 3} m_PrefabInstance: {fileID: 2129333575} m_PrefabAsset: {fileID: 0} ---- !u!114 &2136442879 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ec0b4dd729a12d046982652f834580a2, type: 3} - m_Name: QuizScene_LM0 - m_EditorClassIdentifier: - resolution: 2048 - bitmask: 1 - id: 0 - sortingID: 0 - isImplicit: 1 - area: 5220.649 - totalVertexCount: 0 - vertexCounter: 0 - sceneLodLevel: -1 - autoResolution: 0 - sceneName: - tag: -1 - containsTerrains: 0 - probes: 0 - mode: 1 - renderMode: 1000 - renderDirMode: 1000 - atlasPacker: 1000 - holeFilling: 0 - computeSSS: 0 - sssSamples: 16 - sssDensity: 10 - sssColor: {r: 1, g: 1, b: 1, a: 1} - sssScale: 1 - fakeShadowBias: 0 - transparentSelfShadow: 0 - flipNormal: 0 - parentName: - overridePath: - fixPos3D: 0 - voxelSize: {x: 1, y: 1, z: 1} - passedFilter: 0 --- !u!1 &2138198203 GameObject: m_ObjectHideFlags: 0 @@ -33160,6 +37013,37 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2139680467} m_CullTransparentMesh: 1 +--- !u!1 &2141577018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2141577019} + m_Layer: 0 + m_Name: GameObject (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2141577019 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2141577018} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071071, y: -0.70710653, z: 0.00000041723246, w: -0.00000038743013} + m_LocalPosition: {x: -1.1718402, y: -5.484184e-23, z: 0.0000036320444} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 534795302} + m_LocalEulerAnglesHint: {x: -180, y: 0, z: -90} --- !u!1001 &2143233303 PrefabInstance: m_ObjectHideFlags: 0 @@ -33669,38 +37553,30 @@ MonoBehaviour: useAssignedLayers: 0 DynamicPrefabs: [] DynamicMaterials: - - {fileID: 2100000, guid: 85980b42c2579134d951ee2c7bf3c7f6, type: 2} - - {fileID: 2100000, guid: 41c915fe141e9bb46a82cc8f3146d7d7, type: 2} - - {fileID: 2100000, guid: 40ac1972b558b66459a6c2d0d9a2785a, type: 2} - - {fileID: 2100000, guid: 1ede16ef59ea59a45abdc8068755a357, type: 2} - - {fileID: 2100000, guid: 4d93572e13ca9ce489fe617e57fe7930, type: 2} - {fileID: 2100000, guid: b26dcac062b7da14fb6e50fc6b69aa77, type: 2} - - {fileID: 2100000, guid: 2aff5bcb44571d145a53916006e5b0fc, type: 2} - - {fileID: 2100000, guid: b9257d637744d15458654516d0135220, type: 2} - - {fileID: -876546973899608171, guid: 5c44459d12f34ed4fa7e98f2698e61f2, type: 3} - - {fileID: 2100000, guid: 82f02b2138cfe1242990f0e41f2a7612, type: 2} - - {fileID: 2100000, guid: 6e335a1ff69fc8445ae83f96fb249293, type: 2} - - {fileID: -876546973899608171, guid: 299117bf4be2de4429aa6f98e0322f4f, type: 3} - - {fileID: 2100000, guid: 5e3993f6e7b9d1540b8bb266ccaed08c, type: 2} - - {fileID: 2100000, guid: 156868ebaeb510e49b9e98d3432f84d8, type: 2} - - {fileID: 2100000, guid: 8d933e10488cb884cba7c4b078d7981a, type: 2} - - {fileID: 2100000, guid: dfde93b45f020924693e2e504123dbf6, type: 2} - - {fileID: 2100000, guid: 04e6c9ad0e6dc494cb9dfad9e0fbc1dc, type: 2} - - {fileID: 2100000, guid: 7c5c11e2849673c43945d9ded9767ef0, type: 2} - - {fileID: 2100000, guid: f06733e6df5d5584b9e5c62de0310e00, type: 2} - - {fileID: 2100000, guid: 00d0f1c2ffc2d1046a472d8e2becbc85, type: 2} - - {fileID: 2100000, guid: 51fd67e1cb8077d45bb1d5f36612a67f, type: 2} - - {fileID: 2100000, guid: 3d8b322bfde7cb44badcb0272be09f88, type: 2} - - {fileID: 2100000, guid: d9d7a7e28039eb14f98a63d3f0943c0a, type: 2} - - {fileID: 2100000, guid: 5c816e03b652658498610330ae7c0b66, type: 2} - - {fileID: 2100000, guid: 13ade2f118ed20c41b162069a6ffbdc9, type: 2} - - {fileID: 2100000, guid: 5042a64b6c663ec468f108fe586bbd3e, type: 2} - {fileID: 2100000, guid: 6dba0e876b8368347a4fb3f027e9b50e, type: 2} - {fileID: 2100000, guid: 9fa141bf96518154fb0b91e9f9d2831c, type: 2} + - {fileID: 2100000, guid: f61de072c139b1046b4331e609b5ec8d, type: 2} + - {fileID: 2100000, guid: 85980b42c2579134d951ee2c7bf3c7f6, type: 2} + - {fileID: -876546973899608171, guid: 5c44459d12f34ed4fa7e98f2698e61f2, type: 3} + - {fileID: 2100000, guid: b9257d637744d15458654516d0135220, type: 2} + - {fileID: 2100000, guid: 2aff5bcb44571d145a53916006e5b0fc, type: 2} + - {fileID: -876546973899608171, guid: 299117bf4be2de4429aa6f98e0322f4f, type: 3} + - {fileID: 2100000, guid: 5e3993f6e7b9d1540b8bb266ccaed08c, type: 2} + - {fileID: 2100000, guid: 1ede16ef59ea59a45abdc8068755a357, type: 2} + - {fileID: 2100000, guid: 4d93572e13ca9ce489fe617e57fe7930, type: 2} + - {fileID: 2100000, guid: 156868ebaeb510e49b9e98d3432f84d8, type: 2} + - {fileID: 2100000, guid: 7c5c11e2849673c43945d9ded9767ef0, type: 2} - {fileID: 2100000, guid: eb8a9840e6536604fac38ad9b70e6704, type: 2} + - {fileID: 2100000, guid: f06733e6df5d5584b9e5c62de0310e00, type: 2} - {fileID: 2100000, guid: ea803d5e2c877f84e8ca6599c9cefb15, type: 2} + - {fileID: 2100000, guid: 41c915fe141e9bb46a82cc8f3146d7d7, type: 2} - {fileID: 2100000, guid: 14e760d35eccd27408ac66474dcc0fd6, type: 2} + - {fileID: 2100000, guid: 04e6c9ad0e6dc494cb9dfad9e0fbc1dc, type: 2} - {fileID: 2100000, guid: dd0230fc1fb9dc141a4bf63f069a8c5d, type: 2} + - {fileID: 2100000, guid: 40ac1972b558b66459a6c2d0d9a2785a, type: 2} + - {fileID: 2100000, guid: 13ade2f118ed20c41b162069a6ffbdc9, type: 2} + - {fileID: 2100000, guid: 5042a64b6c663ec468f108fe586bbd3e, type: 2} - {fileID: 2100000, guid: e5e3830988904fb4e8ddda8116c9f883, type: 2} - {fileID: 2100000, guid: 53c3b33ab44d5b842ac7c8a095901308, type: 2} - {fileID: 2100000, guid: 0a7f557424e99564aadf76146dbd76f5, type: 2} @@ -33708,8 +37584,19 @@ MonoBehaviour: - {fileID: 2100000, guid: 79104b7c72559ae419b9b5c0aaf3f627, type: 2} - {fileID: 2100000, guid: 6c802bc1dd1dee24095056a5f6da8a8a, type: 2} - {fileID: 2100000, guid: 026a7c368b9c59343bc40afa213abe94, type: 2} + - {fileID: 2100000, guid: 5c816e03b652658498610330ae7c0b66, type: 2} + - {fileID: 2100000, guid: 90e2c2c675ad56247b8ce0101848274e, type: 2} + - {fileID: 2100000, guid: 50a00808aba6c2c488f11f4b0baff9eb, type: 2} + - {fileID: 2100000, guid: 02ce03781605f3f4f85c80bfdacfbe00, type: 2} + - {fileID: 2100000, guid: 82f02b2138cfe1242990f0e41f2a7612, type: 2} + - {fileID: 2100000, guid: 3d8b322bfde7cb44badcb0272be09f88, type: 2} - {fileID: 2100000, guid: b5b5ef0f1e1cc6e44b1d8cf76075f710, type: 2} + - {fileID: 2100000, guid: 51fd67e1cb8077d45bb1d5f36612a67f, type: 2} + - {fileID: 2100000, guid: d9d7a7e28039eb14f98a63d3f0943c0a, type: 2} - {fileID: 2100000, guid: 9d4f93f40c09a9b4e9d40d594df2436b, type: 2} + - {fileID: 2100000, guid: 8d933e10488cb884cba7c4b078d7981a, type: 2} + - {fileID: 2100000, guid: 00d0f1c2ffc2d1046a472d8e2becbc85, type: 2} + - {fileID: 2100000, guid: dfde93b45f020924693e2e504123dbf6, type: 2} - {fileID: 2100000, guid: b7be153c528feb64cab96881ac827d25, type: 2} - {fileID: 2100000, guid: ce4127123ba573342a780b21837bdbd4, type: 2} - {fileID: 2100000, guid: f92b4067bd487c648aa84b0580a3f05c, type: 2} @@ -33720,6 +37607,7 @@ MonoBehaviour: - {fileID: 2100000, guid: b7744b7dccafd7c479db7f7db6f5e317, type: 2} - {fileID: 2100000, guid: 360a40a163e0f3347b5b14b9771d2ab5, type: 2} - {fileID: 2100000, guid: ff8623efa30a1f349a02f4ebab214ae7, type: 2} + - {fileID: 2100000, guid: 6e335a1ff69fc8445ae83f96fb249293, type: 2} - {fileID: 2100000, guid: ec1099b4f6a3bbc48a1f538071108a81, type: 2} - {fileID: 2100000, guid: d00efd7b6e40bb84fbca65c86683a186, type: 2} - {fileID: 2100000, guid: 670c93b6400cecc4d9427ca653ff6a79, type: 2} @@ -34128,6 +38016,136 @@ MonoBehaviour: SerializedTypeNames: - VRC.SDK3.Components.VRCPickup - VRC.SDK3.Components.VRCObjectSync + - gameObject: {fileID: 910520424} + ID: 100 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1291548463} + ID: 101 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1031042351} + ID: 103 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - VRC.SDK3.Components.VRCObjectPool + - gameObject: {fileID: 207486950} + ID: 104 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 632237520} + ID: 105 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 456079424} + ID: 106 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 513274841} + ID: 107 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 355966356} + ID: 108 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1153384511} + ID: 109 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 496178656} + ID: 110 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 403863350} + ID: 111 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 272120870} + ID: 112 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 580279920} + ID: 113 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1554993644} + ID: 114 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 484924006} + ID: 115 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 34548406} + ID: 116 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 878269396} + ID: 117 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 613187716} + ID: 118 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 730246665} + ID: 119 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1855655796} + ID: 120 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 748132933} + ID: 121 + SerializedTypeNames: + - VRC.SDK3.Components.VRCObjectSync + - VRC.SDK3.Components.VRCPickup + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 534795301} + ID: 102 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - VRC.SDK3.Components.VRCObjectPool + - gameObject: {fileID: 1552660476} + ID: 122 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour portraitCameraPositionOffset: {x: 0, y: 0, z: 0} portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} PlayerPersistence: [] @@ -34728,5 +38746,3 @@ SceneRoots: - {fileID: 414844755} - {fileID: 641951134} - {fileID: 50750187} - - {fileID: 77699396} - - {fileID: 688445503} diff --git a/Assets/Quiz/Scripts/DownCount.meta b/Assets/Quiz/Scripts/DownCount.meta new file mode 100644 index 0000000..94d6ff6 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3a6386a704ce344fbf68618f1e394c1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/DownCountClock.asset b/Assets/Quiz/Scripts/DownCount/DownCountClock.asset new file mode 100644 index 0000000..704fea5 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/DownCountClock.asset @@ -0,0 +1,160 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: DownCountClock + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 51da5675278beaa4c9d5412e3c2f1ad3, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 3a15e8be20e3b5c41ba4cec8b8430f71, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 0 + hasInteractEvent: 0 + scriptID: -4206564956362923429 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 2 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: clockAnimator + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: clockAnimator + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.Animator, UnityEngine.AnimationModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: clockAudioSource + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: clockAudioSource + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.AudioSource, UnityEngine.AudioModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Quiz/Scripts/DownCount/DownCountClock.asset.meta b/Assets/Quiz/Scripts/DownCount/DownCountClock.asset.meta new file mode 100644 index 0000000..1ae8463 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/DownCountClock.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a11243f2a6c0254187bde32bd2a8f41 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/DownCountClock.cs b/Assets/Quiz/Scripts/DownCount/DownCountClock.cs new file mode 100644 index 0000000..f10b7e5 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/DownCountClock.cs @@ -0,0 +1,30 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDK3.UdonNetworkCalling; +using VRC.SDKBase; +using VRC.Udon; + +public class DownCountClock : UdonSharpBehaviour +{ + public Animator clockAnimator; + public AudioSource clockAudioSource; + + public void StartNetworkedClock() + { + SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "StartClock"); + } + + [NetworkCallable] + public void StartClock() + { + if (clockAnimator != null) + { + clockAnimator.SetTrigger("StartCountdown"); + } + if (clockAudioSource != null && !clockAudioSource.isPlaying) + { + clockAudioSource.Play(); + } + } +} diff --git a/Assets/Quiz/Scripts/DownCount/DownCountClock.cs.meta b/Assets/Quiz/Scripts/DownCount/DownCountClock.cs.meta new file mode 100644 index 0000000..68928e2 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/DownCountClock.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a15e8be20e3b5c41ba4cec8b8430f71 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterCard.asset b/Assets/Quiz/Scripts/DownCount/LetterCard.asset new file mode 100644 index 0000000..f0c45b4 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterCard.asset @@ -0,0 +1,232 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: LetterCard + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 64cc93137b785844886bfc947cc722a8, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 3433cbb3076d31b4e8629a10775bc308, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 0 + hasInteractEvent: 0 + scriptID: 5543338725446178154 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 3 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: letterText + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: letterText + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: TMPro.TextMeshProUGUI, Unity.TextMeshPro + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: currentLetter + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: currentLetter + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.String, mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 3 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 8|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: currentPoint + - Name: $v + Entry: 7 + Data: 9|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: currentPoint + - Name: k__BackingField + Entry: 7 + Data: 10|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: LetterPoint, Assembly-CSharp + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 7 + Data: 11|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.Udon.UdonBehaviour, VRC.Udon + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 12|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 13|UnityEngine.HideInInspector, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Quiz/Scripts/DownCount/LetterCard.asset.meta b/Assets/Quiz/Scripts/DownCount/LetterCard.asset.meta new file mode 100644 index 0000000..88ae7a3 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterCard.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c53b49d553e00a648aa3280ae05f8ddc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterCard.cs b/Assets/Quiz/Scripts/DownCount/LetterCard.cs new file mode 100644 index 0000000..cb2194a --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterCard.cs @@ -0,0 +1,46 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; + +public class LetterCard : UdonSharpBehaviour +{ + public TMPro.TextMeshProUGUI letterText; + [UdonSynced] public string currentLetter; + + [HideInInspector] public LetterPoint currentPoint; + + public override void OnDrop() + { + if (currentPoint != null) + { + currentPoint.OnCardReleased(this); + } + } + + public override void OnPickup() + { + if (currentPoint != null) + { + currentPoint.OnCardRemoved(this); + } + } + + public void SetLetter(string letter) + { + this.currentLetter = letter; + if (letterText != null) + { + letterText.text = currentLetter; + } + } + + public override void OnDeserialization() + { + if (letterText != null) + { + letterText.text = currentLetter; + } + } +} diff --git a/Assets/Quiz/Scripts/DownCount/LetterCard.cs.meta b/Assets/Quiz/Scripts/DownCount/LetterCard.cs.meta new file mode 100644 index 0000000..0a89f70 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3433cbb3076d31b4e8629a10775bc308 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterPoint.asset b/Assets/Quiz/Scripts/DownCount/LetterPoint.asset new file mode 100644 index 0000000..ad11dcc --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterPoint.asset @@ -0,0 +1,112 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: LetterPoint + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: ef141fe835e78a24bb174baa36a5f880, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 27c5517edcb7e9f4e993048dd9310c20, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 0 + hasInteractEvent: 0 + scriptID: -4190696958710811764 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: heldCard + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: heldCard + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: LetterCard, Assembly-CSharp + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 7 + Data: 4|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.Udon.UdonBehaviour, VRC.Udon + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 5|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Quiz/Scripts/DownCount/LetterPoint.asset.meta b/Assets/Quiz/Scripts/DownCount/LetterPoint.asset.meta new file mode 100644 index 0000000..2060319 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterPoint.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc3ed24bdd2e124499328dde1c74cf8f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterPoint.cs b/Assets/Quiz/Scripts/DownCount/LetterPoint.cs new file mode 100644 index 0000000..dde7379 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterPoint.cs @@ -0,0 +1,54 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; + +public class LetterPoint : UdonSharpBehaviour +{ + LetterCard heldCard; + + public void OnCardReleased(LetterCard card) + { + if (heldCard != null) return; + heldCard = card; + card.transform.position = this.transform.position; + card.transform.rotation = this.transform.rotation; + } + + public void OnCardRemoved(LetterCard card) + { + if (heldCard == card) + { + heldCard = null; + } + } + + void OnTriggerEnter(Collider other) + { + LetterCard card = other.GetComponent(); + if (card != null) + { + card.currentPoint = this; + } + } + + void OnTriggerExit(Collider other) + { + LetterCard card = other.GetComponent(); + if (card != null) + { + // If the exiting card was the one we were holding, clear it + if (card == heldCard) + { + heldCard = null; + } + + // Only clear if we are the one currently registered + if (card.currentPoint == this) + { + card.currentPoint = null; + } + } + } +} diff --git a/Assets/Quiz/Scripts/DownCount/LetterPoint.cs.meta b/Assets/Quiz/Scripts/DownCount/LetterPoint.cs.meta new file mode 100644 index 0000000..b095e33 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterPoint.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27c5517edcb7e9f4e993048dd9310c20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterStack.asset b/Assets/Quiz/Scripts/DownCount/LetterStack.asset new file mode 100644 index 0000000..1a8469e --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStack.asset @@ -0,0 +1,334 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: LetterStack + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: d6ecac3cb49e00b41bd6cf241876ba41, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 429e08c78a8672c4fb221c3c5b020643, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 0 + hasInteractEvent: 1 + scriptID: -1089858127067932960 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 5 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: letterSpawnPoint + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: letterSpawnPoint + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.Transform, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: letterPool + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: letterPool + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.SDK3.Components.VRCObjectPool, VRCSDK3 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: letters + - Name: $v + Entry: 7 + Data: 8|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: letters + - Name: k__BackingField + Entry: 7 + Data: 9|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.String[], mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 9 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 10|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 11|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: counts + - Name: $v + Entry: 7 + Data: 12|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: counts + - Name: k__BackingField + Entry: 7 + Data: 13|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Int32[], mscorlib + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 13 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 14|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 15|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: availableLetters + - Name: $v + Entry: 7 + Data: 16|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: availableLetters + - Name: k__BackingField + Entry: 9 + Data: 9 + - Name: k__BackingField + Entry: 9 + Data: 9 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 17|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 18|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Quiz/Scripts/DownCount/LetterStack.asset.meta b/Assets/Quiz/Scripts/DownCount/LetterStack.asset.meta new file mode 100644 index 0000000..6950e63 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStack.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5c3949f8e99590945884ed76b6833995 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterStack.cs b/Assets/Quiz/Scripts/DownCount/LetterStack.cs new file mode 100644 index 0000000..443dace --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStack.cs @@ -0,0 +1,81 @@ + +using UdonSharp; +using UnityEngine; +using VRC.Core.Pool; +using VRC.SDK3.Components; +using VRC.SDK3.UdonNetworkCalling; +using VRC.SDKBase; +using VRC.Udon; + +public class LetterStack : UdonSharpBehaviour +{ + public Transform letterSpawnPoint; + public VRCObjectPool letterPool; + [SerializeField] private string[] letters = { "A", "E", "I", "O", "U" }; + [SerializeField] private int[] counts = { 15, 21, 13, 13, 5 }; + [SerializeField] private string[] availableLetters; + + void Start() + { + InitLetterPool(); + } + + public void InitLetterPool() + { + int total = 0; + for (int i = 0; i < counts.Length; i++) + { + total += counts[i]; + } + availableLetters = new string[total]; + int idx = 0; + for (int i = 0; i < letters.Length; i++) + { + for (int j = 0; j < counts[i]; j++) + { + availableLetters[idx++] = letters[i]; + } + } + } + + public void SpawnLetter() + { + if (availableLetters.Length == 0) return; + + int rand = Random.Range(0, availableLetters.Length); + string selectedLetter = availableLetters[rand]; + + GameObject newLetter = letterPool.TryToSpawn(); + if (newLetter != null) + { + newLetter.transform.position = letterSpawnPoint.position; + newLetter.transform.rotation = letterSpawnPoint.rotation; + newLetter.GetComponent().SetLetter(selectedLetter); + } + // Remove the selected letter + string[] newAvailable = new string[availableLetters.Length - 1]; + int newIdx = 0; + for (int i = 0; i < availableLetters.Length; i++) + { + if (i != rand) + { + newAvailable[newIdx++] = availableLetters[i]; + } + } + availableLetters = newAvailable; + } + + public void ResetLetters() + { + InitLetterPool(); + for (int i = 0; i < letterPool.Pool.Length; i++) + { + letterPool.Return(letterPool.Pool[i]); + } + } + + public override void Interact() + { + SpawnLetter(); + } +} diff --git a/Assets/Quiz/Scripts/DownCount/LetterStack.cs.meta b/Assets/Quiz/Scripts/DownCount/LetterStack.cs.meta new file mode 100644 index 0000000..750cd5c --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStack.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 429e08c78a8672c4fb221c3c5b020643 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterStand.asset b/Assets/Quiz/Scripts/DownCount/LetterStand.asset new file mode 100644 index 0000000..4d4bb60 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStand.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: LetterStand + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: b8ffdfb4e1a952e44b4e632879e38929, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 1acc8aa2b2f0afe47a95123c7a80d4bb, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 0 + hasInteractEvent: 0 + scriptID: -1406578390206772105 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Quiz/Scripts/DownCount/LetterStand.asset.meta b/Assets/Quiz/Scripts/DownCount/LetterStand.asset.meta new file mode 100644 index 0000000..fde41fa --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStand.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f9280f40c34dba44d856803aa60215d7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/DownCount/LetterStand.cs b/Assets/Quiz/Scripts/DownCount/LetterStand.cs new file mode 100644 index 0000000..08d8230 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStand.cs @@ -0,0 +1,9 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; + +public class LetterStand : UdonSharpBehaviour +{ +} diff --git a/Assets/Quiz/Scripts/DownCount/LetterStand.cs.meta b/Assets/Quiz/Scripts/DownCount/LetterStand.cs.meta new file mode 100644 index 0000000..d9d1206 --- /dev/null +++ b/Assets/Quiz/Scripts/DownCount/LetterStand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1acc8aa2b2f0afe47a95123c7a80d4bb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/LetterStackBlue.png b/Assets/Quiz/Textures/DownCount/LetterStackBlue.png new file mode 100644 index 0000000..7258cf6 Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/LetterStackBlue.png differ diff --git a/Assets/Quiz/Textures/DownCount/LetterStackBlue.png.meta b/Assets/Quiz/Textures/DownCount/LetterStackBlue.png.meta new file mode 100644 index 0000000..0603238 --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/LetterStackBlue.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 3ab03b267d4f34e4c810937fc0638a69 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_AmbientOcclusion.png b/Assets/Quiz/Textures/DownCount/t_LetterStand_AmbientOcclusion.png new file mode 100644 index 0000000..92b3b2e Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_LetterStand_AmbientOcclusion.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_AmbientOcclusion.png.meta b/Assets/Quiz/Textures/DownCount/t_LetterStand_AmbientOcclusion.png.meta new file mode 100644 index 0000000..3f61973 --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_LetterStand_AmbientOcclusion.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: ee3a6180c5a761c4caa8fc65c01d4cdb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_BaseColor.png b/Assets/Quiz/Textures/DownCount/t_LetterStand_BaseColor.png new file mode 100644 index 0000000..aeee29d Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_LetterStand_BaseColor.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_BaseColor.png.meta b/Assets/Quiz/Textures/DownCount/t_LetterStand_BaseColor.png.meta new file mode 100644 index 0000000..282597a --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_LetterStand_BaseColor.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 79c4122583962874480739c96b272069 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_MetallicSmoothnessMaps.png b/Assets/Quiz/Textures/DownCount/t_LetterStand_MetallicSmoothnessMaps.png new file mode 100644 index 0000000..18b584e Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_LetterStand_MetallicSmoothnessMaps.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_MetallicSmoothnessMaps.png.meta b/Assets/Quiz/Textures/DownCount/t_LetterStand_MetallicSmoothnessMaps.png.meta new file mode 100644 index 0000000..ef59d1d --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_LetterStand_MetallicSmoothnessMaps.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 40e7604b6d18cf449bc6a34016a9b404 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_NormalMap.png b/Assets/Quiz/Textures/DownCount/t_LetterStand_NormalMap.png new file mode 100644 index 0000000..1fbc12f Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_LetterStand_NormalMap.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_LetterStand_NormalMap.png.meta b/Assets/Quiz/Textures/DownCount/t_LetterStand_NormalMap.png.meta new file mode 100644 index 0000000..07addc7 --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_LetterStand_NormalMap.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 3caec58ac203052438785a1c15a7495c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_Stand_BaseColor.png b/Assets/Quiz/Textures/DownCount/t_Stand_BaseColor.png new file mode 100644 index 0000000..6067f63 Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_Stand_BaseColor.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_Stand_BaseColor.png.meta b/Assets/Quiz/Textures/DownCount/t_Stand_BaseColor.png.meta new file mode 100644 index 0000000..8e71e15 --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_Stand_BaseColor.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 07ba9cde956dc0b45af9f2b15c7a9430 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_Stand_MetallicSmoothnessMaps.png b/Assets/Quiz/Textures/DownCount/t_Stand_MetallicSmoothnessMaps.png new file mode 100644 index 0000000..fceaa55 Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_Stand_MetallicSmoothnessMaps.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_Stand_MetallicSmoothnessMaps.png.meta b/Assets/Quiz/Textures/DownCount/t_Stand_MetallicSmoothnessMaps.png.meta new file mode 100644 index 0000000..b8adcef --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_Stand_MetallicSmoothnessMaps.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 72189fd231a42114280c5410fe1bc762 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/DownCount/t_Stand_NormalMap.png b/Assets/Quiz/Textures/DownCount/t_Stand_NormalMap.png new file mode 100644 index 0000000..f5aaa28 Binary files /dev/null and b/Assets/Quiz/Textures/DownCount/t_Stand_NormalMap.png differ diff --git a/Assets/Quiz/Textures/DownCount/t_Stand_NormalMap.png.meta b/Assets/Quiz/Textures/DownCount/t_Stand_NormalMap.png.meta new file mode 100644 index 0000000..b06a1df --- /dev/null +++ b/Assets/Quiz/Textures/DownCount/t_Stand_NormalMap.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 35d5ee8836afb8d45946aa19aca8c6fd +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LM0_final.hdr b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LM0_final.hdr index bf3f696..8d58519 100644 Binary files a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LM0_final.hdr and b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LM0_final.hdr differ diff --git a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA1_final.hdr b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA1_final.hdr index e2a98e4..c421064 100644 Binary files a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA1_final.hdr and b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA1_final.hdr differ diff --git a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA2_final.hdr b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA2_final.hdr index 54cf531..58defc3 100644 Binary files a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA2_final.hdr and b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA2_final.hdr differ diff --git a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA3_final.hdr b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA3_final.hdr index 7a70d23..37190ef 100644 Binary files a/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA3_final.hdr and b/Assets/Quiz/Textures/Lightmaps/DownCount/QuizScene_LMA3_final.hdr differ diff --git a/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset b/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset index 51a7030..5b7ad9c 100644 --- a/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset +++ b/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15c5d6c02740200142874068a147451202227621b4284d20a8a0424802440244128abd2bf65edfd367177befbdf7de7b57ecf5d9cbb7333b937b76ee9cbdbbd97b36bbf95ef891cdb6b3e7fce74c3b333bdba290593f19c3ad5f73d92c56c246b03256c956b215d65f25d676b9f5cfde53c767b255d67689f5bbdc3a379ce5a7b893ff0ccbe869fd2eb5f6ea58bd75e76a56616dabc5f9d9accafabbd4bab7cadae347175bffabacab325a593795b1096c069bce7233baa7103157dc54278f6570bb32b2acdfe3d9bed6d92aa1147f48a138956bfd9a6d9da913e7965b4aabebe6b33d8559cbad7315d63dab588d2573919098757701137f307bd3456ebb5aff33adffa3e57e0beb7f36bf5efe0daf6d6bfde796ede6726d37706db6fcbbbb7cc6d91e9ed15a6e7bc8ed21f6b10c06f6b90e1be57eae765f3b797d86dcef29b7ede5f116daf11c79bca576bc0372bc2372bc9376bc97dc1e06381ca6dd73a8bca715d8b7fe6e71b526e370795d26d019ca53e75b6bf71d218fb70136c1fb8e40ee3b52bbafa376df91c87d4769f775d2ee3b4abb4f1dcf03fbfc7c96ed2f19f5f2b862aa7865837d8b5756a5dc571cd76bd7ad97dba3e5f1b660dfbaa7651ffb792d2bb5e71d03d24ec93e161c3b061c83f2db39e5673e2ff77bcbedf140465f8d613f29a3bda64b7f701d3f9fa39dcf07b24de707c86d1fe4fc40a08fe9fc20795cf9d060b93d01d832d4a72d79296c3921852d4352d832d4a32d27cafd8eda75c3b4f3ba9c02b9ed819cdf447b8e3abea9dc9e24cf7702fb7c7b1c60caffe63ef4b8dcdf8c095f6d77b2bdcd52e9b039487f75ef8834a7472adf4a951e233ca64721487f654b510a5b54fec4f2893a9f0f649bce63f9449d57b61421e753f996ba0ef32d751ef32d755ef72d75bc11bed5e0432359c2b7f87e3ba083ba1ed6c5ea7e556e16dbf70fad91fb6ef57ca67d6fdb4b34fd4f96cfe80cf6ad73d9a7cbfd51727b2a4b2e9b87816b28989eae31553a9d02743945ea7bbcdc1fcd9c7a8f91d75af6b73fc4de363068096440065266db5a17067a99a5334857998531380de8721acea5c1d62d5370f1ea3f3fc9fdade476acdc6e9390d771470ff2b6955bd576f1abcf76dafd7e9fbfbddc9ec19ce5c5192efa6c21b7c30167d333dc9eab743b537bee992e766c2db73b0478ee38e6ec778c91dbb398b3ed76969dceedef97b6ab76ff78c0c04d0725f76c29b70bd8b7e4e6f4b4e5e6a832ac44bbcf64bfdf679f239fdd55eeab3aec5c70ffb972abf6ff25efe906f62d7d3b2c94fb59da7dff96d77707fbead97c7b9e3cdf03ec7379633539a96c52d7e5817dd066cf517547b6765d36b80eeaafae538c547f6e82c66a22b856719d94489b7c55de4e96db52b99d92b8a6ff58ed99a96c75f3df9d98d37fb791dbf399d37fcfb739773cc4bebee306797c6796c84b6e3a28b9ff61661fba00dc7f8166df85cce94317daba747e5b4b0375df45cce943178167f3edc5cce943174b793723697a89264f7f9e3a9fabdda7fb8cea2f4fd5ce439f509c4c3e31cd834fe8ec2e95cfee05f6b9ad4ae674b99d25b733c0bd6a3bd39036bb249e3d50f54b55faa4f20525230fec83bcd7f165e6cfb7dcfc5b4f8bd9cc997ffdca2b634ebfbd8c39631f97d97cbb6cb06de9f2b8765fb6765f9ef33e9e2dc4fe5cb99d93c2f62c4dfee5cce9ab97cbad2aeb3730a7ef6f90cf5de7f3b99783ebb8bcde2ed7baf15431b82b98b3bcb942eaf59dcdb19bca3bca8e5d53e8a7e45ec9cce5cd55e0feabb4b4b99a39cb9bab6d5dbaabfd2cedbe6b34e6d78067f3edb51af36b6d79ddbed2e4a4b2495d9707f641bee9a6ea1aaf8cdcd265bedcce033c657eef7a3f900f9fb73b73fab4df672ed0ecbb8e39e370d76969b81773f69dd5f185c0ee3de4b61c1cdb536e1781634a7645c2ce9e5ee2bc4b349dafd774be5ed36db1a6b3ba0feaacda7050e72a83ce4ab65f9df766cebc7e0390a9ea16a8cf52833ed5067d6e68a43e2bb567dfa831bc5163b85c63a8ce2b962bb4f3aa6e83362d33d8a4fafbd02625dbaf4de5727b3373966baa8d711373c670f9be5526f47cdf7e46af4e4017bebd4593738bbb9c5e6ee320b5ccd9e6535c9f05762b760be5f676e62ce39e05c7f9f65ee6ac07efb5f5c83b40eee768f26e95d7f701fb50ee73daf9e7e4f679a0a362fc0238f63c38c6b78f30672cfb11a9d71c173e4a873cb00fcad95eaa6ed9c7a76d7506ddebc1b13572bb1a1c53b26f03c7609a489f1c325c1e5b25b77780eb6fd3d2ea0ee61cbf582bb71d34f9776a76dc69b043f927b443b525a01d4af65d063bee76b1e31e70fd5de07a750eda51c19cbe980df6ad34ef53a35d779fbcae2fd887e9aee4f473cae9abcae77de556c51a943df76bdcd4f3543e7b409eef0faed7b93ee091ab7af68306ae0fb9707d185cff20b85e9d33715579291bec731e0f6bd73daa717d546e4b3539fd9c72faa974dd0fe1fa18c255a5d7e31ad7c70c5c557bdc2bd7270c5c9f74e1fa14b8fe0970bd3a07b9ea65ecd3cc59c63eadd9f70c73f65df4fbd579d50f75ab9f942fbec892cbfc2972fb92a6cf8be038dfbecc9c65fecb763ae6abf86e8e26ef552dfd5ed5e4bea69d7f4d6e5f61c9e58892f9ba76cfeb9acc37349f78453bde41bb3e0fec8332bfbfeab37b61faa681e944b97d4b63fa2638ceb76f6b4cdfb6990e5465578e26ef5dcdfe7735b9ef69e7df93db7758b2af2b99ef6bf7bc2fb71f3067feffc0d66dc057889c0f35391f6aba7da4a5cd3be038df4e62ced87e074dfec79afc8f35f99f20f2d5f10edaf579601fa47dfe053ed2fe5343dacf90dbcfb4b4ff141ce7db8d5ada6fb4f90e516dc11c4dde179afd5f6872bfd4ce7f29b79f1bd25ec9fc4abb47a5edd75ada7f6deb36682322e71b4dce379a6edf6a69f33938ceb733b5b4efa4c9ff4e93ff9ddc7eafe9f9bdade76015cfd5f5fc4193f383a6e78f889e3fcaed2ecceca34afe4f9afc9f34f9ff45e4abe31db4ebf3c03ef0d1812a4eeec5477f01e95f27b7bf6adc7eb5b90dd9a85df70b73d6edbf687afd06f4e2fbabc171befd599ecfd7e4feacc91f60db3554979387c851f7d76b72066ae75701dbfdc627f6973add2ff755dfe640b9557d8c83e4b3077990a9c646954ebf33670ce5773b1d86a9faae17b84f8fd3aa737f3367bce96f4d865b1c51e9f3077396557fc8ed9fcc19ef5331dabf801efa18aeba27dd63b8ff30e718ee3fc0de6ce6b0bd60ac9d7605aa6d7230d08d6fddc607a16d7f4979eba53c350ea2b8e5817d34ce9c9921caf829accaea07d6b2429108dc5aaf5340d59da9277f72d1adf92ffe334c3cb6deeab8d45a020c3330cbc4fcce7a368a151b6760f6123115f5f412f1bbdcbaa25a081d9c91f4883b921ec195abb1fe5581e9a375d6f1c962f6299f405a6d9d19c1a65a5b7ed7423692cdb7fe39a5ccb51e5b63150a556c8ef5bb56c85b68a99d7c652a93f85453fd9e59964c7b26ec72eb88025a6bedd7080d678bdf6b84a65542fb52eb58bd9897bb822d61e3aded3af1b464db57597f9b9e39472233eb689e108b1db7a7ddaa649a6059c3b52f14f9e77f29d21429c2d1b7e6f983ffb42a142dbc639352e27f0ced428607274ba58c91025986e358312b147388672511f46f63b28566ffb6798f61a35d6d3193e1c9dd5b589048e145395b4cbff2ded77ec8749a368a158af0409f14a6b981e5f20a44edefc784cccc56455c511d7f8609bf08cdcf0e11bf7d5db5b8ce7f02b416959f3301c4f0de1ceb8f75d6ff1aebe279428d2a364ddcbc48beccb0d4125fcb9252a9888b6c23402757a3a994c550b730a1ce0a1b75eab2c50d7556835d09d4fcc74c301b21984a078c604b1341d176db83946072234cfd35deba77a945628da859575bf79b1a6dee4cf9e0cee61a5333cf768267beb129e94f238c702b03e1224eb8bd49c96c4d49ae1f2238d3947462586b4e88cecfcfad1452caad6bfdbb3fefc36ca6bbbf39ad3a88b4ea99645c6a15b0b4696d42d82efca2da2ef96a52d4fb66803c40d3df73f9d1092d81dd75c008b631111471bc85a1941fb3add6faced6b972ebfa2ad122e4c7675a12cbad677379e3c4131239d679873bdbce9ecb912e82eb60508e04d50c239e65229e1376b64fd436d8cb87ee64bb365891205b28e216c9f93bf5b378cb44bc8dd08afdef276a3f99e61cc30365a6d23c756a633943345bf49c21e2d7e1f77b1ad716e45d905c2d57fc63fd9809e632b76e8bdf96605b03bd227e902751720dad375478de4524b73349e60779fcd55875e9c23be1c2db9b84f3e29007165336afbae382734cde2422a765217ad30c2bc5f66676a4a971256d6f1307a33ff511fed42bc93a2f3a605ed5c1943c9c625f2fc9d3074f9e8e98e07e010577c204f70f28b8b349303723df90eb8dd9201717dec5249c371506b0e4eea5285274e1d9b8f0ae98f08106e13d4d9abb08ef86953b830ce54e869f72a73ba6f66083da07f854bb0756a80d4943a1968b091f6a147ec80e7e84f7c4fc7098c10f5bf9f4c35e98f0823438791e267c1383f00c9fc27b1b84178a3c7b280b3712621ec29a2c562fa97294c6eab9761c8e6ba4c6306659dbc5420b7e9c6b917ae8cbbd1ed994195aeca2d899c8bc0fc4d15bc15f946f2bc226e65a8e4f402b8898ce58edd9c7e4f0bccbcddffa4f8acff2627a81a387394744559758fff8de44a127ff2b295fb4c1f3455f53be10354298ed2018216e5c3b6884c97f45e593dce2f1f234be58416b3940c546b441bcad8899db545e9e8079453fcc2b469abc825790b5c027265afc6d8f1d67ed2df1e50bfdb127179b9edc5df8e3028bc1026b573d95f74ef8a246ebc4393e1c6eafcbe4478f7c4c8f51263dba003d968a1861a5f4c7c66b3000d360b449836e4612d365b9d2782d06625a6c61d2a223d0a25ca47d5d80670fc29e3dc6f4ec1cf0ec05a28c5c2247c7fd9647834dcfe5f5f496860c5ec4d37e6ca246d09f331c7fce10ccbead701f732b7bd789491f7e2c1d6ad28097bc5b9b2ce53eb68d5e26e94f2bc29f360cb3775b93bd9d657a8e12fe93b0baf1fe54803d7f3bb7e7737fe2cfaab4e8ae0ee4cf9b60cfdfdef4fc5e0e7f86e93ed32ac1eb445adb33437879a7464afde8b329a6cf0e267d063af4f1abd70241b1caa77f6e66d290f7af7664c9fdabc733fdf5af869b84f3126c1c0bde91d81c2b43c663654849a3ca9011a6e7f01c3c01cbc11303e4e042ccaa499855931b65551166d514ccaad200568dc4bc6c2783970dcef2e765c598f09d0dc22b7d0a1f6512cee395fcdd889491a42eb8e0d198d6d30c5a1f9fed4feb2db08c373d0d196f0c86644640245b6248661a905cd2d61f92b198d6bb04d47a2b4ceb5906ad7ff2a9f5d626e13cb0c6c7b60305f4b7c178cc09c8635b8c479981c7e876fe786c87099f6b105eef53f8f698f05d0dc21ff6297c072c25770b9a923b626aef6e507bdbf6fed41e87099f67107eb24fe1e34dc2793135df504c1903de2ec55409a6f91e262c39fe349f8009dfd320fcf50efe844fc4b0ec65c0c27ffc60996412cef3fd8280f97e328664a101c99f3e914cc19094a7014929267c9141780b9fc277c2b05418b0ccece80fcbce58a15219b450998aa95d6550fbab4efed49e86095f6c10dea9b33fe1d331e14b0cc28ff7297c06e62a4bd3e0873331e1d56910be0b267cef34089f85095f6610ded2a7f0d998f09a34683ec7249c17877cbd9520c56119a6f58a34683dd720bc500c958639e7118ea5f88fe5af340136c6dff9eb6ba6f98ea99e8fc5de77c592669f3424cd6e9843ad0ae850bb9b04f3b29ebf4d1aa8ac9f87a95c1f50e5f926c1bc285ecd928be203bafb2b8af730e50131a25f4d9a07caac63d58cbfec37519cad16d1b71186d144ee936e57f35c308df1cf43ac167ab8e797359ef3cb5a915f787c8c4e572c6fed694a721e7f5ce7c5975c02957b6182f70d287801e6a4fb199cb4b2873f275d881535fba7a1a8293709e739e0002f48d6e2821761ac0f0cc8bac22498471d0ff222d825c05889a13838208a2a0cc52101512cc6041f1a50f012cc9f0f33f873cf5c7ffebc14e37c7840ced5188e2302e2d81bc371a401c7069f389661388e0a88a306c37174401ccb31c1eb030a5e81093e26a0e09558021e6b48c0037afa4bc05a4cf87106e1137af913be0f26fc7883f04ebdfd095f65105e28e61c8639519e4f3f59258627fd77004e303986b141c3bfb3619a24effe74ac8952674a164eee242f9e7a229e24f526c1bc5776b217c1b5b8e0d5a6b4165340770931adbdbcd66e4ee9533ca7f4a922a5bb2759e5fae637426d8d29393835f1b90b4d1d5116eb49722a9e246bb1bc7dba216fbfee336fafc3343fc3a0791b9f9aef8b697ea641f3a2befe34df0f137e9641f8fa7efe84ef8f093fdb54130cf527fc0093703ef07e4ec3096de09d7f3dc1ffc0fb81a6e7f034e41f89489a12c2137d012b6d98f4b9429c2ab1da613cecb1ccfcdabe8fcaf52053c922e67faf202d59524ddbe51dd0d522a78f00931de788672796180832159aaf1dd6d7d001e33fe6b2e93c513615b3d4938ed3a13d56aa1d8c6582f30d99608f027f99e01093701e63e25f910814633a14937c4150c9879924f32ef6852c7817fb7053fe10af302c23cd1fde03376ae271fa024dfccb21de6aeb8b458ee0539668f5c5f2c211a6a4e7e1844b4c26f808271c8909be34a0e0a330c19705147c3496bf2e0f9abfd663923704957c8c2973895778163749e6d2c713d297a5aef09ca5ae14596a53972c15444b2c231d6b4a639e12577971cb2bf1243e0e739eab833acff126c9bc8b788d17955d422f276082af0d28f84493603ecc729d17c12ec32c279904f33ed4f55e04bbf43b4fc652ef86a0a9770a26f9c6a0924fc528df1490f26998ca370755f9742cfd6e09987e67602c6e0dc8e24c4cf06d01059f8541be3d28e4b331c97704957c8e49326f80f24f47046d809e8b09bf2b0dc2ff8531b93b28937f636adf9306b5cfc3d4be37a8dae76392ef0b2af93f1890fbd300e4024cf80369107e21c6e4c1a04c2ec2d47e280d6a5f8ca9fd7050b52fc1d47e240d6a5f8aa9fd6850b52fc3243f1654f2e51890c7d3006403a6f61341d5be0293fc6450c95762409e4a0390ab30e14fa741f8d51893678232b90653fbd934a87d2da6f67341d5bece249977d8f937b78274d8afc704bf1050f00d98e017030abe1113fc5240c13761a9f772d0d4bb1993fc4a50c9b760925f0d2af95693641e727ccd0be68b71c1b79904f335665ef722d86551a4dbb1acfd461ab2f61d188e3703e2b81373e7b702baf35d18e7b70372be1be3fc4e1a38df83e17837208e7bb19cf25ed09c721fc6e3fd34f0b81fe3f141401e0f9804f321ba0fbd087619cb7b10f3bb8f02fadd4318e78fd3c0f9618cf32701393f82f9dda741fdee518cc76769e0f118c66363401e8f637ef77940bf7b02f3bb2f02fadd9318e72fd3c0f9298cf35701393f8d69fd751ab47e0613fe4d1a843f8b09ff360dc29f3309e761f5efbcf07609ab3f6f12ccc72ebef722d865ece2054cf00f0105bf8871fe310d9c5fc284ff9406e12f9b84f332957fb92d5099fa8a49329fa9f0b317d82e2becbf6a12ccdb8fbf7811ecd27e7c0d73e85f033af4eb26c1bc64facd8b609792e90d93605eb0ffee45b04b0df026e6737fa4c1e7dec284ff9906e16f630efd5750877e0773e8bf033af4bb9843ff13d0a1dfc31c9a2fc319c4a1dfc71c3ac38b601787fe004bbd16190153ef434ce5960155fe08cb83adbc0876c9831f631a6706d4f8134ce3d60135fe14cbd86d328267eccf30e1596910be11f3bbeca07ef739566ab4f502dba5d4f8022b35da7911ec526a7c89951aed03961a5f610e9d13d0a1bfc652af43d0d4fb0653b9634095bfc5f260a78079f03b4ce3ce0135fe1e83dc2528e41f3095bb0654f9470c72b780907fc234ee1e50e3ff621af708a8f1cf26c1bc40ccf522d8e515995f4c8279b1dc330dc5f2af98cff50aea73bf616ae7a541eddf31b57b0755fb0f4ced3e6950fb4f93703e07a8af171f719903f417c6a35f501e7f6392fb0795fc8f49329fc295ef0586cb142edef63666f1011986d745f81a4c70062afc22d808b142e84aeb610bd8643133b45c5cc557b9b55754e6e7b1bbddce38cf39bfe4e6a7d4c9c06c1d68b2b5c4a3ad13ace36bc43ac5f69aa9e9b1129ef363630bccc641261bc7683626be0a9478f5d1b695cf065e29d7ee35df819f49c8f263494bcc92c1264bc66a96c059ccc16d314bf3634d2bcc9a21266bc6a1e9023d6f2ae333d1ebd0fc05edf16667e3f3562666df50937d7cb935f3bcf2e4173a1a977afea5fbb1b63566ed3093b5dbf9f04dfe9e41bde7948492f47be65a5656b34a5f76b5c1ec2af092e7e0f70a82e739b3343fd66461d66c62b266074f796e9c45b412ac901d3ccf25cef8b12d1bb36d53936d5b8bdde4ef4796093b6aa43df67b2d0bc40ba175f276ee416ea561fa4a90b698459b992cda5e4b2de773618a9589975a5759d74e67fc8b02e568da3965a4cfb2769865c34d96cd46cb46c81d5a3891ed63dd5a2ed3715f97f2cf99725eae491783f61883cdbd94986e258bbf12134a4a47899983d935c2645755433e542fe5c2577213af612fb66eb1df332b6db832f1a2ef2c913a55a2ddc9af861c668a77d296c86f1bcc159e5f6dfd5e84b432210dca9aa503c6a9d0c4a98c9813ffba4b095b2d2ce27213f7b8130acea123c6a1082be54ce5f67491d66b458dba4c6a675bb744e686a9d6b90a21087edf815f6192877d77d88f659d30cb469a2c9b4798c29303e7043c2ff821d21923528cb5f9fd95fba5a22d5b23de49ad96be1b6699de05b36f94c9be42c49731dff3d21269bcee5d31dd479b742f6e94ee2a2fc26fdf941aac685c0bb01b66c116588fcb7f8f7286f82a916a5d3465ffb23b66ed1893b545a8b57aeb6172cad6433ad2aa07a6fd968deffd9b5a7d4d953ab9987d634df66de33975fcb5ed70cb1a5353f7c46cdaca64d3784f6936dbba7891a869ca4559dcb47dc85e98855b7b89879a2d2c15f54d743c330fb3711b938d133cd9e82dba1da695bd312bb73559b973a36a33d5aa4a9c1d6f6dddeb33caf6661fcce6edb01adc6b0cce6f9dd0d8f6615fcc82ed4d160cd12cd0b54eb4fcab44cbafdef2cbf49413fd303d77c0bcabb179283aed8dfe98cd3b7af12eb778855fef82b2fc58908f5930ce4b9b43d7ba04a417d7955fc799f2de97aeb15a4cd1ab858d8bee0ec0ec1befa5f64ab68ffb65725d95b8cedbf1f4b64106623696986cdc36858d766b2a71837b5c97ceaa419855134c569dc89a2a1634c1daaa1aaa525c5b21a456b2ba14f1037c9417b724b1a89f79493f7fe4db58ff3232f8843dfb8bde3cfe3d53dcc1f7ea58a1f86c785103dbd45f38e7cfe64b41f2f2744e431c25f5428313ad446dcdbf6ac47f86657087a8970584611dae1221bf467aa1dd3ee6a3129305912ac1b8c2da9fcaec2f037b5df0d1e4272380a740ebbc2ffda82f159b91d1465aa46459a4c5c7d19b9ba59378aa7695a9daa2507c6e7cb3467a536a2d26f3a7b534fb50f2775b605e34e96e0b505fd6cef0fa59e694cf4df5bd98cd8500553ba61457068a5d93b85ec2d9ec01c955cc0edc4cb1727c9bcc16453c3da65042b3bf13ced30682db499630bcbc8c03ae7559095ca594b83a30f8e9655b09082e16b0da2760ed4409ab2773fb0e7ca25553663daf52b649e300f0eedc04c09de94bb459e2e695a231611e0e8a033406bc6e2a7d89663f3cbeb8d6830a601a25aece499954f95adc908ded9840369d12598eb1cee4f19ac531695edcde36816a0625aa5eae55409cbd6d5d8f04c2999408bb3a109608bfe3319b6ad1cf881bb699dd13d876a1c4d65a60b3c35bab62922df98f82332b3c9f4a1e112815d1912aabc314076cb7774d609b4d89ad9dc0365164bcd5e2f1a5729a461c300d07de3587beddefef6324710058393401b08c12a0fd9975982179b16f2f6c1f07503dbb2440cd0daf3b9e5c8ec501d652006b57fa42df2d3ea6326c1cb065810ed26e94d8fa32b726aca92c2b91a3a04bbcd81e0194c3413c63774a943d5c51c6339af6b068d0b6c9d4844f4a12ded871027fc4f1110d1e17e121f05a7194cbabd44738fa5b97444ef3797084a220a95d5fe0d22a2bf010de2e48d19d2ff0516e16781e8328f010a62af01cff2b4819972ef018e729706d7be8cf49ae700b7c742df46bddbab605becb8e8246c61e0a0216f8058d0a7b1734aad19c181c360fea16f1c1e1f9ffcfc76df9a729d91e1c027f479effd835dd9e610c7dd8c3f42b580d739bd0b4c082384ad7a14f920ece6f5bb97dea34db51ef75f0626063eabe0b59a2e1b057947016c712e72d00e78228e11c154b9cbf039c0bc3c0b904050ad5e7997d0c1dce6c2a9c3b019ce551c2591c4b9cfb009c8bc2e87461309d9eb9051dca5c2a94bf01941594283bb144cbaebaa11dcb8fd48ade08bf2c7ef8ca00becaa6f444288efb2219ca3654281f0728ab28517693282b64035d9fe89b98ba4d88f1542a8ceb00c6c561c58fcb45c72ca4cc7c2215ba3a806e0925ba3c067bb9a9e20afc1c573169fc2206edc8ad01d2a5f4d3bd78737b810c2854b29a067c2178e55a2a84cb00c2eaa6ac629caf4614d1a1aca542791240b9771855cc48eb7f55c39b0cea74481e49565357018ccb2831f661a97a3350207c1d89b0e62ea2c23a1460ad0923a3630d20675b9230a39379681f807239f5ac166775c3bd7089a52a19b43e54d03a01682b9a021a61a62583d611405bd9b49916be624798693b51a1ec0150d68651adf8af5408233c64d5ca8700eb3e518a8c938672c97a3497019caba2849334944b86f36580b38e7a065785eb88f02cf36b543128395b0388f59410bb4b9facb12ee2feb8b74b3c9cb00a220be77e0a40ae8ecec002616b920ce54b00e51aead6a47d839a28348fd96b5b93416b4705ad1580b6368c00c5a86619a0a80118d75162e413be9c3d1974b279fab075a7c2d61e60db37acf0185c18d2ee06c6ddfb16038cfb5162cc65fe06fbb78ae150ff7600e6fe518239368630b705300f88124cc27e3519ccd100e6815182393a86308b01cc83a20473cb18c2dc0ac03c384a30e338d76c4b00f39028c1248c9693c1ec0e601e1a259884c10a32985d01ccc3a2049370c23319cc9100e6e151824918fb2183b9198079441830b141313d464e98cdc922e4dd00cc23a30493b0022283b93380791425cc2ca64786ea6238ba9d03701d1d9d292984dd45b2a8d04080727d1828d5188dfdcd187c70217e430bff01288fa144d98f258fd278fda8266933886cb2e96b00edb1618c6e7befedc4b1555902701e17259ca42f7992e1dc1be03c9e12676fcf19df39299a10ea9554505f00504f882254c21e1019d4e701d413a30895b0de27837a2c807a5214a112762fc9a01e03a09edc94535e9c4d7cc250315913ff4780f2144a948398b3896fafe7a33e7ee4fcbc86da8eb7cef20ee91a562da628aca2f557b229329f03c8a7366538c4e9afa493b4c83cf64000f3b428c18ce34b279b0098a74709661cdf06df14c03c8312664796781757490d690612d93be0ab01bc3329e1e51bea743fdf3a24ad82ba50e13d11e03d8b126f8ec4cb1fbc58d6f4b66c1ed423039749058e0170678751423a5fb04f5ee82e8457ebc9a2a05b0098e750c26cfceb52844d22b2d7a59e0258cf6dca218ff84f50e80250fe2bba717a42b46471fae301da7f871158c6327ff2a0701c8785cf0338cf8b12cee258e2bc09e03c3f4a3847c512e7f700e77fa2348a343296738d27009c17440967712c71ae04382f0ca3c1c41bf33c535782f5b09bc79b43cb01ca8ba2138b271cd52443f911407931254ab5e2b98ac5af1262ec55dcf48937cd613ae25f00ec254de9a3a10d12932d47f60f407969183d78ffeb6811667db21e7c11c07a5918589d51a612867f8a21ce4b39ee0eb05e4e89557d6d631473be1d1c52ed4e16369e07006e68cac892b3768fe3b8657f80f20a4a94ea3b28aa76af60eaf5fee6b5f0c92f00e895614fadc16a755811c57141bd0701d4aba20895b0762783fa04807a7514a112667f32a8b701a8d744116a1c9786bc0b40bd360ca8c9cb889b3f7916e756e80e00ea75510a2d8fa45c5e850ce7d500e7f551c2591c4b9c1b01ce1ba239264fb8a005598ffe2b80f5464aacf0a38a7c80782d0831c7fd5335bb0088374577349ef0dd4eb2d1f82f01da9bc3c8f6aa3b0ac323a5aeef79c6b153fa07c07a0b2556f5f190d1acb97d3ca41c20bc354af53be9d03159fd7e31c0795b9470920e1d93e1bc17e0bc3d4a3847c512e7df00e71d94380719707aade143ead55f4c05f95600f9ce384026acf9c9201f0e20df1507c884915432c8af02c877c70132e1180019e43b00e47be20099b0ff4506f90b00f9de3840266c5d90417e1740beaf2927fe84360395ac63fb1940793f254afe681823205c838c6c55fa2c00eb813032b70aaef08bf9edb5ccdf5bf584ad5ab2b7eadf01901f8c03e4382e5df00a80fc50534e008aff975ce702940f87111a2c6e76a1c1a500e1234d599f4371f1fcdce80300e5a3942887303cfeffffe1cdfb3f01e8c7c2c8f6239b5db6af04081fa744a83ef2835542ca52524f245b62630dc0f8042546f3520693199fbe13f2a41eb26c3d07c07cb229aba2d0d6c8236b189d0e503e15c650b4ff774a08b33bd90c94be00ebd39458db32f899d2c4ec93f805393a0364cf34656fc7d9be249cff44d6be1c02503e1b46a64e55d9386745c575059d5d01d6e79ad6436d51f6b7db09ab1db22f10e70294cf4773e22361a098acda791f607d218c0912de577e88e3e7a77604385f8c124ed27549c8701e0c70be14259ca4abe690e15c0070be1ca5d950a493c6c966436d00385f8912cee258e27c1be07c9512e7304363c9392e648fad2f177ff331f7d542e4c486cf98cf11d44208289f4705fb2000fbb5e88cb5c7f16341cf0094af53a2840b095789ecbe3cac60315934a91ec07b83121eaf5413618f59d6612e287efda07600d89bd4d1755efec15ef94ed6117bf6917395dbf8058447018c6f5162842f7ce96b8ac5fd85af9900e2db941007182a113b26c4e76aacb0fc92d7d0b5ae4df638ae6fdb02007e273a114ec240075984730040f96e1828bd7d1d9170c63159b6bf1ca07c2f4abd72d237e4c932f97480f3fd28e1247d439e0ce77e00e707943883bd854c98f1c966763c07d07e18cd183ca1c792c5e0bf03583fa2c4da9d25d6bdab6a0866349ff6e80c00f2e32895a4a41faa202b49c7019c9f440967712c712e01383f0d239b275aa0cdebebdce702909f4505641c97bf380c80dc181590842fba9281bc0a80fc3c2a20e3d8b5bc0080fc222a20095f582503f92200f9655440c6f14dca6701c8afa20292f0dbc56420df0420bf6eca1147672c93307393c532bf0528bfa144c9c7fae11b40891170fb7328f11bf76903d07d4b892ed53ab45808238e018cfb01d4efa208756c0ca1de03a07e1f45a871fc72c77500ea0f51841ac70f9a1e05a0fe1845a884410e32a84702a83f45116a1c5fb23a0240fd6f14a1c671ede43b01d49fa30895b0b74406f54600f597284225ec379141bd0140fd358a50e3f806d1f500ea6f9450f30d50fd2d4841d86225ebb09e09f0fe4e8957ada630da3138ac4ec7fdc3a78b00c63fa233938eb0b74f86b200a0fc338ab340485fce222b477f0258ff8a2256d2b733c8b03e06b0fe1dc624060c6bf23b6f847d7db297b4ce0738ff89124ed2392164386f0638f96cefc8e01c154b9cbf029c1961e0f43e018cb0674f3663692ac0d9224a38495f7025c3b916e06c498953bd28c81fbc58a054b257c84be2d7eacc00f05a51c2531f872e66cdebe3d0bb01809961001cd9cc006e0300b6a604a86682606561dce76f5e0440b6890ac838cedffc370099151590719cbf790d00991d1590719cbf790900d9362a20e3387ff36e00b25d5440c671fee6ed0064fba88024ecbd90817c0880cc890ac8384e84bd0f80ec10159084031164209f04203b460524e1544332908f02909d2841fa9b9a4dd800220b53bc0150760ea3973dba99f5b22701805dc288393a5722b69599c8ecd5b5d4cbfae42b109f48857315c0d995122777087db9a8a98cc71feb63be54d45880b01b2542beb4d75a79ba12bc6b41f84d35b291984c00ad3b2534356da5482b07ed1754e23e6d652f80b10725c6c67f6c218e33d64700acb9613478bccd06220ce69279683f80b267181eea7fda4a1ce7ff7e0cb0f6a2c41a6c1523c288d05a2ab4ef01b479519a73319232524956d35f0a70f68e12cee258e27c04e0ecd3947d71e728631c4775de0228fb52f77d541bb4797dcb6f0f80b05f182136ee6dcd7169b2890064ff30408e6ca620a70090f96180b4e3423084c11b42abc38a0c91819c0d400e08a3a2e1205788c22ae18dcda397be02a01c189dee2461bf870ce5208072501828bd2dd31cc7d941e7009483a3347b77642cd762df1ee01c12259ca36289737f807368947016c712e77c807318254ebeb39f8c0191616a4785a925c054109dde751cab97a701ca4da23369208e5fdffd2f40b969588365cdef1def3d01c6cd2831e61b3cd2df4a0484233d64e3e0a702bcc3c3787d897b69b9e820d685e59b64e3391500dee6d11c268be37a6eaf03ac23a2d35d8c63b4fc4a80b2304a0df29194732ac91ae4d300cea228e12c8e25ce7d01ce916134918a9b6513a91a602c8eeeb402c2e611d950d90900eda8288d8393762fc9c6c1ff05708e8e124ed2f81019ce6b01ce2da28493347a4986f36b80734c349bf3715cf3fa1b8075cb28359a48a76691359a26039c63a38493746a1619ce5a8073abf05e4db195986a5d5e615d50e38827c57902c2708073eb30667260a3e6ce8c1e3f90bd00c86da202328e431a3d01c86da302328eb1a4f100e476510119c7f534f200c8eda302328eeb69cc022077880ac838aea7510a40ee48093297f9eb4812f677c8ba91670198e3a204937039083298670398e3a304338e018e4300cc9228c1246ca093c13c14c09c102598715ce3f76800736294601236d4c960ae07302745092661d3880ce67100e6e428c18ce37b9027039853a20493f0ad0a3298a70098a5518249385b930ce66900e64ed199f84a5862924d47f804a0dc39da3336099b4a643336cf0078a786f5ae64737ce9742100398d126496b5b3dcda5907e0c50f5736c0359d12571e73cecab45f2fb5c7c19d6565485f2e255bc7ed6780744618eb0aeaeb69c57d5dc13100e0cce8bca34bd86924abb5f301ca5d2851f69528ebd952eb745d439d5d6629c3e1aaed78eb62beeec61aeb2afe6afe2a5ab0646fa71502b0b3a20a96b0214406767300767654c1124636c9c00e0660e744152c617d4f06b637005b1655b0845d4e32b00700b073a3d30e201cbd246b070c032877a5449963ed38d7d50a6571dc3e54e03a0070bb45693236e9ac61b280dc1500e7ee51c249faaa1519ce0f00ce79d44b49f08bf93b41f1c3d416609a1fc55700485f54217b05e00780758f2862257d9d8a0cebc3026b9b4c4df8a424e125a204e3655885d0df6ebc8c6093457d5b25905458fb53456bb19e2db480ccb7fef94b8b3dad7fa6e319e2e5ff896c1dab1547b9bc4a217bb975966b56c78afa5b97ecc95da395748d0261945a95a6402ca46f3f7f89f58feb3ccf71cebcc87e414657eb5c85d5d2e0b62f63d3842d8bc4fd75a2755c6ba56bb9d089a3cc10b132aedb0aeb7a7e75bd75b6525c516ea568b9752fe758986f5d96c1e34f76cb7a44439b7a847cf971b9dc53c753cbe4ecdca5edc5016598f34e4dda523d9545b6a3f2fb175bba570867e44753599ada3edc83dabba44ae1009e16cdd9fe053cdd65b20b37cd152e5f66a57ca574de19d6c5954229fe93f97ff0743d26c8330200 serializedProgramBytesString: - serializedSignature: eabafc01921a6bf0ff9c058f3493c56ec5a9cde03068df9a4ebd4fc837eea39c34a20743cb610e26c8a4e6b8f8b46065677e83290f123d6a075899b1f8f1e507 + serializedSignature: 4d88f6a1279f09761a0d0efe8a86993f306934d2b3b1a8fc498e3370fa25f831987b7dc17dec1ba0881d9c3a6310615afd12223f9214ba696f297c3864cc3f0d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset b/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset index e25ddda..0195f8b 100644 --- a/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset +++ b/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5bfb5a1347149f0de466122e2204d45aedcd589504b0d6da8b55a496d6aa1f24fca1ed8751169b7e2150887cf8b54fd047e91bf411fa027d87be41ff6bcf39334b26bb67b22c309150c397bdccce9c39e777ae3b136245011fe70a1c96c482981593a22256c4ba68c0d52c9cd7e04fde79ed8fc4269c5fc0b10acfae88f32123f173d11987e33cdc6d89268c7c299ec3b946cf17850bd7f330d6853b6c5d85af0bbd9c7e18541177c543f140e49dd110124b34684bb53928979382e31df10a9ebac4144e52a44779382cc2932d7ab6064c7bfd9e881f48ac3578f61cc66c8a3ad07c4614533b707448263ac5d5b94f9db3f04dc0f7a4768f52fcaaeefbd53907dfb46f6c42eb83d723bee749d57ecad73ea0d11a50e741d57754bb07bace906f6c4a9d8754ff31ed1ecfc3aa3dafdd3bda7cde3ce3be796ef8f839e1e33da668a4d4b58e65465da7b8be7187ace26bd053556c88220dbe14c17cbd91e1868ba41331a96bb0609cb60926b2010418eba9906d36c58c9866ad67c2c96a7ccfd2b10a3d6a44742238c51f812990b93afcb99ae96f41fb3df21c34fe1a3c9914f7e18ca39e8a2930e6273e2a4b306d1ddcc71565386e10bda7c076b0679848e826fe310b40537af11ab478806ec07d9d385ca4e33671ea12f7f3d0d6a498d280a87207ce3b345b50f64db8e6e62c2bc8781e796736b5cb90e1a9e92e4883dc17c95fde68e4756804a14f4c2837ec2f5204fd2da0893718ca2013a72429694cc934d5d6362d8a146717020846973128216fdf12efebe25a4759786450dd67488296867ff9e7ef3f33bfffb5136f176d461429859e0d11ad13b048afe08c05287416211eef2f21a37ef81d0e7e4ce3ce6217e197fd6ad42fba02129499da15406544192e76e05b279f4262b3c48c64aa2e02da292554115360d26718932688631cc4a96e431c1e533a419cda95ab05317e7804d30604c3783021d8c72148f5ddf756110c165fded51d18fb2320b14d19f5258ce78ab5ce9862c179d587298f6786f03ccf9690d1383221dccf218c0c3a8fbb82f022d431dfc2b32af477295762bbf4d9961cedbd3aa39bdd33ba3942f79c86ee7eb831211b67902da5d47b87dfa5fe854f3ced63120ddd403cc111c7f835c885449c7119fe4af07d49c2e01dd6f8f245393073d23c73d234f350d8cccb001d1a2a1a83ab408d3273ca34f3303733ba0e965a553012699c4db8c67151e64c73ee91793d45cafe0238beede7f71cc0473ad61851c3f70993c64e711acb92ad9429d5be201bd9148f9406a3e82c6372bc51c6f156a00e8ae27859ce20a8b1dc4583c067eb4405dd29ba51a0822ffb8d82b7883c59c47840b870164c5691e3f483a632ce456ebf6e7266dd0c70845197137b219c31131ee408a3d24fb338fa29e7cd948738732280ba59223e046dfd24e4424174633ab3e7847b56f0e561d8fc264b1ae6f4827a7ccb14f4fcaa1931abe6a429789de382d74d21d8eaa0420aabd3525a4da90553e13c5cc9e135a8d0b045874407c4ffacddf1a204c61193446f7312b9bb127935a4be002913021adc2a2d15a264f3bb3de7c00ce58af90249e18294dbd47b52c9838be2edabf54b548ed4e0f88ca4f3cbadbf85ed1dad259801118e82d329134ee7399c2a96716a40df59980a2542baad319d113a380ea3261c2e7038dc16b821d2508bc673c4458d561a75fd48b9d6216ca10fac518956534bcdf8249cc2e1f9c39849be7738f91e5bd4f3bd03fb83d923a220923721f22e87c8b42f90cb35162997a7e932b4b58ac72871ae352a8a04e32609de33d92c3fa76ea773e267e85e5551fc55074ecdedd16d36097f0ebdc6cca995ab576021eba4f126502a52b95312dcda00bfbd841cac01e2387379d7aec2379bde17e6cda6d54032dfefbe4398149c874d6a3ea64b172e93798f25a924f26801d254ff1d37493fd0b51a2b52257a799fd614cec5459cad8fb7a1e82bae92c0038a9340006bfc65e5182e854f5448e82c6165e75522e02dc91fc22e2b9ad66d806785eae62df8bb0faf9fc978ac84e8176c429412c197eb5e00083f18097dc4bf3a3467dcdf7e44306c0c52a0de01f6d629fdb920842f8cd0ebca51e3fc921e060aac9d140c0ed6ca507c66296186faf07f9e3c4a681818571327bd584bde7ec5a6b78f09b9ec2a35d6a0055f73dd55f2cf7f905dca745b4c38bb17e1f6131786442b705eed0694cf952d363b96e116a14cda8232a141396913cabc82f285d12e2b6d35b34530d3b6c0cc6860166d82995360e2c4ab04a4471b5ff3ad0117b7059cd0802bbd4e87ee7d1b8c6b504e1d9dd838dd83b131a541396d13ca0b4cc646269ab461db10dfa85ffb1d375b8d6900cfd80418e9cabd6f6b20e56c81d4af8174cd264805658575e854a7f33a5ce1ca97b7118b25f4b26f1dd4fc4b14ab3699b105f78006f74736e11e34e6f086ead27b11d3d1c0bb6e13bc5126629a565f2d5ae1882d208735203f3e3a597caa076d32a94179c32694a7199be47685f5df9559b54e6b2929a741fa894d4831ca6fd33b8d0b9df434d47b89a54f03ed663762a3c9a57b3d36a635203fb509a4b764614a32ed1b7956c1ccdb0233ab81f9d95102d362aab106e6a006e6e747276bcff460d63e218ecdd64f098bb92f44db4e8b39b115b49755b9c732ac646ec0ccdf095c15a8c2b82a9d5bfb2d45fac91a16dd51f6703bd30cdf0cb9856239bc95d70f4d5787b1c1c3497a90cd9e6c07ad14e9c776c759fe2f85fcb769faa099e6c9a42ba0f915f54bfb87d0798598c24ffc3f9d0b5a32d13f0000 serializedProgramBytesString: - serializedSignature: 96b52298165a434b0b7d62583b12178ab65bf5b12261f22b1f6a2fddabb270185f50ededb53c7c8f8c86c238c7cb923f218c5e3c0cc564d450aa881de602450c + serializedSignature: f8aed0fc691c8026c1e8e477bb607acbbed81b814a3f8a8c43400d154950aed7f7d604d97957f074ee178fdb40e9e39aecf899f65057323e2c3cd67db6bb730e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset b/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset index 20daa24..01a5d58 100644 --- a/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset +++ b/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c14c7f7c0e780e0c55d4309103481e02e099022c5d2d2d2164b08b4414ad0babb507777777777777777f7f6bf333b73f77632efb27b7bef32cbef0f9f64b3bbb36fe67de7cd9bd9b1ad95c79c7fb17eceaf1dd81c36890d6025ac94ad66ab9cbf2639c795ce7ff74c5d9fc5d63ac772e7f762e75e3f965dcd93fc5faf583be777b17356c9d6394fae674b9de30a717f2e2b73fe2e769e2d73cef8d565ce4f99132a56c779a88415b2edd94cd636d6ba1a113b88872ae5b518d72b56dff93d916d76ee968944f148f2c4adb6ceafb9ce9d4a716fa59368156e01db55a8b5d2b9b7d479662dab70642e1112ebdf3c87893f987be8248f9de5b1a3f3d340fe5d5bfe5d5ffe0dc3f3eb5cbb5d9284ed02c22a995d9d9f2ce7e777799eed9ed7da479e7773cf63ad34190d818c6de5b1bb3ce6c8630fe7a7aef3e7df3ed29fec5e4b29e71f79de4a9eff0bce55daf8f5ffe4795bf7bc9662db4e9ec7e4797bed3cd5f4f5948c4ed71835f299770de5b15735e193c968248fb921643466c2866a9d9f246c171056c5d3dbd55f845336cb8f37803037c8631dc9bc96763d4b5eafad5daf8b5caf875cafaf5def238f3782b4dca83d73937ca60e3877feae73b626e366192e0ba419ca53f7eb6acfdd22afd7033ac1e76e419ebb557bae9ef6dcadc873b769cfd5d79ebb4d7b4e5dcf01e7fc7e7d57c7daa5f27a5ff7bccee349ecc34f79e92f8f77c8781a80737ebc5d5e6f08ce9dfcc8eae7c69fa57cdc0079bc5393736735720e4892c67ce6f57ffd34b67769b6729794f9b8fb1c471ab7737ebc5b866fa4c9bb5b93d7d82baf9e6235481e5f96e1b691e703b574a9fb75b5fb39205e785fe5c1fbf27a1370ce8f6f21f11568f7f5f854bd3540bb3f580bf781bcdf543b6f96246f545a94cef7c8679a8373875dfdf9d5b01b520d3b753f5dec943c8c9dba8fb11baa854b859dd2f54396f083ca46954dde2fe5b40061d5757e7c96796dff5957062f5e1e7fa8e4dd2bc3b704e750ee47dafd8fe4f1639046c5fa1370ed63708d1f5f91725a8173275d0d6e665e7fabd2f5a016ef835aba943db406e7d0dfa8f8da68f1bd9e84bf929d03ce818fad5f21af0f0bc8728481d548706db43c8e02d794ecfbc03568030ddc30799fcb6bc3e5f10110fe3ecd361e605e9b1d13903dd44371867a8c35e8a1643f64d0e3e1247a3c02c23f04c2ab7b508f71f2584f93ffa8a6c7a3063dc6fbd443c97ecca0c7e349f47802847f0c8457f7a01e13e4b1be26ff494d8f2743e8a1643f65d0e3e9247a3c03c23f05c2ab7b508f3ce6f5450dc0b95306b739400bf71cf3d6bfcf316f3954721a7be534998ae4fbf31a2ffdfe0bdafd17e4f1452d1d2f6ae97849de6faba55fafa35a8374a8e7e0fd76daf3ca573500e75cbfcbb570af6ae97b551e0b34398dbd729aaed1f25e71784de3a0df7f5dbbaf7ce71b5a3aded038bd897052f755ddda1aa4433d07ef2b4e7a1df836f3d6816f6bf2df6109bf6d7a5edd6f2fcf2722e1ded5e279578be73d4d4ff5dc2496282befc963218b97ad66aaad9e6adb7cb23c7ea6d9cd67f2f829f3b6a93f75756b26dbbfcd543fc21479fc5c93f3797239cd93a5712af3b6cd8b98b78c7cc1bced932fa4cc52f7b9e6ea7d4eddff92796dad085c87f21a7be5b5b85d9ecbf625ffd3d3de2bf6a62b7ebfae763f07c40befcb3c88c598a77d29cef9b116125f81765f8f4fb52fa768f7b7f3868bd5669ef665fc3c48dbfc2be66d9b7fe5b26bf97335eca655c34edd4f173b250f63a7ee63eca67bc3a5c46e86667fdbb3441957e57116b8a6cad66c162ff705c7c86b33e5f16b10fe6b799c238fdfc8347500e74edeb452fd57a634ce9547d5765469fd9679fdf8b7f25862887f07704db54b7704d794ecefc03515cff7095d07e6ca6bf3e4f10710fe3b105edd83f9a5de0deb6af27fd4f4f8d1a71eaa1d04f550b27f32e8f173123d7e01e17f02e1d53da8c74ef2584f93ffaba6c7af21f450b27f33e8f17b123dfe00e17f03e1d53da8c7cef2585f93ffa7a6c79f21f450b2ff32e8f177123dfe01e1ff02e1d53da8471d4deebfcc5bbfabbe6ae5b7fe63defa5d7f5edd57ed8805dafd5d0c1c764de8d24ebd4fa6da0e50e959e81e63aadfb62338777eda3d9d44d66ef2a87cb9eae3ad03ce9dbfdbd771d3dc7eb437ee585de6ad9f7703d7a1bcc65e791df2657855c734625e9fbf085c87721bca709db473e5bb555da2fa9e3b83731e6f276f38b6441e17cbf05db4fb4bb578f4fba5f27ad7248cb57a379eb60e5ada54fd50a6e5cdb284cd741a2e8f9d34d9d26663f535d9f5a56cd5a62bd7642f4fc8ceb91f91adeadd069a6c399ed5b150865ba1c9de3d213b7b1f4d3696ef7b78e346f33fbb9afc6face5bf1c37e95413f98fe4953837bda72c9371aafbca3f29fb69c2e27e25d60484e5c7a6cc5b7e9bba72b3c74b19595a1ccd99c787c79a6b725b68f7655a62cd401a24fb584b8d794b37eecee3dd783babb68bcafbd65ade5780eb308d6a4cb09376de4cda967a4f54696ea5a5a3959b8eaef7cb702bbd3ce3f950b79af4a9e772b4fb75b5fbea7d7c99f7be621a7fbe8d96ffeaf9ceda7d5dfe2acd3e947c950f6a4cb5093887dc747d566bf7557ceaa8f2418dc5b604e7d0563a30ef7bbd92bf46bbafe4eee90d17ebc83cedf2c065b423725f2fa3ba5e9d34bd949d29bd3a7bf58a73eeec955b257f9b80fce5be4ff977cc0fa876463a7cc8ee320d72bcbd8a0fe9ca12e5b72b08cb8fd9cceb43b25db939874819595a1cdb6afcb6d5e476d7eecb3908b16e200ddde4318779cb6e8e1b77b743dc78bba9be1e55467b32b30fe9a9a5b137f3fa10752e7d488e1aaf5479de434b470fc940f15debe589fa103d7deab91ced7e5dedbef221bb7bef2ba6f1e77b69f9af9eefacddd7e52b1fd24593aff22197797d48aec64dd767b5765ff7212a1ffa68b600ed911ffb32af0f51f2d768f7751f22c3c5d43860aa3ea41f721ff3214aaffe9a5efd35bdd478a1f221ddb4eb5dbde1e3f9db15e42fafeb549f72267cc87299863c66f621f92c517ef341587e1cc8bc3e64a02b37578d7d6469711468fc0a34b983b5fb72ac3a3608a44195b921cc5b7687b871f790fd9f3db399b78c0ed36cba025c87691cc9bc3e449d4b1f927bbed7666243b5740c950cd4b845a59727ea43f4f4a9e772b4fb75b5fbca872cf7de574ce3cf0fd7f25f3ddf59bbafcb573e244f93afd23d82797dc8088d9baecf6aedbeee43543e8cd26c6194662ba399d78728f96bb4fbba0f91e1626358381f3206b98ff910a5d7584dafb19a5ee3bc7ac5398ff3caad92bff9207f1d3beda1c6e0c3f810bdef613cf3f63d8c77c3f49e9a44d63ae6b1ffd804e6f51913a48c03dc74f7bedd1b776c22f3f63dac03d7a1bcc65e797dd4388de23749b3c745e03a945bc8bce55f9dfbe973c77cadd2bd88559df3a1e29dcc3cfe375604aef3a3eaefae03ce9dbff3ae9672b23479c59a9d156b72b7d3eecbb187d85490c67a9acce9da33d33599d3bcb61bb71b3056169b06aef1e30cf94c3770eee8d5f7726f7835f68d867f1da41f3eb79e79cba92a8f4aa7999a4e33359d54feb7f6ca671be4f9f69a7d6e9447e5e766796d419cabe7f871b666bfb35d7dfafdec0d17ef9f9923c36f0bcef971aebc5e5b4bdf5c2d9dddbdd745b806de67940e4257e843956e39e01cdab9fefcb490cfcf0cf97c61c8e7f531ad6a9e8fc7d7b59af06dab89af658acf17867c7e66c8e7a7857c7eaaf7795506e3759ce223ebb83e8be4fd30759cf2cd703c43b5617690721a8073a76ce65fac852b611e1f20ce61ba77d4ec6c14b8ce8ff3e4fd1c4dee3c4d7e7757effc87bd72e2f16872d4f362be1094d343bb3f1ce81e74aefa0e1ac7f9cc5b4fcd77990d5ce4a67da0ea1f948c623b79d92979b19d34798d3579cf7be588b1a2643aa8f8166879bac0955790ab85db55cbd35d35d6bb6836b623b8ce8f3b6b79aad2d907dc07e74cd95a4f8d8392b79bc6753799ee6c2d1f54fa167a6d4ec989cb5da4a5bf043c07d3a787efe9e66381aa077734e8056d50c9a92e7f92d998aae31603192abe25ac6a9b4ad5ad4b99b74db5045ce747d556af03ce9dbf87c83a3adea652f29631af7f5aa6c92dd7eecb7198d872904655ffaf485c8b2d07d7f8b14cca6905ce9d740d56639e75b574edaec5bbbb96ae3d98b70da3c65f666bf1b5f1c637245793a3f8672518a97b71bb5bc23c3ebae066f02c0f3733841da87a45d968858cab1738e7e9fe1c84e7f773bdcf89ebc9d2a0e2db2c8f9ba4fc95525e6f70ce8fabe4f53e5af8d5f27a5fedfa1a795dbda3ec0de4a8e754387edc5386cf06e7fcb9bd12f931fb7a796d1f6f5c6c5fa0ebfef2b85fe2b989eafd41a5bd35087f80766fb7c473ed8ef0c1ef20793c50a67badc64ff5e7556afc54f875f27a7fedba6ad3abf9c9070339ea39158e1f3768fc54bbc3c4ef106f5c1e7eea1dc22fbf4399a76c04e6a7dea30e63a9971935375e9519d506eb08ce9d323322db1b8e1d5e4d9c6d403890a7a1d3b7494bdf2699bef35d6e23bef73e17dbcc3c652ca6caec91f27c2f793f0f9cc3781a7ae319a9fb8a237c723842cacb4f12d60f87a398d7e683ca39dee5149fd32dc7a3627b4bb903b5ebfb324fd913e7fcb89fbcaed6eeb403d7f951fa92d801325c013877388e5aae85db47861beca66ff4fbdaf5988c678bbc7eb816bf4a9fe23c043cafc2c3fb6aadce09f2fa515e79b113e43903e7fc78b4bc3e4c937f94765fc9571c0fd2384adf173b468b57c93b565e57f9d40e8487f7553c6a7c57d51527c9fb23c0b9c37df4e35ebe9ee77878f92ec0549be840966887289f9703c2c0f7961393ebcc4ed2f24add57ed9563e5f583e5f526e09c1f0f61de3eba93bce989dfafabdd577de0c721f7551ff781dafd93bde16287cafb4dc139bf6fa827628769767b8ad96e4538689f2a1f54be9eaad9adb277c5ea48903fcaa7295b1ea5c57184765fc5719a66bb2a8ee3101b3d0c8487f7877aed246ea343b4e7543e28db6e0fc2c3fb7a193d9e99cbcaf1f2b845de1f0dce61591ea3a5ef442d7d2768d7555950724e46e29776123b458bff14affdc5cbe45870ee94c9f1cacee4bb6fec542d1fda81ebfc789a26afc02b6fc2782ddc1932dc3870ce8fa703db51efddaa9e3d9379dbce674ad92acfced09e3b9355f5136725cac576bfbbc709eadde96cf77c528ef6ccd12cf5b6ccb9cc5bb79d23659fe5cde7b8bd9d258f72bd41ec1c8de739aece13b768f2ce45e49d2b8fe7c9fb321fd8795a3ce76bf971be3c5e00749771b1f301d70be43515ced175ba5ad7938c8b6ad77700f22f9447599fb38bc03d5987b38b13f14c51ef4c9778f32d69bc6a8ee08540870b5da693664939aa9dabeaa18b249b09e09cdfef039ee7f73b68f2ae4e921e65d31727d2118fef122dbe4bb4f82e95f79b837327bea2595e39f1f0d7c8f013c1393f5eafe5f9f5789a989a1f310984817a5cc7bc65f33a374d852f7bc3c7ae64de36c79552ce784d4e374dced76edee83ac66ed058dd00d2cbcfd57e041dc03967858dfff1fcbf5fde53ef4ed04695be97836b97ca6b57806baa5fe362105e85e1f7553fc965327d85f2fa65c979b1cbc1757ebc4ade2f02e73c9ca9fe5732afd6f2e06acd4e741fafece55a2d8f0ac0b9c374cad35a38b537865abfafeaac9bb57894bf557b590c01cfabf0f0beaa8355dd74ab575efcb95be5f136cd160ac0394ff73e5a38ac5cdc99c8df98da3762b29696dbb5b4a8fc54fb550cd4d278bb765fe996cc8749ff1353fb3ff406e7fca8f68de803cef9f11e66cedf7be451ae0b8fdda771bacfe5b4dddb5ab8fbb5fc556d9507bdf18870ea3a3f3ec4bc6d12b98e3af600f3b48998b2d78799f7bdf761373dc5eabd55f150ebaffb82737eff484d4e9e2647b517947d3eaa71521c1ed3ecf37e101edee779e894bbe2cf35b98f6b72551bff0944eee3da7d651b2a5f9f04f6f8803c3ec5bcfef049709d1f9f96f7eb807390b7ec0a4d9e7a5eada59e08cef951ad8156ebca54dd08db5ecfca6b7adb0bc88ffb00b5a65cf6c516fbd9ffe94c796c938893c97694a76f4bf525ab75dd7a5b49aeef8ec9719a985a8f5d00ce1d56d3e769e1d4fa6c550e549b58adab1e04c2a9ebfca8d6458f06e7fca8d6538f03e7fcf812d045b5a35f47e250730bded0e2906ba2636a8df554201b5ef7b36e40d5dd17c867d5fa6a55575d05aef3f3f3e5b95a47dd099cf3fba6be4d25fb6dafec98f2456acdb4eed3de9147b9363aa6d644178073272f679fac857b5fcb4be5d33ed038bf0faef3a3dca323f69116cf476e3c33d769e13e655e5fa7d87cecb54d114e5de7c74fe4fd62edbe5a733d019c435fa1d6527700e7205d713dbf40f4fc421ed5bae7f1da731f23cfe9e9de0e9cf3f81f96f9adde3715b7af80ad6ff199b6af355d0bc0b913d7f6e3b5706a9df114700e99295d3b80732ee772cd36d59a58d54fd9165ce747b5ce55e659bcadf01da28f5c871a93fdc6b11f347d7e90b65ba88553eb37c781737e046b43c5df3c0daa1dfb33f3b6db7f96b2d5ba75f50ea374556b5d5519bf065ce7c7df99b73daad66e9adaa36a5daa6a4319c623e2e985befd5aafad18c72814e39f10c6728d6cec37cd9e113de3fa69f2e2fe46c9fb599397cc7f3697acd5f8c075801597a5d6bb4ed3ced5ba71b5de43ad776d00ce1db9730ed1e4c135ac6a6ea01a0b556dde2edafda54086e9be3e77d4f79ad1ac9858073a9595b1c56c0dcb139bfaf196acdfad3fd593d56ffa29d6e58b5e73c677ffe4d1ae639b9d47cb4c3b6f96887d3dd739d635c8b8f3667bb1664fc53e49fc5eec84582184cea855258a3baa44c11357e1fc2f03db86563ad7a7885d47f9c6a12b9c3b03d874e7c89f5ac406b205ce7faf941d9c682bd87ae76c9ef37b8d90b7c84976d590d5a9c4b718d59f99e3c87477405de95c5140d738e715228573c5ef0d22a56522f5c5ceb575623fd655ac9c4d748e9b446c55755febfc6d8a739e44664ea3792354ecbabbddaacaa642471b9efa3c6193ff9f233591231c7ddd19b21cd6c9136f204755c989ff67e83a19de695c2c650c14c8629e6b83589e98eb33a70ac1e03a56d5d06cdf2eefa16c70525dcc64787677141a2472f8e536bfd69a5b347e429657b502965797abd6a91ad59281e5f272c54ad5202a6465d5c9e709d5f1c74cf8c554f3b919c4ef865b21c205cf80baa2f2f3668058fa3acff96393f35321f0ac746e963b6785ce631b9da82a9ce362a75a9de1fc5e25efad6555722c9f8baf27a057ad52ab4b3886bd9609bb18d99d5723568f6dc69d1c7cfdb81609f079a21dd62e897962718906542dd98a5205e8f51983878dca1f714196395f1a8a7c4925362c676a9b72a661a60b44f53540b27c6914d72b912ffc9f996163c4b6ab4b0346b08e8960a39ab16d9ef6d46c9b4f7be8af3134f36b92d40693a5002398652228de5b4b3248707b2785bbcb76636a0c9bfa66d84c306c5f453b3f69c028d63550cce7149b9b92d5404b9658626a165c0f13dc22a4e0fa98e0962105373019d436992e92fcde6a218557b8c1cd898f2cf6d5dd9ad99e5a2365b2fa2460d6d4d094371c611b63aaf4cc698d674e234c72dbb0921b6392db8595bc8dc9a0c40cb2ccb7da53ab23b9af69ebbb8eecc09235ba83d6904d4cf4c43cb75d48e955ed4c527f4d749e5dee70d8207a08d63bcf9b3a9f9213ede8dbdb771234b399a94b2c588a30c24d4d96cfb177c6b25d37fe0eb8f1373309e73176f1e3a63be1829b63e5b56bd8f2da02e3916de0110bc8a3a5c99c05a4651931e7b9ce2bdd342789f0256f80bc8bbff695794c4ac9486ee2dd7c9bf8b6c2c4fb00134f672a31b36f65ca0961550b6b3027dcd7f075a210970997b9cc793a28fbeebed9e708f6ddab65ef375d18edd658a1ea910627d3c69495a21897d5605616576bb041b3b5a7ef6ced25b2b577b5d99a4a1ab12c6e6bca05e1ef166438170a9d94af737e127fa91efba0c4737d13ef2d887735120f921e8c6e3b135de1c316d738dd4221498d982c76246d0e4cba8f6fd27d05e91e3e49fb4b1b46bdbdc96d71eafdfc345ffae22eab03d67ce91fb6f9d211f3b403d2e0693b9984f3d7bd3c56b51bed3fe75f15e18d71e19db194e71b525e3b60cabb60c0071a80c78200ef8a31196460728029d949986463c20b0cc2b70414de0d133ed820fcfc80c2b735392cd10c3830230eabba990353c4c742cb3cdd662aded562b897a7480d1dcf718ecb442af8759e8aea671c24777843e27cc0808068c91401d756f35af0f9a60dc58b98d91d0f13eed8ae3463eebcbbc9e07917255f985365588cbf0c2c94dd163cfe55e2d62c27069e9bfc3a9fed51a54cd4c3cb440ee6e146183c5cd057cb1ea602271a65ab6ab4c01539bff9bc8b4af1f70699bdf344dc89d1c03045892f87eb6ca8d944ed6634da51c26807f930da74a41e33c79e98ff1d6df0bf0fc782f9df5e588537c650e1056a61e46292c78695dc1b0332ce04a45630207db0c237de50f858c0c2d7174bf90443caafae132ce5fdb0944f4c43cafb9bdc8678db5841ea364aa4ffdc2c8a58b9284c5066a226e0052c5968ee026630fe25edf5221dc99d055fbbe6ef45a3503809ce872ead986b1880d55445a6e407a882f24cd92d5e7332395e0ae782a4365e3ad977364e61e6f1523f69c0b2271f2bee530dc57d4b56b0e23ed024bcb138353419c59b646aa3c1622bcd3accfd37c0f9572f2bc848e920533ab9779f6648673e6fdaf239cbb544a6cc1099322049d932b5128397ae2afa0cc3f529c0dcec4c839bad15d0cd0ec60a34df0bab4ad373bab0dbaa00b2d9de8eededeb1c5ddb2d7354e57faf767e73e5cb65bf122f97d9622c689de3e0573b0de8fece95c502589973a72cde92e112070a89cb44c95d299ee3b25db4fcfe20e7fe48e758e01cbb05f236434c5a73539e6532118e6f76389b1c8a619e63c2bc282d98538799cd36b2e5d29d668b21bc554e4c15522e9ff85a2abab1f85df7f935426eb94845a5f33f58760cc3dcd65c83db3ab96130b735dc54b388dea84c8e734f7042714bdf9c429d32cf779d52c2cc63dcc963c76a9311a66ce9c8dc3d0cabadec4bf02c1969ca12d18797c9097aba070f96293bface94f9cc3c39afbaf8b16c1965a2273a296767909e9f89e366723bf926b7b320d7ba8a5649e75623d4469b8c9953e3a3400db4e4149a6ad19d71831e8339b05d0c0e6c9746c11cd8582ce5bb1a525e2f60cac76129dfcd90f29cc6c1523e1eabf5169a6a3d664a7a925a630296f44586a47f1d30e91331e18b0dc2a7360b267c9249386fd1f1056f615f9c0b31e14bd320bc08135e9a06e1934dc2f92b7f99c963e8820b71c153303b5ce6477012139c8a5949b9c14afa350f6625c526e13cfc7286345279cf488846ea7618a6dd4dc595bf7d046da4f2cac8c6f7816918ea3d30d415e1504fc750af34a15e9236d4d17927988115ad5586a235be55b0a235137363abd3e0c6b6c784af4983f05926e1dc47ee19d247cec62c726d481f3907c35169c0611c9b4f82632e6625eb4c0eb875302b996712cedf7fd6fb4192e4fda70413bc21a4e01d30d61bd3607a3b9a84f376e8263fa94ed2069d8f65e2664326fe1c301377c284ef65107e779b60c277c684ef6d107e48db60c21760c2f731089fd52e98f05d304bd9370d96b22b267cbf3408df0d13be7f1a842f3409e73d1307f8b1f1f9b8e04526c1dc6bf25927552a7cde2116b4c25f272beff2145a55c1aae6c5982e079974e137b23db106896b0916d7c1a6b8f814b885ceff7ce767699541307e678d986bc7c90649c5522c15879852d102a462a56cfcb8b358534f41299682434d29680852b0d071dc6bc5d044b07abb0c733f87997c5b8760ee671956880f4f43212ec7527e8421e5ef074cf9722ce547a621e52bb0941f6548f9e88ec152be3b96f2a3d390f23d4cc2b9751d63b24f3e94b840fab25d1ddfb040faa191f2a5c3bd365f1cfbb3b1ceef22e0b3960a4115ce5f7c71c51ae7da72e15f36894ecc3271b534a04fabc0d27fac29fdbc0b3691a289ce8d4ae159954e23a53ebb1a06665c9fadbf40ad14212ae5b8affb2ae6ea57c9dc0ed9cde2c9203aad34e9c40de4b8f80dedad566c185e8fb9ff06b8ff82bdd8aec28c6c8bc1c8ea0434b2d598f0130cc2b3020a5f83093fd120bc6e40e17b62e67592c9bc727c150ff7bd3ccf390e96d7dca2b2371b22c30e758e410c662d6630276306734a6883a9c4e23c158bf3b4d071aec3b2faf43478c2f526e1bc09c977800fd384dc80913a132325f671cf82a48271da88713a3b0d9c369984f3a6d3397e38f5c2056f3609e695e8b9ac6a257afbd06095e85e58413ecf4faa9394bdbd31c1e79b3c441f114e2d8eca6689b586a54ec9e7fd717c3c6c8cf4217c9c8c57236effdc18e94ddcab2b1c95dc6b83027a8b7d30ce1718387f1f90f3be98755c18d23af63309e6b344f9e6c0a16689ee8f49be38ace40330d2971848e70e0b46fa408cf4a521491f84a5fa3243aa7f0f98ea83b1e272b9a9b8f4468a4bb6687dad15ad2d73b149dc87c526786139048371850146fef060300ec5845f6910be3ca0f0c34cc27925c077500e5b091c6e109e27d644f1aeb54c2d1f540d78b596bb449881be1c4f854a3ebbe16a53a931ce6ee0bbd3e6c6ba307dc160b0d460f31d8e3091156bc26a66fef43c06576a0f727448effce96b7d73bf8e55377f3a7c5ab15c39d2942bd9f4b9126e0783b9f1b643d0e5b37ce75e7d094c6de6fe33e7ce0df1dca14b33963b479972a79bedb95314afa282e6ce8d86dc614973e7a634e54eb23463b973345611dd9c868ae8189370ee9b6f31f9155df035b8e0634d82f980edad7e042719b03dce2498b7406ef323384953e578ac3571bba135f1f8c860ad892d58aaf9b6c755da6dfc34f1e212448913b078ee34c5c34d7ba973b25814e7ca40319d88e1bacb802b7b6c305c279984f3f077c76f68effce23b3aa94f4c39d91421d7fe5e1337de0fca17c2ee294e794e650b826ea137b7a8bd3d9fb0559d182152afa3aa4b2b91376364b757901c3a05d3e93e934ebc7a72531d248e53b138ee37c5c16f78390489eb342cae07b03294dad8dbe9583c0f62f124f23e483c676025e82143091a3e2158093ad3249cbfde3eecc74d2679bd3dcb249857478fb0f0d5d1d91892470d48660544720e96f2c7d290f273b1943f6e48f9c501537e1e26fc0983f02d1383093f1fc3f2641ab05c6012cedb174ff931c324ed8b0b31244f1b90fc1e10c94558e1792664e1b9d82498f795f1cf7185ea2bbb04e3f19c8147fd49c1785c6a12ce13f33c3354c77c1d0eff2c97dca622c092bfcb30255e3428913d399812979b8473f7cc3fb355c5ad7325f4d6bb1aa44cb4ef47c6a7a60471fc57606abe6c50f3e6ed82a9792526fc1583f097a707137e15c6f0551343fe0ac99b49eea6b5ee507175cd246f93676040b25763cabf6650fefa59c194bf0653fe7593f27c5b86996286126c61670b18cb98bbf4a9548c7eaf115b9828e34a0628088a6b31146f1850349e1d0cc575188a37313b58e0d982631e9bcfa63b0afafdb4011fe50da2fcf558fade32a5af9508e7f3230b015271832915bc66e51fca0b5bb3de88097f270dc26f3209e7f514ff245fa87aea6683e43cb139159f4a63c3fe166a797efafa68f9770dfdf5d1becf783f13df148236bd585fd32da67ce7bb197c605241cff62978b6df8a09fe30a4e0db30c11f85147c3b56043e0e5b04eec0247f1256f29d98e44fc34abe0b93fc5958c9779b24733ff6791afcd83d58b2bf089bec7b4d92b91ffbd28fddbd8f0bbecf249857c55ff9119ca48beb7e0cf4d76900fd0086e39b90381ec4caf7b721cbf74318e7ef42727e18e3fc7d1a383f82e1f821248e4731c13f8614fc18c6f9a7909c1fc738ff9c06ce4f60387e0989e3494cf0af21053f8571fe2d24e7a731cebfa781f333188e3f42e278d624987b7efe21d6509eff398cc75f69e0f13cc6e3ef903c5ec004ff1352f08b188e7fd380e3254cf87f6910feb249b898601b0b3792f80a667bb15848db7b15e3512b169ec76b9889d4f6c3238989bc8e09ae1352f01b188eac34e07813135e370dc2dfc26caf5e48db7b1b4b75fd34a4fa1d4c788334087f1713de300dc2dfc384374a83f0f70dc2f3c4e6c67ced51e6fb34d2b1575ff21e8dc67eac74064eec03ccfcb70969fe1f62f9dc240df9fc9149389fd3d2d44faa93cc69f9d864407c350cf167883083a0339c662652c6aeb0e631f519228a54621d609f98b298e7440b3f59ccd38c08fed42498b7095a866d137c86496e1556f2e798e4d661257f81496e1356f2979803689b0607f01596ec766193fd3596ecf66948f63758b23b844df6b726c9bcdba7a39fe2f23e2ef83b9360fe36dbc98fe0246fb3df63a03ba701f40f188e2e2171fc6812cc5bd05d43b6a07fc2386787e4fc33c6b95b1a38ff82e1d836248e5f31c1dd430afe0de39c1392f3ef18e71e69e0fc0786a367481c7f62827b8514fc17c6393724e7bf31cebdd3c0f91f0c479f9038fec552dd370da9fe0f13de2f0dc2791f8cf10da17fc837849849307f591b10f29da61696e2bc9029ae8d09ce0f29b88e49b0f80857d876411626795058c9754d92b9d115a4c1e8ea61c91e1c36d9f531c943c24a6e80491e1a567243ccee8685b4bb4698e0e1210537c6588c08cb621bccec46a6c1ec9a60c247a54178538cc9e8b04c9a9924f38f498ff1938dc93e266d12cc9bd1634336a35b9804f30e9c71213b705a6290c78785dc0a933c21ace4d658299c18b214b6c1cc79521accb92d567d1786acbedb61388a42e2686f12cc1b77934336ee3a60299e1232c51d31c153430aee84a1280e89a23396e2ed42a6b80b66cbd3d260cb5d31e1d3d3203c1b731c33c23a8e6e98df9f19d2ef6f8bf9fded43fafdee98df9f15d2efe76090678785dc03933c27ace49e5859991bb2acf4c2cc795e1acc3917f3fb2521fd7e6f0cc70e2171f4c19cdd8e219d5d5f2cc5f343a6b81f2678a79082fb6328760e89620096e20521539c87d9f22e69b0e57c4cf8ae69103e10731cbb85751c8330bfbf30a4df2fc0fcfea2907e7f30e6f71787f4fb4330c84bc2421e8a495e1a56f230acac94862c2bc331732e4b83398fc0fcfeb2907e7f2486a33c248e5198b35b1ed2d98dc652bc22648ac76082770f29782c86628f9028c66129ae0899e2f158f15b19b6f84dc024af0a2b792256fe56a7a1fc4dc248af0949ba1013bc6748c145188eb569c03119135e9906e15330135917d644a66255f7fa9055773156756f0859756f8755dd1b4356ddd330bbdb14d2eea663ce6e7348673703338bbdc29ac54c2cc97b874cf2f65831d9270dc56416267cdf34089f8dc1de2f2cec3958b2f74f43b2e79a84f371ef03fce4649271ef7926c1fc9b3d07fa119cec6340188e83d28063072c170f0e9b8b3b62c93e240dc99e8f25fbd0b0c9de094bf6616948f6ce988d1c1ed24616603c8e08cb63178cc79169e0b12b26fca83408df0d63727458260bb1641f9386642fc2841f9b06e18b31e1c7a541f8124cf8f16910be1413be250dc24b31533921aca99461924f0c2b7919d6a03c296483b21c6b509e1cb241b9dc2438c7393dc58fe02453c65760824f0d297877acd9775ac866df1e58dbfaf4906deb0accdece086b6f2b4d92f9066567fa4972920dca56612cce0ac962b54970b6737a762cc9b6b67a0437e011acc17cd23969f0497b6258ce0d89652d9691e785ccc84a2cc5e7874cf13a93e06ecee9054132f2263c82f558ca2f0c99f20d98e08b420ade8895f38bc396f34d98e44bc24ade8c95c74bd3541ef7c2927e59d8a4ef6d909cd7c3398df1ef646672e3ef42c6f73a5e0cfe9ae73cb107e35b1c05dddefbf2185fb2ecc592d7936b952dae858bbbb990bc90f175666b0470f3fab52b627cd2793a62c4d6aaed63b20bbe97d9957e4a615fdc2cf6c58af755218bf77e26c1dcdeae3664593ecf32036d3dbe2bf086cefe587cd7d0c477005652af0d5b520fc4eae4ebd250271f84e5f7f521f3fb6093603e7877831fc14906ef0ec1527c63c8141f8a09be29a4e0c3b0c27a73c8c27a3866e3b7d0d8f811587cb7d2c47724f616745bc8b7a0a330456ea751e4682cbe3b68e23b068bef4e9af88ec5e2bb8b26bee3b0f8eea689ef782cbe7b68e2db82c5772f4d7c2798e26be99cdee7a7a0f5c63dd4899822f7d3287212560b3f10b6163e19d3e4411a4d4ec1e27b8826be53b1f81ea689ef342cbe4768e23bdd141fdfd7fd513f269e645ff7334c82f9b0f9637e0427f9f8e999982d3f1ed696cfc2d83f41c3fe6c2cbe2769e23b0723f7545872e7629a3c4da3c9799826cf84d5e47ccc6c9f0d69b617609d71cf85ec8cbb1063f17c581617616f582fa4e10deb628cc78b21795c82a5faa534a4fa520cf6cb61615f8639e257423ae2cb4d3d5a3c7c6c39ab899d946630f71b5e6b9d2b5c9ff4eea6f4aa8996b137ea35d11bd58fe1bb29854d29d64b75852947f8c711627b91e688ea752b7152c8ef0ff07c80807fb66f95d47799a3af92571c0f5f14ff7614ff8405bfbf425c819feec3a427cfb5d77de7da1b22d7c63256a3da60397b25d657f266c8be92ab30c16f85147c3526f8ed9082afc19a04efd03409aec5e27b9726beebb09ae0bdb035c1f55813e4fd904d901bb09af18334d48c37623c3e0ccbe326ac9ff0a390fd84376326f3318dc9dc82c5f7094d7cb762f17d4a13df6d587c9fd1c4773b16dfe734f1dd81c5f7054d7c77624dc22f433609efc2dade5f856c7bdf8dd5265f87ac4deec1d07f4383fe5e2cbe6f69e2bb0ff39edf85f59ef763def3fb90def301ac73f487909da30f62ec7fa461ff1016df4f34f13d8ce5f5cf61f3fa1193e46ce7f497587ae65d3c8aa1fa9506d563587cbfd1c4f73816dfef34f13d81c5f7074d7c4f622dc03fd3d0027c0a13fe571a843f8d159abfc3169a67b03cf887260f9ec530fd9b064ccf61cafc47a3ccf3587cac16497c2f606610ab15d20c5ec4eac95ab5c2d5932f9904f38586b5fd084eb2d0f0658c7d1d1af6af60f165d1c4f72af61e5cd70fb824efc1af61add47a7e042769a5be8e11aa4f43e80d2cbe0634f1bd89816b1812dc5b98e0462105bf8d096e1c52f03b18fa6d68d0bf8bc5d78426bef73047db34aca37d1f73b4cd423ada0f3044cd69107d88c5d78226be8fb02c6919364b3ec6346945a3c9279826adc36af229f652dac68f71257929fd0c6bb5b5ad15bed5f639c6a35d581e5f6039db9e2667bfc434e9105693afb00ce898860cf81ac3d48906d337587c9d69e2fb16cb962e61b3e53b4c93ae349a7c8fc5974d13df0f18b96e61c9fd88354db60dd934f90943d49d06d1cf18a29cb0887ec13ac07bf84194a403fc57ecd5a267c8578bdf3016bdc2b2f81d3397dc90e6f20726b87748c17f622cfa8465f11796e4be2193fc3726b85f2dfe210eafe0d8314ccd4250b304e01c01d3fc033fb30f06380571a198d7b1ca093bc9898acf97e07213cf143ac70a47ea66e758ca263b4fb99fb7ab94cf26e658b8b3415688d920de3b6efa0a1c0d1726d182cf7259effc5d09629f2766a328995ea93b384fad70e404a1fe0f46bdbf89fa943875b51aacd87962b1939632793d715ee8a466a393ce0ae7b8d8495582ef52c174adf87b619c406a1283e8fa2fa6eb0093ae2392e83acff9d9e4c8582f66d0f0dc5ce6a4299876661941f4f90fd327cfa4cfe814f5a974aeac738e53840596097be7b1cd706c6d8d98a7b5c660fb7cf6d36a314f6a319fb313402bde7b69d42adfa4d5c02a5aa9358cea38dd49274f959fdcc19e0d92fe1896fe81a6f48fa936fd85627e199f85c67dc26227ed9b53d2c52427885eb530bd0699f41aca18e2f1263831af15feb3aa16988fc4ee246405d1a436a649814993e19a26f03b8fe175314b0ba24d1d4c9bc1266d26a0f9e26ab0da29cd0b1dbbe7f559a5e317968bf29b4c1f7f7aa6ee0fb230fd8698f49bcab039a56af6e66a71b62ae5dc0b2e3d88b675316d8762dec3af6dce957edc5f4e4249e96867d4c3f41ae6a7ccc19654f832679616449bfa9836c34dda8cf355e62638444b8565b91e3a7c994bdc09a25b034cb71126dd466af5d744e7166f3194083d2aa43eeefc5f9ebe62e72ff7716e41c9bc61fa3c48434ca391268dc66ab9e58d17e65849bc1e9de9dc2d17f5ac39efbc32d2a759234cb35126cd7a689ae925a95c7a88e9c283953b7f2f4f934d35c6d239da94ce69becacb14d15655ab04544db5bdf37711dbd311c4c5d564bdb50da6f31893cef897a56199f0e6d32af9e699ccbf054971132cc563b1f709bf75a137dde5acea07e1f19ad5f4f9f8205a35c5b41a67d26a52929ac7d562b2a86d560acbf3ffc66fae99d39573cd301dc79b741c82e61cefdb58e20452ba4e77742d7742ac15ab5aaad6b1e96e2534c7f49860d2a330849fa849cfd002d372a249cb7cdf6f5253aa6de1a5c397b7c4523fc994fa41015aa841d39faa476885695068d2606e00cfec5a5ca2fe719fc17d9bb7fcf809932e1b6c8d3128f2938bc9dae3417331559fd706d360b21f5f51d5afe379e7cfc37befa42b9fda625a4e316939d197479ceb045e2252bb18f408d5d4fb463b4cc3a97ede78935962b037de64f9974a5dd61ed3abd8a4d728df5e3e9856786ea5a253074ca7ed52ef6baaaec465b266ee88e937cd8f4f09521fe0ad28faf7e14e9896d3fdbc8d51b488fd6b9d6a6dd119d3790666b9c1eafc62f1c65321fad857b064ef333479da05d36fa649bf32463b7aba8ecd126f0ce572747407d14fc257f22f11daa56a25e13d58578cd3f6264e25c49cf051e6e484c273c8c638cc3271985fc33e80da3b74c368cc36d198ecb32d592ccabb5dedc96d314de798342df25583cf607ccf8d75623cd8f580784f68a65a95dd313de7fae9f5d1db5c9384a655730ff6e4f8b99eded6580ea6e33c3fadb1aa3a26fa49783a79386e5d4b0dfe7a1e7327abf9d52eb551961e987e25587f6432fddc7a29f180ff56587a73ad27a6d50e26ad16a4d932b1f217347c7a99f4c298ece8c7ffe26db2eafd6fa6dbdeb998a6f34d9a0e8eb73fc2ccb72a14b358787f7ca5c1ee53c9afde98163b059d49555cad1edeb18312472b775cc734eaa8da6a3c4c107dfa60faec6cd22747d3c7147bb2beb0545b297db1542e30a5727a1aa9cf1575c13a693da95a64424a10adfb615aef82f580a54feb156c2f591bce1031af16a3bd139d1f9e92aab3de526babf4c734dc953a5fbd233ba9e66b424a10ad07605aef868dcaa75feb19cc9de7e43e95ae729a8769b630e808899bee44ff51558ba3a9a5f2310d169934189fc6bc992372c47d9fc0fb50e631385f7590233388760331ed1663b37792cfac4c7c2d23f98c243daffc4a0da2db204cb725584b2a986e786f57b277570a4d0b304d979a342dad56537c9eed3cf1b75b977bdf1ffceae53f24b7ff65692cc983314aa5588f76307b50e53619c5ea49859d9b3c04d3b20cebd5a0b07aef3b1185cd0fc5f45c86bd3ba66af36ad6bf8a87c6dad3f12e320c63526e6232238d79ef6fed00952d0cc7f45e8ecd62c88cdea97980d4188cc018acc07af982ac15992434e0d75788feb06065205d1e7c24a6e3eed83872101ddd59c761344ba5cc8ec274da233db5126c81f91b85a3b0ced1989615262d6785f0d6aa164ecd5bd3683f06d37e2536e33f5ccbc3bfbf4d6555d7584c9b55266d764ad1db9a660a046d399a5b24e96e578ec378acc6de7153cb5d37dd65e23dcf3c1691ea2cc0f198066b4c1a4c09513ae730b7ef6843e0b78674e5d6044cd73d4dbaf60b5887a8bce2f5e57ae3e8756afd6213b154afc5c6b7524935f499996dcd4fc2f4ab34e9372ca07ed0ea2624cd9374d4e885982eeb4cbadc524597d4c635bc7712cff8191fc05a06fa972792add04f750648d055e1c97a67abef610b928f45583eaef7b3568a665e487a7a6527639a6d30695690c442fdf669a67fdc6d0aa6c346930e7d53ae758bd3e8c5a76269de644a735eca694e365f26559b29c6d2be391d3550cdb70bb6c3f4dbcbdfc893ff3690fe2e3dcd1118ac7d9b3eada7615aef9dda8a307feb77539be995aae54ec774dc075b63146445589051a8e47eae9ef33f166be4fc5924ec835bcc2cf1043fab64797c5f4091beeabe39a4aef3b8573ae9e1b6318fa919a7d57f5768df5aeeeeb6e25faf1887aaf6e48a2dd36cc07db242484ed83b5fe39cd82585978401f1129faeef4041edfc7ff989ef21b454d4c4fccd72896319f5a4464a96439a2f41ddea34dd8fe76a0b99abb5f2789508eac560d6547d2af6e7b1d536db50db2a6461d936a5dd153093b9eb5f63cd198b57cd1cdb2a517e6789e6c53a719d17df6a638565d5146b7f2140cdf0ab565c09681698c4b517a6e63ac7b5cc1d6ee71fbeaa97552b9f67c40194c83a09640b59bef8ada32b71622995adfda9a2162965ee97dd2a1d65a200f2f69c04c803ed0439301220f906840ae44194209b7a40f23a9727a15cfa4e8e2c0ab836354be03a9812574b81cb7dd5562f5bd3999a4eb6de7974a94c5214b0fd3d2481ed106a6ceabd48af2056c8fe653eb3ad3412d8f86c2485ed504a6c4d00b649a20bc6ed765e27bb8ca200ebfee1095887d13747cc453331c32e0ac8460f4b203bdcce5ab4201220d76527401e4109b261dcf60a45d4ee5777374702d231a0123892baa9013bf4a2e9fcbf06ef0a4751e26a863aff49ac42f45bad8c04b07d4005703425b046a2101689ee80c4704554de41799792c2740c7d3da99c3eeff375fb2c2b053055734601d9311312c88ea544b64d1564517b417abb4e02d57199b5ae3d4597aedbe28f92755d3f3281ecf89a71f4d102b6684402d8969a0116ad76fe726161f5b234e1fa72d2d4bbbc8351c63be779cbad886d1243c76b85bc52bdb39ecfd1b12ee527c0cef6dc240d845c9f9dd9b93e1ab1b9017a3b72aba95a727df4cfe586ea0c0df37441a8a707394f63ef4db9013ada727dbef9e7fa6a51e756dbe9924c4e22fe64a1609afcd597a670a6565b62f4d23cea98cf472f4ffc1f1f58cce7038b277108fc132ffc9f5b679d4c5967b593f9e78e23af12f3b8f0d9030bf97a323d0d9daaa4618e9cdeb842c4a1ea2a536a1a786ab3d67e144ca546fb86259a00a7d884735024716683be86536dc25910499cb301ced36cc239389238f702384fb709e79048e2bc0fe03cc3269c432389f30780f34c4a9c5d0c38fdcf211c4687967fa69104ed7100ed5994687b49b4154ea00a8138312d3d95c5bd55e67e4400f66d00f6d951829d1f41d8a701d8e744097695e9611180fd3d807d6e262abc72b4ca83c9e76e62281dcec654151e5fe3a9709e6713ce8248e2bc0ce03cdf269c832289f31080f3024a9c6d0ccd3128d05bd087d0a1ec4085f24b80f2425b50164412e52250055d640bca419144391ca0bc9812656b897298f353165fd15a2cc616f85a557e6f8d58ebc51f881ec8e5a0785f9289d97f78c5837d248cf03daa1915d62100eba5999a51cfadb0dcc195219b9c4f056f3d807719f5d0be82b762ab29d23b007c9753e32b65ee2a6ffe92b8d4f126fa5a70327cbda8f0b501f8aea0c4d7d9504bfbdd9481b0bbe335aa37f0cb419d7d654d367fa038d2eaa51e958dbe056cf42aea35210b0524b77a599b29ef584285ae04a0bb3a53e8d68b401942770d15ba0b00ba6b28d1b592e896caf91ffac70994a6a48577672a8c6301c66b336181f95b4de11d01d05d4789ae854457e0fc2cf74c25cb10c2422a84c70284d767cafab60eff770c4077434d3660bc1b8e10b605c95ef1ce006dc11b3351950cf4f4dfa8db19b248b276e01460913765c222b11ad9dba426b4483294dd01ca9b2951f663fa60acbbcb5d625670e5ffd018f887c011dc42bd5ecf5b934f10dd658463d964bd8bf581adde5a13d0a2d8255b0f40bb2d133ddd7eba1f603f37e948cc142aacd34101bedd46aca4c3ae64587f05d67a874df33349a7ab90cdcfac07acf44e9b7092ceaf20c33910e0bccb269ca4b37fc8702e0038efb609e7e048e23c13e0bcc7269c432289f30580f35e9b700e8d24ce3f01cefbec5d2a10c539be4700b4f7db32c16a20254ab24904efb004ca076c41591049943b01ab7cd01694832289b22e40f9902d28074712e5b300e5c399e8812fd82a7be08f037ef2113be74f0e8e6067dd4a80f5517be60a8d88a085760005fd314a947c3587b7b37812539fc422c3d6840a5b1d60818f53626b5b6dc1f6aec821b441b2f538e300cc276c82393c8230c700984fda0493b09f9d0c665f00f3299b6012d6da64307b03984fdb049370df033298c300cc676c8219c505a170bfdb676d824938924e06331bc07cce2698841360c8607605309fb70926e1363c64307b02982fd80493b087880c663700f3c54cc0c42617eae33e84c59c6cd4a70b80f9924d30092b203298fb03982f676219009fc3be52469ef8c67294fb2df702085fc9c4a06e3ef37e60b7eaf6c43cd45a11227a16d90be07c9512677b5675f6b05ab68c8f40466f786231e8b57ccd36a084151019d0af8185be4e09944f4ef6760357f93c5d040620b200ae3732314bc3dd6a5b1d274b3bf46e635ecce01e05c4be92cc126702b46fdab36885b0f792ac169f0e50be95d9b19d4aec7b4711a8ad1b036c6f677a0a96798b073e54b692ad1196ea8e9093be811752a11d0ceaed776cdac88e748b7bb277f019c052dfb50927e99eec6438cf0338dfb30927e91703c870ee0370be4f89b3a36f3fea5d1a4d3888d69c6a12eb91c0837e602354424b2583ba0240fdd046a8841dc464509703a81fd90895b0e3830cea27c0a77e6c2354c2ce0f32a81f03a89fd8bbe6228a5f0c381c38814f29d1f665de8e3afedbdd2f81279aefa0501dea42b682253e2bc6fbee37d3da735faa86d78b00fa6794d03b5463cf1399fb5138f79afbc93a523b26dbdc672d40fa3975ff28efc45be21028175f0e2ca7c3d5890a5733e051bfb0678236e1dc24b24ebc46c0f2beac590ffabfb3efccf300fa5735391eefb55fd2dd15c82c780b70065fdb049370de2719cc1300cc6f6c8249d8994206736f00f35b9b604671b4e96000f33b9b6012769e90c1ac0030bfb7092661f71e19cc3d01cc1f6c8219c59d104b01cc1f6d8219c59ddaf700307fb20926e1ca3732982703983fdb04338aeb824f01307fc9c4279486b2adf3134abb0390bf66ea5b3f4a6a86e0916d863f0ac0fb2d135638642bb5c26500e4ef99d88842f522f111a28d60a9ffd6356d7617d04ff40725d66d24561ef1320156c95ec1083fa39445058e017bfc33530b0c121f36d6bf4395a1e24df655aa8b00cebf32f14d3477c37cbe8b0c0f9a217c64333e2f06f8fea6c4d743f38eee972ffe773e207f36f097ff440574140730f606a0ffcdc4775ccc1513e1da8e8654cea0167006ff516f9f5f2ab02d761854c8f6261f682383964305ad1580c66a5bb8cf3be98e8664fbbcf707c538662356d2de7532acaf036bad4589b5ba3546d1dfa0a21340599b1265b8c53284680ba9d07e04d0d6a1441bfc230f51dc16e00b8033cb269c832289b325a89aeada84b3209238a7009cf56cc23938923837029cf56dc239249238af03381bd884736824717e097036cc74a3c97fc707e1b82559c7c71680b651262cd5ff0ae328eed93917349a1adb84b32092382f0438b7b109e7a048e23c00e06c9289f7780ca6b7a013ce2b261bc9fc19a06c6a0bca8248a25c03aaa066b6a01c1449949301cae699e8ff0cfefd0cc209b164db574d0385bd052556b57d1adcde6f92188c5bcbdcaeb9c477ada3bc69d5610068cb4cd829043acb09ce0516b3ad6ddfc45c80b5554d7a52288eb4c893cde764c093b6a644a926c7f21922de3dc1b69ed974bb02bb6c430993cfe9c4672d71a864f0b6a582d712c06b4b09af9b73c2c7808ae300a74b70454ccd5c2a96dd21c528e4e84d063b10006e4709b827abba396aeaeb8409bd2a596fd3bbc0abb6afc90a2a63db05cda7b2daeb01ca0e94281b683ed5b544326064bb7cb403c5bc634d4e62f0368ea2b8da722840d929138d23d87c2f8a2f3780b3e4a3fb2ed411c0ec9c8997cbc48615d52f3288e2b758f38067ec621b50c25a9b0c680900dad536a0515c06b30d009a6d1bd0287edfa00b00da8d12a8699b3f3fbd9e847e94acd7f33150316d6b23d42876253f05a076b7112aa13f25837a1f809a632354429f4a06f52100b5878d5009f7f62283fa1b80dad346a884a39e6450ff02507bd9089570ae0819d4ef00d45c1ba112eef94506f52700b5b78d5009f7b121833a1734fefbd834d99674271bbacff9009c7d6dc239289238c7039cfd6cc25910499c6500677f9b700e8e24ce0b01ce0136e11c12499c9f009c79991818f13701675024f7a75b0f60e6db04338afbd36d003007da04338a3b74ef09600eb209661477e8ae04300b6c8219c51dbaf7003007db04338a3b74af023087d804338a7346260198436d8219c5d9c98500e6309b60467187ee3100e6709b60467187ee7100e6081b7760226d2491edc0b43bc03ad246aca4ab38c9b0fec91258475162ed6ac06ade8d698a7c24635f899d41053717d8ec689be11236a7c8e0b60570c7d80c97b01223831b0370c7da0c97b0b94506f77de073c7d90c97f095950ceec1c072c7db0c97b073850cee08007782bd7b3712da6d2115da72807622255afe6180c4072b0a59d4bf1cdb0478d349360de091eedf4436805707d861a14d3849bba3c970e6009c4536e124dd0e8b0ce70e00e7649b700e8e24ce0300ce2936e11c12499c0f039c536dc2393492387f06388bedddf492102dd936044703b4db51a2ed6e40ebb7210f7b5709679cbc4f65bfcb00e46951804c38478a0c7231803c3d0a9009bb03c920dfcb12906744013261b72019e49b01e49951804c38244306f95b0079fb2840261c9a2183fc00803c2b0a90093b0cc920370715dfec2840266c279341fe0158f29c2840269c834006b90058f2dc2840269cb14d06795b00795e2636ffc2fa26124927ee2227db6be53de0144a6c4149da9f4b867221b0ca1d6c41493ad24086b21740b9632626c805dff93c8afb555482c23e3f139593daa98a07e68faf61ebe2dd91254ec27895a48e139d07f996c91b9c70abc52ee9a46f656463b85381edee1405c8846f6564900701c83b470132614f1919e46e00f282284026ec292383dc0c40dec5965603e95e1764ad86bf41f5b6ab2d2849376620437909b0cadd6c4149ba569b0ce52c80726126502e65e69daa3336d9986c97f485a0802fa244d942a2e456e7fd8c47863ede5148668d00e1e29a2cd8501ca935922d8e7b19a05c92096bacfa5199a85be36480702925c256d5f846a529a925ee4c857134c0584a89b107d377a056df2f9beefcae04cd756cb251221c21e8de54a03f057579594d7acf8cadca22abcbcf07289751a26c2d510e767e126b058ad9d6f239aedd40e12fafc9f6a5b7468fe2e6358b01cae59428ebf2fa2eee3b2be950917d7fa73d40b52213db2ce45769fc6c3d45b810c0dc9d12667d9e5b7290b8500e0893e1229b4bdd10e0da231373a95573a7ccf8b122acbb228adf32b901a0adb071670ad2f14cb29d29c682c6ce4a1bb1924e5e20c3fa0bb0d6559958a3820f139768fde7844df2c6543827029cab6dc25910499c67039c6b6cc249ba171519ce1500e79e362d4823dd2c89ac11551f54496b6dc249baa51719ce210067a54d380b2289733780739d4d38074712e73900e77a9b700e8924cef700ce0df62ee68de237c58f02683752a2edc5aaf6667a671ab9f3e6578abff97cfaf54264e283c5f304b50c8c608ea2b2e31ea049b5c996591ea4ef4e641d276f03949b6d4149fade44867247e002f6b20525e93b1319caff8055ee6d0bcac19144f914b0ca7dec5c9210c56fe8ad0516baaf3df391a2f8859d76c042f7a344d9942586e4ca44637e65a686e0c8a6238c0476b83f25bc66005e620838ea239867017c0750e26b0ff0953b1778b37d9298febf96a9991d2b9dc0fc1e0fb7568421037a1d15d02300d0032981e630ef18a73ec170eb5e7df112f0990765a256579879512f8fdfdedaa6c64e03580fced4ec10b33b28118f66c0155c4305f370e00a0ea184d9cdd04472a171a0abd876a20b644dd2b125426b251b59aa0d001f6acf0cba287eb16c3b80f2309bc63c4957b491596619c079b84d384957b591e1bc1ae03cc2269ca42bdbc8709e08701e99e96110ff3be813ae6f2fa442db1d34a08ea244db87612b3adc5ea6eac69b0a9db04b05398e9cb76a89b72c249bd17c18407e742616240cf4e0860377d1ee0b381fb88563ec9cec48e86dc9263bb607f6796c26ecb3806d9d0b667601f6799c4dad8081945515592b602ac079bc4d380b2289f35c80738b4d38493f544c867333c0790225ce8e5a43aa4c5438ae90adad7baf21a88a4ecc4455a4a0ae483a6f247a55d187c03a4fb2056414d72ddd08409e6c0b48c2f9776420bb82a27d8a2d20092b1e32904d00c8536d01493843840c641100799a2d20a3b8a96a3e0079ba2d2009a77f93817c12803cc3169084fbd192815c02409e4909b2034b3e8f7ea213908fb6a8c90eee903161b54336587c01407a969dd31409e7d6914d533c8925b09e6dcf3445c2fa9cece5b136b0d0732851f6ace23d57b1654ef0492cb1f1cad6bd5dd50300f5b9999ad4e8767cac6619db9d8e6c99d77ea0d09f5713960ac784fc2ffb22ec08215bf6752db0d4f333d14d1774cc288a2346cf03fbbdc046a8842d0132a8cf00a817da0895b0d7890cea8300ea453642257c1520837a1b807ab18d50092b2a32a8b702a897d80895b09d4a06f51600f5521ba112f65291417d1240bdcc46a8843d5664509f00502fb7112a618f0019d44701d42b6c841ac5bdf11e0150afcc448f15de1118f5c1e58d00e55535d9f9e7ddf59bd02ac996d9fe0adef3afa644c9f788dde0dc5ccaa63b81caa5759647b017aa39b0be6b2891f1cf4c78577f9638924b450f539983d19d0b5a11c102bc0d40786d26c69954471e5f84b0515625dea29ca1f7a0122aa43b83827c5d26a6290e147e512dede69b576f141e72b573a534535dcdbda8709e092cf4fa4c5868bef8ad8e739c5b7b3a4cca84e08caea0272bf44703a43750221da015fad22ab6e9edbb4fe02d96778a93d835618389cc9a2f03cee1467b16d412f6e1938d962e05567c532656d2fb1b781e1cc9d5c97f01bbbcd9269884ddcb64307f07306fb10926e1000819cc3f00cc5b6d8219c5e5096f0398b7d90493b0a14f06f34700f3761b577392eecc48d63dd70760bdc346aca4dbb092617d0d3497eea4c4dad580d5ff149d4194531fc826e93c016cf62e9be11236f4c9e03e03e0de6d335cc2863f19dc8700dc7b6c864b387c4706f75100f75e9be1120e3893c17d0cc0bdcf66b8845324c8e03e0ee0de6f335cc2b73032b8b703b80fd80c378af3a5ef00701fb4192e61cf1619dc7b00dc876c861bc50fbc3c08e03e4c09970ffa9632be7c678d80b7942d074b7fa2379ec5271828708f6462c415eb31a8fafd3bc2424e36ade22b80f3519b7092fa4c329cad40b17ecc269ca4bb4091e19c01703e6e134ed2b12a329c9b00ce276cc2392492386f04389fb409e7d048e2fc16e07c8a1267b8cf0946b1fbe45880f6699b76d323fd6830d96e7a3b8346d33336e124fdca2d19ce2b00ce676dc249da9d4786f35080f3394a9c7dabf5a389197dd5cdf09b2bfc2c4f08e944e01ba8a06f061ef6f9284227ec5b2583be1a407f218ad0099b6964d01f01d05facc96540de76441437fefa1e78ea976c41591049944b8155be6c0b4ad2b15632941301ca57285136678945186ee4eb9d80eb58d457b1ec0b8af5ab9400d5c7dbd5928bca78d592da9649511c5ffd1a58eb6b94b0d5e75e79c4cb046e257b950c12bd59ad3160a9afdbb94d22a14d926d933810607d8312abda19d55f13297a55d1fd00e49bb6808ce2dafdbb01c8b76c0119c58de11f0720dfb605641437867f18807cc7169051dc18fe3900f25d5b40467163f8a701c8f76c0119c58de15f0220dfb7056414dfc45f04203fb00524e1aa1232906f00901fda029270ed1319c85701c88f6ab29b0d8a236d0091bd7b7f00507e4c89b28973c277e0d9e43c9698f999e8f7899e15b600e83ec9c480b1779b1837314562c2cd4aa6beaf4cbe450cd92646c301ce4f2971a67783f728cea9bf17f4567e4689ba9b86dabba35951fc7bb65bdb37195f03803fb7679342c2ae0eb24d0a5f0528bfa044c967c2f048135b6fcd167ff11f326c645f1b690bbce997f6ecfa14c54d370603945f65627e47a2624a6cfd1666d732c22a8a6cf4f21750ecbf8e2274424b27837e2780fe4d14a147717fbed301f46fedd920692065cf0099af1e09607e6713cc286e77381ac0fcde269884bda864300700983fd80493b06f9f0ce63000f3479b60467123cebe00e64f36c18ce20735fb01983fdb04338a9dd33d01cc5f6c8219c55d4d7b0398bfda04338a1d7c1d01ccdf6c8219c50e96ce00e6ef366ebf493a839e6cfbcd9900eb1f3662256dc89361fd8325b0fe69ef8644a4efef642353b7009bfdcb66b851dcd5f45600f76f9be1467157d3b300dc7f6c861bc55d4dcf0570ffb5196e14b7e5b806c0fdcf66b851dcd5f4660097d5b1186e1457dd9d08e0c66c861bc55d4d4f06706bd90c378a33b04e01706bdb0c378abb9a9e0ae0d6a184cb17e3ae11a84ae543fa9034193cb2fdcff87459052f8b129e69ffb312e7b842c45124c4f07b658eadae761e59232618a9f98284af08855468b703765997126df04d63095f0ac82c350be0ac67134ed22f4790e1ec0170d6b70967412471ce07381bd884737024719e047036b409e79048e27c1ae06c6413cea191c4f91bc0d938d38d26ffcdf92876fd1d03d06e4389b6bb73c25b9889f9a5d399da2b6fbdf3e05299a0eae7a1466f0eea269680dc8412727b86ed15b575ed74f215b0daa69440836d4f18c5bd4ede05b6d9cc1694059144b92bb0cae6b6a024fd720e19ca3600650b5b50927e6e9b0ce56700654b4a942d58621db577256a86f67a24eb59ea0f7c642b4a84a9efa047387847b683de0680b5b52d859c74620f5921ff1da06c630bca8248a2bc08f8cbb6b6a024fd883619caed01ca769428d58e3c1c55597cdb83625105f13d5132540191812c02c5bb7d26400edc4a414e02203b5082cc66de3771b5374f8978c0dbab34d179a892a98f0aa81084efe5d750e1bd1814f88e99b0d3115ba99d6e0fecb4132548b5547c294bec2ff1bffaa5912301f4ce99a8f921746c463fe9a686646b4e1601945d323100e2f76b4f83292d93ec6b4fd7029c5d6dc2493ab1910ce7048033db269c0591c47906c0d9cd269c832289b31ce0dc961227d7804ffbaa944d273e35ac504e038bde20712380ad3b25b6deccbcc1a1db3557dd8071a1137ea9e0c641f3162af10730fa5201df0734f673a2069c70ca3819f09b00f01e51034e388d9c0cf8fd0078cfa801271cab2203fe3e00de8b1278b8893e515cccb31f409b6b4bb736e9eb0359e7cc9ba0a5d1db1694a4af0e6428e700abec630b4ad2d7063294ff02abec6b0b4ad2ee1632943700abec4789b24335d5d0d63332b01220ed5f93d6e9ed5b8de2ee7cad01ca0194285bb1c4849ec4208bba9da12116ba1d2381bfcccb445b731d5beedcae64d83abc29f201efa6f284857d0615da41006d3e255ab57d97bf8114d27da6c8ecf43a0073a04d30a3e83baf073007d904338a3b9b5e056016d804338a3b9b5e03600eb609661477363d1dc01c6213cc28ee6c7a398039d4269851dcd9f4540073984d30a3b8b3e96900e6704a986a5d5dbe187c2e1330273934d68aa4f0641789bfb9800c7c24ee262aa04701a023288176044013c73942d86af1aab9f57c796f1e803a92126a530095bf97978b97cd8cbca5936d079b07e08da28457c0b0aeb8122739dc874e627c9f9c95cc5dc5bc4a44b4962d7304b86b978be321135fdee316cdefae1057d6d2becfbf4135767405e8711a4def1612f838f2f5d201ec21b267a2c0bd871439d9399639a20817859375323705963d86126aeadb7213b656c91cc62860ab636dc44aba4c9c0ceb8fc05ac751620db7a31ee97813d9d8fc77c066c7db0c378a1b6dfe04e04ea0841b7cee34e19a3eb2d9a90b80239868134ed2d5a66438af043827d9849374c52919cee301ce424a9c6a6cd4bbe2746b191b9d0d301651620cb74b296175544885b605a88e2667a2c063c5bdea2ea5844d27b259ff9f034b9d62134ed2ee69329c4d81754eb50927e9f446329c1300ce629b7092be2791e1ac0038b7b309e79048e2bc14e09c6613cea191c4f939c0393dd38d26ff6ff151fc6ed9f100ed0c3b3bf508b19275eafd031a4f336d7af924dd319fece5733ec0b9bd4d3849b77827c37909c039cb269ca413ccc8701e0470cea6c4a9b694c1ab27ff5bcac06915846d02b20915eb40c5358712bada10099beee3f5aed11b2dcd01d63bd71690515cdbd419809c670bc828eeab5b004096d8029270b22e19c83e00e40eb68024ace1c940ae022077b40524e1c206ba55c900e47c5b40122eb72103b90680dcc91690848bc0c840ae062077ce440748f01dc809ab1eb21dc88b01d6059458535be84dd82c225be87d1778e3d98512695b03d2649dca841d74645dca9f02fbdcd52698232208f3330073379b604671b0e3260073a14d30093b37c860de0e602eb20926619d4e06f30e0073b14d30096b7332987702984b6c8249f85a4906f32e0073a94d30a3f84dd07b00cc529b6012be5e92c17c16c02cb3092661a70719cc5700cc659430836d7515c51d466a8197c9724a946ae92cffee8d929aa149dc3b53c1db11d8e1f24c74bee58b0eb80ae7326700e71c45fb632ce700902b2841f664e66d8021caad7b97dafd4181df9d12b5fea5e484dd6e5dc3bd0702a07b64ca096c8d5f64ea079c404526ba8ae197c336ca9e76af6dc2de7742dba4db1803d8e6ca4cd8e6f0add436d701db5c4509b2330b3af3783a5bc1dce138420bed4d05f60460a1ab33d194c7c62fbd4df928ee22361ed8e89a4cd86862bb55ef362eea38d109cc3f53bd81f1ef26ac17de95b0f3b81315d84b01d83d6d054b58f8c9c06e0bc0aeb5a7f0138e639215fe2500652525ca6d9c13efb7e7139b0955467082425d006e1d25b8e0ab85a3389ede00d4e7eb6dc249badb0219cea100e7069b7092ee054286b314e0dc6813cec191c4791ec0b9c9269c432289f323807333254e7ec203f33d40a287a901a8b1f7aac9a134fd95318aedc63781cded6d134cc2f96f6430df0230f7b1096614bfca713580b9af4d30a3f8558ebb01ccfd6c8219c531f32b01ccfd6d8219c5af725c05601e6013cc287e95e31000f3409b6046b13ffd5000f3209b6046f1ab1cfb029807db04338a5fe53808c03c841266ea1b9b13da28d9663d9d00d6436dc44aba812419d6175802eb619458c3edbd4dfafe4e369deb0b60b387db0c97f07d9e0cee3700ee1136c3257c8b2283fb06807ba4cd7009dfaac8e0be03e01e65335cc29e2932b81f00b847db0c97b0a78a0ceec700ee3136c38de2e4efe700dc636d861bc5cfa0bc0ce01e67335cc29e2d32b8af00b8c7db0c97b0a78b0ceeeb026ebd2c4df8e42ac2278951763ecebe54a4df9d4d37c07977e4ea9709ce4b9d733527799153901738ff83e5c8aece7fd3f598584456c436b135e22a97572a64af74eef29455b27cbe8a600b37905ad2407263f59ddf7c1afa12877bb993b6d5ceefdc5843e7ea0647ca5279a55ca6888388c59a4bdd5739f767b03291d1a5f10c5fecc8e214f2fa3bc162439d5fae890c884fd11ce0f99861e27af532b9e6c9a59dc0d58b99edbf226d79569d46ae99793fd038007ca211d3b47afdf0fc6f9c2457f206f0bcd89af53f91e7bbcc7661a66d638d9cbf4a9c9c778597b1ed9dc0a52251fc5fd6ff01a08465bcc7440400 serializedProgramBytesString: - serializedSignature: d360fc09df9f620c2cbdbc9ff1769ee37a721536fcca7bb672c71a439702444e6df160c8761953a02fff40d11bf88aebf6bd346d654d1933aaf6a6d6a3385b00 + serializedSignature: 0db79ec567b6e117f22540a90366d439ae0bbc5b00d60ba38ed8ad98fb0d7027d44881a88eb12cc4f0ba1571b26bd60c02b830442f686513f59d7dac36dead05 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset b/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset index 9c8b26b..9648a8f 100644 --- a/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset +++ b/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c16c5d687e70542972a82140141098aa4d211818412e9104045a5258448203109cd8a1d3b2af6861d7bef8a0d7befbd77afdeabd7eebd57bf9dd99dbc672773deec66f72cb3f90c3fb2d9ddd9ff9e79e64cd999d9d94619ccfa490cb07ecd6133591e1bc866b32256ce56587fe559dbe5d63f7b4f1e9fce2aad6d89f57ba1756e00eb55c795fca75fa28bf5bbc0daab62d5d6952bd9626b5b2acecf62c5d6df05d6b5c5d61e3fbac4fa5f6c854a34b12e9acdf2d9343695754e74aa43628eb8a8ca3996e0f14a34b77e8f656badb3c5c2287e930c71aab3f56b9675a64a9c5b6e192dc3cd630788682db7ce2db6aea9646596e622a1d8fcfb294cfcc1ec4d3767dbddd976b5feb770fe6eecfcdddcf91b86e7c779ecf64f11b607082b3577b2fea759ff7f73f67bdafb8dfa3afbbdecfdc4f68a464ba0d1dbd9eeec6cfb385baed1d4faf35e0ff6a73ab78b6dc3e4a702eaeceac465b41297561e19b774b6fdea089f4aa395b34d0fa0d1da4eeb46133da4756b709ffe4e5a376749dfe2dbe74098e79c6d1327edee538ea739c7ef578e37458e37438e37578eefe66c9f07b63caf5cf38273cd0360dfb2b349bea2f1a213ee416033d493e7b728d7bde41c7f08c4095ef71272ddcbca75cd94eb5e46ae7b45b9aeb972dd2bca75f2781fb0cfcf3f6cc7b1716be7f8eef67e938a14fee125bfece16c5f73eef308d8e7db579de38f827d9e1eafd9f74f6be21c1fe86c5f57745e4fad93969ec2c64ce62ea706286cdf507ce50d47b3c2b16d334bfa39dfbee9847f4cd17b53d1dbead66b2af7b39dedbf9c708f3bfb598a5df2fc16e57c1f705f785ea6c17f9ce34f807dbefd05b95f8e725ebd5f2e481b787e9012eebfcef92795fd5465f1764a9cdf72ae791aec37b12f49c96e701dece4f9b0d8493d8c9d3c8fb11ba284ab0f3b19d7ffb16439287d54fae4bb8ece3320ac3cceb75f33b7ef7f6d6bb4903e9fa6e8bded847f16ec43dd3f95f37f3adbbf808d0e6bfe67cdb1bfc031feeb7b47e739b0cfed926d1659de4abbde57eefbbe6297f487e7c13e2c6fe4fd5e50eeb72e057fa9dd07ec8332b6b96c070df5c972786d566c0438b6a7b31d098e49ed77c031e8032dec30191b9c63c39ced7b20fc3b8a6fbcc7dc3e3bca277b180fc919c6632f4d3ca4f6079a787c98221e1f81f01f80f0f21c8cc76867db4cd1ff5889c7c79a788cf1180fa9fd89261e9fa688c76720fc2720bc3c07e331d6d93657f43f57e2f179807848ed2f34f1f832453cbe02e1bf00e1e539188f0ce62e8b1e01fb561edc2e5d09f70d73d7bfdf30773e943a5b159def9174ff87c24b3dffad72fe5b67fb9d62c7778a1dff74cebfa8d8afd651cf033be475f0fc4bcaf5b2ac7a04ec5bf16b335d09f78362df0fce3647d1d9ead669db45497bc9e1df0a07f5fc8fcaf91f9ded4f8a1d3f299c7e4638c9f3b26e7d1ed821af83e72527b50efc95b9ebc05f15fddf58b2dcd65d2fcfbfecece721e17e57eef3bb729f3f9478caebf833490b10866fc7b19abcd54eb6d5ebdb369f606f138ddc7e23f6f936c15c6dea8413b7764efbb7dd2647c779864c3456741ad7a1b335858d05ccdd361fcf5c7924219f2d1f00fbd6fff6adedebdacbe739272d12f299f331b75e224dd1dbead6ebb0c009efb42f13dd98bbbdb7b762973cbf4539df07dc179e9769d09db9da9709a7ef26d103b95f8e725ebd9f6c5f4e54ce4f72874becc45cedcb9a7d1f6df3847c6e7f1aec5bec3a5e5407bbc975b093e7c36227f53076f23cc66e8a3b5cbdd84d75fb1f9bce9279dc890f9b018ec9fe9999ac26dfe748fba639f76d960c9f9075d42c675ff691bc02f6adb4d97e740a1b0b9dad6c3bcabcd282b9caf184b4718ee6fe73411c64bb741f704ce63bd80728ef23fbd2ac3099b2ec9eed9c037d51899620bc3c07d36b5f67db54d1df4e8987f4e7bae221db41301e8e76a28d261e6d53c4a31db8571b105e9e83f1d8cfd93653f4db2bf1681f201e4eb844074d3c3aa688c7f6e05e1d4078790ec6639eb36daee87752e2d129403c1cedc40e9a78744e118f2ee05e3b80f0f21c8c4713457747e6aadfc53e28b7125d99bb7e57af97e7653b627ff779768086c381c9b87491cf93f56d07487b1638f7e8e9d8f32ad8b7c274a94ea135dfd9cab2bc1773d7cfbd1c8d1b1c9b3f73df3bd19bb9ebe7f9e038d4dbead6dbf12d27bcac637665ee327f21380e757771c2bda6eccbb25be6c99d9de3af837d7edfadee706cb1b35de4847f43395fa4dc473d5fec1c977d855eea5d69db2b6edbbacafa6189923625499fe9f691b3ddaa684b9feda368f771b4e5f3dc5245bb34a9dd7729a22debddbe8a765f475b3e3f1da4682f4b6af7eaab6863e95ee6be379afe6fd591fefd94f4ef67dbda6d5ba4bfccaf4a5a31599f3dcc5c794aa437bf673a733f7f48ffe9cf92e54a7f10966f7763eefcbb9baddbf32b47234db987ec377d16ec43dd3d94f3b2af6f7760c3eece56f689be0ef6ad7b77ffcabe6f8fd14ada672a69bf1c1c8736e630779e97fb4fd9ba3d253f99f6198a1d190e03e9fb2bdc3c6bd2614b1df6c9ebfa28e7b728e7e5f37889fbbc645a737d9692fef2fa5ce5bcaa2fdbc9e98abe4c876ce66e57cbf8486e6a7cca95f3f27eb2fd25d32157f10569a7f49541ccfd5c2ff52b94f352ff6077b8c460e66a97fbcea38391f36a1e55e3354489d710255e43ddf1aae13cd4ad5b2b7dfb83f4b5fcb4bb2cdfb17240b633c228439639360c63fa3204f41d8abf6558be1dc1dc65c8085bb7afecdf4853eeb1a7c26f4f45779472dee9774e807e49f137dfeec5dc79772ffbdebd07d8f7ed7dac736fe9d363149f5e0e8e431bf399bb0c91fb4e19d257729365c868c58ed1b61d7d6e70c255ba79a265886a9fbcae8f727e8b725e9621cbdce725d39aebc72ae92fafcf55ceabfab20c19a6e8cb74c863ee32244fe1a6c6a75c39af9621321dc629be304ef115d957f0bca25fa19c57cb10275c62020b56864c40ce6365888c97ec737816ecc37815b8e355c3b9c0ad5b2b7d8783f4e5eda835c0dfa8cb9052c786bd99be0c99c492f9771208cbb79399bb0c996ceba6cb790969ca3da62afca62abad394f3b20f650ab0c1e9e7494c67eebc3bddbef72e4effe72eb2ad28f3e84cc5a79783e3d0c6d9cc5d86c87da70c49977d3eb20c99a1d831c3b6a39f1cb7a872f344cb10d53e795d1fe5fc16e5bc2c434adde725d39aeb6729e92fafcf55ceabfab20cd95bd197e950c8dc6548a1c24d8d4fb9725e2d43643acc517c618ee22b7399bb0c91fa15ca79b50c71c225f661c1ca907d90f3581922e3b5af12af7d9578ede78e570de7fddcbab5d27712485f5ed7c9b90141ca10b5ef611e73f73dccb3c3a47f9f424bf64bc8f2647fe62e33f6b735faa7db76f75fe0be77e200e6ee7ba806c7a1de56454fce6192f9eb40c51f1782e350773e73e77fb9efa5cf1d2b6b65dc17b0da733ee47d173257f99b58008ef3adf4c707c0bea591a1f6074bbd22c5cf8a14dd62e57cb1b35d0c6c6ca6689628d794289a4bdcbe5be3370726354518c03db1d4b9e66db06fc56bf7e9eef072ec1b0dbf0ed80faf5bc9dcf954e6471927596e3e0bf6619c64fa3fefd667ab9cfd8314ff5ced6c653927db760f837d791ddf9629fe5b66c767c045ee7035fd33cb9df0ef807dbe5de11cbf5fb16f8562e7bbeee3225c0bf735320e22aeb00c9571eb03f6a19fabd72f09787d69c0ebe707bc7e81bfeb6beef7661de15face37ecfd6f3faf901af2f0d78fd9280d72f765f2ff3604d1d27f970de5679b79b1cab0852c7c9b2b98225f3816ccf1fece83c02f6adbc9939590957c15c6540a2c26d4fa252f1b391e038df963be7df5374cb15fd77ed786796b9756aeea3e8c8ebc57c21a8f3be727e1888bb8e552a7e73158e55cc5d4f55d9ccb29adbb6678d76c2cbf65cb59b9dd44b542b7a5b15bd356e1d3156942a0ef27eab94345d65eb65bfa4845ba3a4a9bc9f64adfaf23ee038dfca7ae73dc5ceddc079b0cf647bf503b00ff5d62a5cd73a763fe50e5f63df216e9f933a35ba872af6cf01d741fbd4f01fd8e9982ddb7cfb68e2057d50ead4953ea97c4c8e971f0634e4fd0e67b5db54b2ed700473b7a90e07c7f9f64885e991b646ae7c57264dd13b8ab9cba7a314dda395f3473bdb63808d339c63c7268f89f3f218dfae73749e03fbdcae2b1d8da68a5dc729f73d4eb1eb78e66ec31cef5c3f53b9df0bcafd5e527424ffb4242379aec6ef0e67ae323a677f702d0f372d801fc83cd8ae0e0d195e8e55af0d704f4723710248af136c3e83e49cb88e8a4f9ee030781aecf3f38704b043f23b348046aa7347dae9354e8e21ad53e2742273e795136d06833fb2af1b22ebe2a3ecfd41b28e5aab5cff28d8e7dbf580eb7a5b7348aea3e93cb3b0a311db3a82eb601d2175ce73c2c97240ce2dd67170f22093f3244e6235be2eef2b8ec1fb4bdd8fea991ec77ab02bd5f5aadf9dece8bd02f62d0e4365b9217de8b83a7ce87885b7bc8fcce3a73277ddb10e1ce7db53145f39c5b6639833ff6f981cfb3bc1de9f2ce748ac07e15b80bfbdd8ec87d3690aa7d31cfbe47b0b92d38975dcf324963acf9ccedce5c0e9f67d866f6f5f375cbe637032c2e174c0e1748f36a5e270aa62df06e6ce371b1cfb9e53c27754c23f00f6f9f95302d874ba1df7bd65f9e1d83062a87d7cc402254d4eabe35eed9debd7d8d78f9475f9192cb54f9fcdf43e7db6b3dda8c47da37d9f9172bcef4c45ff2cc527e47dce63ee76992ca336b29af266bc330e3652e6dbb335fec1ef2db5cf71a76b4aad739ded2c242c3f266dfcd8d93f9fa5f47326f353aa39c317e835126780f4bc10b98f6477a69b5d8d5f9ee96ccf52d250faf9f9c97b88bf65d814e93a6aa8125edee36cc5860ee038df5ec0dc75420745479effc47dbc268ee73357fb69cf758abd9ab8d470c0e2f29a72ef0fc3b16dd464e5fe67827d980e3bb875c43e6478915ba726dd647c9e66aef8ecb554097736abf1e1bd6439314b3907d248ebf31723be27ef710e739795e738b6c8e7a06c25dca7ee70a3e55cf94bdcba62ce939c2b28ebc54bf5b688bcc2b7e73af7f80cecf37bc86758f92e481fb00f794b5b2f546cbd50d1d9a4e8e86cbd8cb9cb8acb5373f45456a4aa2fae64dafa628c33af6d8cac93a41f5cc13cd5176336dbd7e7c9f796aeaac31f2e626edfbcc8d6199bef84bb5ab9fe1a4547e6a98b992baf887da40c1f2bc7341c5bd5fa60ec2dcefeb5cc9d9fe4bd2e51ee7589877b5da7f8802eef5caff8c00d75f8c0151e7cc06bfaa5f2959bf5be92b7d149eb07947bdde8cd57f29cf7dff365dfce4d8a6f5ccadce5f0a5f675f94efb377f80725d47e5baadca75453eedbc45d1d7a5d9ad4a9add56479adde823cdeab22f559add6edb51f3fead97e7fb3bea713f79ed9de0dabbc0b916cabdeed49c4b659bcc9beb02b0901a1b1d7fd8c4dce53edfb7fc63fc46773806e6fdb3bb993bffeacaf05436c8ba5bceb7bf4cb1e132db86095d34e1a50df730b72fe96c90d73bf3f313972bf7b9dcb9cf3a4d78791fb90e4d7de3ea8c9d2564f924db49728d940792f71261f8b107c1fdc738db2dc9fb4ef432ffff21a62da7268e7434a6a7d0906db82b99bb1fbd2338ceb7573177d972957d8f02c9e561f7753575c6d5ccdd769065da35cef1cfdd76b04701a3ab9d638f8163b21edc9a64345996a38f00ad168a6e47707fd046adb36da9c4a7a66d2acfcbb6d066e66e0b6d76f848dbe4bc81543efc047397a9a9d2bc9d739feb9c6b5e07fbd67df7bed21dae26fcf580cd93cc3dde28c33a63020959667f01f6f9f606901e3780fbb6007ff3edb5e0d8b5b65d93462376dd04ec7a1ab14bf6c3dfa2d8e5d457899bc1fd6e06f785fd86d20ed9172ceb9c0d2c75392bd359d67b9f827daee7b4a926c93eefdb9c705f827da9c38fcb7ab287c7fb7bf185db155fb8ddb66df2b1ee704cf6f3dfa170bcc339bfbe0e5b0ef318ce6f5fb24ca33b997b8ced4e3b1e53ee50c2ddc5dc636cb2fe95fb7733773bea6e4567ab12fe1ee61e737b141c87f77bd77d5c943ba9383cea319ceb585a42bca73c9115b385ac82658817b7fb33efcbe6c92beb5e304fbc23ce7ff19f7ee2b6d56cad7569b16ed5bad9624dbc6a9663f9b26ed5ba1dc5bb9af2ee79e2f7422b44a910fd3a51eb16f7d6ba0537aeccfa570c96dcabb28e4f102bf6f145f74aad3303d9646bcbaf5ac0b2d83ceb9f5b658e75db32b6d2da2bb47e5708bd0596d9b543d61525be3c9f7acd4c4bd35e3d70b9754402adb0f6cb8485b3c4ef55c2d262617d8175ac5aac65b88295b0b1d6768db85bedb8575a7febee59e820d3dba85f44103b6e2f55289329df8a0db73e43f8e2df29b22d5284a36fcaf307ff69922146a34faa95127f33b40b19fe9057e06864096409d7b16c9621c6df67d622e83f8eb563a8f76f9bf760969b322e7a323cb9bb8918245378e0a11bdadc76fa3d4bd2dc51cb61196208bf7b1d514b0596eba58bb7a1fd44212dad49263754c59fd0e117d33f674588df0e572ac2f94f80a6a2f273278078ddbdd0fa638df5bfcc0a3cddfabdd0babccc29e7668860fc7fad34cae482cd04e6da95685da662a01be9408be7bec26de2e7d8d2b5a95137af894512758668197549e190d8bd4493a9b1d36e9259a6f7acb70a4ed8f0f02f6f4dc91d322273d86569faf46929d2a73e77c552a8b12e855a469d15ea2efb53a54fab9a7825d387ffe819b6467cbc2e1b30824d74045b6d1b1fe7b6d7cfc7f924d23d14867a7e6d52fa602a0b3082693a826245a9d911129c66597890d362ac1fc3b69e19b6130c77ac153b2f3660149b6a2866728aed7566b550cce21621c2cd30e10e01859b63c21d030ab7d039d4765167497eae5ca82cb4c2fa7727de97babb5aace9fda9139227eb3601f3a696bab4e10877d05aa5264e273c715a61ca9d832ab7c694bb0455de4ee750e21db8e8dbebf5ab237959d3d9731dd995a56a6efbad21dbe8e88915a6f627a557bb1b49fe35d6ba76a9c56195e81b58695dafeb764a4db49be7d2bebba0d98be93ac3fc5984116eabf37c8ebd0796ecaaf377c59dbf9d4e9cdf71272fc574775cb83d965f7b6af26bc24f7eeda0f3b876d179dc2c96cf2659e7165ae18b452f083f3e5be41459afdbc7dc21537b5c2fcf1ed7bb96c7d5d722cce33a621eb773081eb73d26de2704f14e98d7f50dea753b6066ef1282d99d31f15d4310ef8289f70b417c474c3c3d04f1ae9878ff10c4bbe9c479cb683756fb89f32feba796786b5cbc3b66f9ee1acb9bf8b4bc07e6e403823af94e18933d344cd6e9cc4ec1a427263e5023bec1a7782f4c3c4323bec9a7786f8d7886a8e08e62d1b671f4c36b13c4d7a88a5d4f98f2bee5624c845b24c757665adb25c20a7e9c5b51f7b05ceaba2bb3860fe84313d5f438e67d90903e16bc6fbea568b3e86b563e209e6e98cd581dbdb3cee1f9d33c7fbbbe56df3177d6f94e0b9fdf7f853835ddba034f4d7e9c0f89d6ca13cdf03cd1072be17235255cc26709d75797e144ab64c536cd70e3acdf2bc5a311ff7b9593bc85e2dec90ef4205989af39d74353b389da4debb48385d3667b70da30acc7dc7117acfc1da2297ffb26fc95bfbb62e24335e2653ec5fb61b5e9304d6deaab63211d531e1e54b93f0664840e48237f4076c372f6484dce663e73f6ee98e57b6a2c2f6ce2cff20198e5a342b07c0f5d99241e664a49cba4d94ee1bc56e4df129153a166b29ae1b93755685ebe4c61fc3b902b851da94b22be92a1b707d2d1a204e27ce86cc5ca9d81ba24e7d5d6189df93eeab70c5d728bc7cb28c72de0d86cfdc62dc67a4ec63ca61fb7f06203963c99bae4e1d93d5f93dd87a6f9cbee593a711e7e1cd3b447c5037cfd4665c65b57356dc2ec9f81d64fb3343f2316d93a3b798b6c82c6ce4cde6ee62bf335128952201265608abca56b82facf5db5e2938dc727072b66f7d614b38d7c16b3b998f8248d78639fe283b0d282bffe57abd13c5924516dbabdd8a196631f6e6ded8c516c71e47f975bbf39d912674206cff4bd44876fb5557b945b4dff3d58a518ac2961bcc3afb8a60dc615b384e212512c2c17d7716d3bddf8f96cebfc706b9b636d7bfb2aca0663f9648aceff783e991acce1876098a7e9302f080573fd61f662abd952a7acee25fae95758772a7374f9bcb622eb58b5386b5f5fc1e457a079695ee53339866265e2744d9938b2a5bf327198aeda12dd8b510e668db142558ac949fe2bac199e2bac994c3f9095faee5855355c972cf64c120f2d899978928cd02589e8948d72168e5a3df84b9442cf89329be967e0d4757f2c5946eae8895ee71911d2f3322f544f6e8e67727305b94eb5629572ea24426d4f9d33736ae21b368a39a375b5e85cdca1476105d8be9a02ac492b7f05d85e98e5fb692c6fe6d3f2d198e5f334963fe7d3f23158adb7bfaed6633ad353d41a6331d30fd098beb1b53fd3f330f10335e2dfb7f5279eaf13e72d3afede59d0a7f27198f88210c4c763e20b43109fa013e7fd098b7425862a3c1a179e88f9e1622fc2295cb000f392228d97bcd6ce9f97ecad13e7e18b19d2485dc20235522761984a74d995b788fd3652796564e2f3c0640cf5520c756930d45330d407e9502f0a0d757c9e09a662596b99266b7dd5d15fd69a86156365211463d331f1e52188cfc0cac81501cbc899984796072c236761382a3438b4b30a52e028c4bce4605d01bcbd3f2f99ad13e7edf84a2f48523cffccc184ab020acfc5585787e07afbe8c4793b74a517ab53b441f7c512719526112feae42f11f7c3c4576bc48b76f0273e0f135fa3111fd0d99ff8fe98f85a8df86f3ec50fc03ce590103ce5404cfcd010c4e763e2878520be4027ce7b260ef7e2e3b371e1853a615e6af265466b55f8bcbbd06f855fed54de25f56855f9ab9a176171395217177ea297ebae7eeeb518bbd73addbd784538dffa9769fd5f5c6b848d9fe16fbb570ab27eac28c2ac384a67450760c572a7f1b350b0afbf05c5980547eb2c68092c986f15bd9562dcc35fbdbd042b7e8ed1956d5dfd153f2558263e36844cbc14b3fc388de5eb7d5a5e8a597e7c08961f84597e82c6f2cf7c5abe0cb37c7d08969761fe79a2ce3ff938e53ca72c3bc02a1be639e5d070e7a1c33eb68fd8eec14659bfc781326bb1102ab3fe2ab28e5558c7968af2658de8c42c16478b7c9669cb31fb4fd2d9cf3bb09316c9c9e3bd6ae234dc89cf019a8119bbcc561fa0968b1055cea0b2fd2866c7af8ad91db26bc5957ee2b4421727ee2027d79c509e6ac5dacecd98fd33d0fef1f7605b8e39d9a91a274bf3e9641598f8691af1a63ec50fc63ce0749d07f4f5e4c1f6a37386b5cd758ed9de7c281be4841d6c6dfda4692596a61bb0343d23709a5661f73c13bbe75981ef598d25f5c6100aab953a71decae36bc80669e5adc2489d839112abbda64152fe38adc6389d1702a7353a71fe2ad4f95e38a578156aad4e98cf03e48b14079a077808a67c6150e54331e58b822a1f86295f1c54f9704cf992a0ca47689433c4db29fc817bdbbe7256bfd7cd2ed5f9b476587213e3c3923b316faf9bf97dd5ec485d9af136e065ac761b70f3607f6dc0755871717908c5c55198e557682cffdea7e54763e2576ac4f387f8133f0613bf4a23fe804ff16375e21ce3d55e4ad14db8f07158eebe2668ee3e1ee3b159c3e38ea1fe789c80895fab11ef3ecc9ff87a8cc97541999c88295f1f54f9240cc80d1a20eff9047232267ea346bcef707fe2a7604c6e0acae454aca0ba398482ea34ccec5b829a7d3a46fb560ded5e23fcd1de80997d5b50b3cfc0ccbe5d63f67a9f669f8989dfa111ffcaa7f85998f89d1af10123fd896fc49cf0ae109cf06cccf2bb3596e7fbb4fc1c4cfc1e8df81a9fe2e762e2f76ac4aff4297e9e4e9c4f0dbfafe68432359c2fecedbcc3e863caf6f958241ed04462abcf485c80893fa8116fbea73ff10b31f12d3a97f7297e1126fe9046fcbcbdfc895f8c893fac11dfec53fc124cfc118d78dfd1fec42fc5c41fd588e7fa14df84893fa6117fc9a7f865587eda8ae5a7c7eb959f2ec722f1842612dffb8cc4153a715ef3f145d203d57c5762663fa5317bfa187f665f85893fad11bfc7a7f8d598f8331af1df7c8a5f83893fab111f39d69ff8664cfc398d78a14ff16b31f1e775658c4ff1eb30f11734e2aff914bf1ecba92f6239f5a57ae5d41bb048bcac89c44f3e23712396535f099a536fd229f3c6d8ab2c7863ec668cc96b1a2687e5f963720b26feba467c7dbe3ff15b31af7903f39a37ebe535b76191784b97af7c46e2764cfc6d8d78e6387fe277602ef94e5097bc13537e37a8f25d98f27b4195efc650bfaf41bd71bc3fd4f760e21f68c4bb4cf0277e2f26fea1467c9d4ff1fb74e2bcc0f88805eba4bb1fb3fa638dd5bff9b4fa01ccea4f025afd2026fc6940e12d3a613e52f89917e11403a30f619c3fd770ee3bd11fe78731f12f34e2dd0bfc893fa213e7b341bff48224c56cd04731e1af020a3fa613e655f1d72c7855bc5527cea7997ee3c5ea14d34c1fc712f11f9a447ccf67223ea113e7d5f0b70ca986bf63f5a9869fc4f2cf3f99669602af07f8bc333ef76d9698a45f2146bbaa59159bc65633fbe3205562627f85afecf61466c7bf7476f0b132391fcdbb3dfc8a4a11da8f654f63967dafb3acb5b0acd03ab0ccdacd13638ef6d86399afbb3e83ddf5072c5d92f3f3f477af5fec9fc5ecf8b7ce0e9e67f93df8cb94fce50df5030a7eeefc1c5628fc1842a1f03c26fe5308e22fe8c47963eb6716b0b1f5a24639432cb3c827e399b0428e5ce023bc55727ed115d3da71f45f191f47e7cbcad0da8b8db4bfa44b779e9abf79a969f2f0647f1913fe3da0f02b98f01f01855fc5b2c07f826681d730e5ff06557e1d53fe5f50e53730e53f832abf8995637f85508ebd8599cddfad0e64f6db3a657bb9580f7ef72b2efc8e4e98d7c98dbc08a79817f72e06ba712238e8f7301c4d02e2781fcbdf695e8453e4ef0f30ce4d0372fe10e3dc2c04ce1f61389a07c4f13126dc22a0f02718e79601397f8a716e1502e7cf301cad03e2f81c13de2ea0f01718e73601397f89716e1b02e7af301ced02e2f85a27cc4bfef6414bfe6f301e1d42e0f10f8c47c7803cbec584b70f28fc1d86a3530838fe8989ef1082f8bf74e2fc71aeb31724299efbbec77caf4b50dffb01e3b163083cfe8db948d7802ef22326dc2da0f04f188eee21e0f81913ef1182f82f98efed14d0f77ec5acee1982d5bf61e2bd4210ff1d13ef1d82f81f98f8ce2188ff47239e21beeec0df5e8cbe4f238cd53e53f768f4f1e2a50538b1ff62eedf37a0fbff0f4be75d4248e73f75e2fc05eb5dbd583d1a17fe4be740e20b1e4bb68903d1394e3f1d296d57587a82ffe7eb8c5358897580f17e815a49cc53a2bf9724e63623c2099d306f13ec16b44dd00853de3da872634c794050e52698f21e4195d374cabc0018184201d014333b23a8d9cd30b3334330bb3966765650b35be89479b74f76c06e9f963a61fe349b13f069b615063a3704d0ad311c8302e2d84e27ccd36570c016741b8cf390809cdb629c8786c0b91d866358401ced31e1e101853b609c4704e4dc11e33c3204cedb6338f60c88a313263c2aa0f00e18e7bd0272ee8c711e1d02e72e188e310171ec88593d3604abbb62e279218877d389f3867f7ec02784ee3a61feb0362ee0334d0fcce2f1012dde09139e1050b827d62e9818b45dd00b532e08aadc1b73babd4370ba9d31b3270535bb0fa63c39a8725f4c794a50e55d30bf9b1ad0ef76c584a70514ee87b1981e94453ae676334270bbfe98f8cc10c477c398cc0aca64779d325f0ba5d04b32a6580b6500d68c9e1db019bd874e9877e0cc09d8813310833c3728e40c4c799fa0ca99582edc37602eccc2dc79bf10dc391babbee705acbe73301cfb07c4918b35ee0e08d8b81b84597c60408b0763c2f3030a0fc1502c0888622866f1c280160fc37c795108be3c1c135f1c82f808ace0280a5a708cc4cafde280e5fe9e58b9bf2460b93f0a2bf74b0296fb7b61909706853c1a532e0daa3c06cb2b0705cc2b6331775e16823be761e57e59c0723f1fc3b13c208e715861b7226061371eb3b83ca0c51330e18a80c21331140707445180595c19d0e2bd315fae0ac1972761e2d521884fc60a8e95410b8e2958b9bf2a60b93f152bf757072cf7a761e5fe9a80e5fe740cf2daa0906760ca8704559e89e5954303e69559983b1f16823b1762e5fee101cbfdd9188e2302e29883157647062cece66216af0b68f13e98f0510185f7c5501c1d10c57e98c5c704b4781e96fd8e0d9afdf6c7948f0baa7c0096ff8e0f21ff1d88913e2120e9f998f0fa80c20b301c2786806321267e5208e28b30173939a88b2cc6aaee530256dd4558d57d6ac0aabb18abba4f0b58752fc1fceef4807e578215761b0216764b31b73823a85b9462269f19d0e483b06c725608d9641926be3104f1320cf6d941612fc7cc3e2704b357e8c4f9b8f7b95e5232d5d70b74c27cc584f3bc08a75831a102c3717e08380ec652f182a0a95889997d6108665761665f14d4ec6accec8b43307b25e6239704f49155188f4b83f2588df1d814028f3598f8652188afc5985c1e94c92198d9578460f6a198f89521881f86895f1582f8e198f8d521881f81895f1382f89198ab6c0eea2aeb30e56b832a1f853528af0bd8a03c1a6b505e1fb041798c4e984f19bfc18b708a29e3c762c23706143e0e6bf6dd14b0d9773cd6b6be3960dbfa04ccdf6e09ea6feb31e55b832a9f8829df1654f9249d326fc3ddee05736f5cf864cce43b829a7c0aa67c6750e553b112f4ae104ad0d330b3ef0e6af6e998f23d41953760caf706553e03437d5f08a8cfc4c4ef0f41fc2c4cfc8110c43762c01f0c0afc6cccec2d21987d0e66f64341cd3e17537e38a8f2791890474200723e26fe6808e217e8c479f8c7bc94d99b70e10b31d85b83c2be08537e3ca8f2c518e92742207d0926fe6408e297624c9e0aca6413a6fc7450e5cb30e567822a5f8e293f1b54f90a2cbb3c1730bb5c8979c7f32178c755188f1782f2b81a33fbc510ccbe4627ced7177dc90bec14eb8b6ec678bc1c94c7b598f22b4195afc3945f0daa7cbd4e990fc2bce605738a41981b30935f0f6af28d3a65fe59d037bc989ce2b3a037612cde0cc8e2668cc55b4159dc82b1783b208b5b3193df096af26d1ae50cbef26c6201db769fa4944baa72bd31e20ef5fb3ce5bb3aee09858e584be0bd045f4ba0af08198e65d8fa01b76369f97ed0b4bc0373bf0f02badf9d98c91f0635f92eacd2fa28844aeb6eccec8f839a7d8f4e990f677ce285748ae18c7bb1eeb14f139a95884fa971d7d9ac4864333b4b2e177f1788ccca1d758975899d250b6a4226bfc43e93158bb3a5e248a5e5eaf3c54ad3c5e25beb79d6ad78c6e2bac96bf2adadcc08456cbc7595bd9e4c95736d3233da4580fd8576f719db3ebe70f7fc14b1e00b75acb4feae02772f144590d474abceb1ae2af5f9cdf7fb30ea9fe9a80f560ac6643cc65831ad14546c868b05b7ca5a36c2986367925a7e62723f1693cf753119aac4042e97123c2e7a353fb179008bcd17bad88c41d3c58e41b9581d7db2f0d22acb87965a97ae48191f6ff1e4155bb9a802b99e9ff83d88c5ef4b5dfc26326ca19bda2b3ed72ff5fcabfb89ed162cb65fe962bba70fdfe46555b5e794844a61941e0f61f1fada4b9e83e563f03ca757f3139b87b1d87ca38bcd5e9ef2dc188b6891f0ac52e145c1f35cf28c9fb83d82c5ed1fbab80dafa95ddd0dbbd9221e654e7cec862eb7afc0facbbe9c7b50aad230bc12e4512c46dfea62344a492df77d618af19260a1e53d6bd954eb6c095b88a69d5b23bc983d86c5ec3b5dcc765162a6e624f9fd8cc9a2042bb1fe5e1a924f6dc5ecfca7cece499ef2cb04f1f0b2d069bdc99a6a9af5f73876b025c4e5b665bdf53816e77fe9e28c2fd006f3843b9d5638edc954e59b1f8b9fc02cfe5e67f1481f35addbee12567b5d45bc66d5adc2e827564f62b1fa4117abbc14358f1d8bf1a2b6592e3ccf7b3b5e5f338795724f6171fcb72e8e83d094e34f2c8bac4032ae93adb89658212a450745ed3a36ec56c2d3583c7ed4c5233f4039b12d4b8667b058fea48b65a6e727a90975b6f0c228cb9fc5acff59677db68f16aa5ffbeb5b223c87c5e0175d0c66f928996d8f4bd63ff63578d9e6ce3f5ec284e583cf630c7ef5928aa9dae37e53b1be65de0b580c7ef35256d42ed7f1b4f356c2bbcf84954e2f62b1fc5d17cbb19e4a44fe7db445c2da85c2abb6edf3c64b580cfff0f2c49bca13fd3df1a64abffad4652f63f1fa8f2e5e233c97f2fe6285a7567de2f40a16a7ffd6bfafa9ae1c1765cdfc2a16bfff792953fcd407782b8afe79f8352c967f7a791aa368117b8f757d6b8bd7b138ff8579aebf3abf403cf1948961bd5296ea7986264ddfc0e2c71a69e257cc68c744f8f71e2bc5b3833de63147f493945abf1789d8d5d74b8297606f629c123a4eb38939e16347a90905e7f016c6a1918ec33edbb80ca02e1ddec66834d6d118efb12d5920f2bb59edc977b09836d1c5749ca71a7c0ae31f03a8165fd6b54b40bc2734aa56e5bb583cd374f1547b7dd436579e8869edd4833d395e8e87db1a7b0f8b63535d1cd5d658ed3826fb49b89d3c1cf7aec59af2bad0fabb421cf716bbfa8db2bc8fc5af992e7e23eb889f5d2f252ff0de0a0b37d53ec062d55c17ab79217b2696fffc860f97c9871893163a26036b6a65f79893aca92bad80ee1ee771a27526cbdfbaaef563f94798e52d759663a365f0eef5e94f0933461f63316aa58bd164c216d24ca7f62c16b1b627ce953a75e92129ea98fa78e02758ac5b63f5a2df74acfbb9bd2ec530e2f92916cfed74f1cc47e23955c465b568f32d73b57cf8f8ee34ebcc0a915afe4675c26be57c86c5b28d97da5fdfcaf1d29a8bb2afe2732c8e6d7571dc99d5d557619733c99a5d5fe3fbb1f00bccc2763a0bf7232c49ecb80579260d67e4e14b8c487b1d9151be735f7204bf5cb4c2cb5c537153d714b527edfa89d95758cc3ae862b6afef98d9a5a7bb64f1139720e550ea72b699f52f916865fd394e78209f0f325d5cc1f7aa58464feb9418c59393a6a5d70e747978f238bff772cb1e5e2e14d6f867720a35a6d0b191ddf4173ffd123c99aa9d6cabf9005e9ed02f73e26cd7a455e2ab87c50e63fe2437d0f2a55271953a291d8b852ea70e047915c6aeee38c9a9eb7c6eeb62e117bcec5d64f95a33274652cb22dd8b936e6831dd9ea76a4f27551b65f4e671dcbd9ede54b7159df8dd1aeb7da8732db2b08cd4d96e0b4c75f258a2bdb5331f605be11451e542b2c0c9a075de55fd60a17ad73d8480acb1ea949b0daa679ddc8ec2d5ece97995cc99186b1577cdd21a65f2d4d88112592b816c3ecb14bff9a71779bd56686de380a9282f89a93325a6ee2e4caa87cdb6ee52e4746d4c140dad22e76d9c2a2b327100b9a06f1264174a90ad05c83c01497adb7461c6aa58802a1b9604b52325a8362e8f73038b4bf6ac1e9e84d595125617018bd72f76ab3bcf99855522dadd559634ef671c27b2abddda298a05c0f5e39200bbd17b9bfd18c3078c2a8509dc5cbb6b200eb0360c4ec2ea4e09ab85802533237fa65813936645f31149443da22ee6e3042a7f6812d44e66362cb26201f2ad6e49903d29416e0f405631bb9bc25d9215087cdc07e300aeeff824b85e94e0daba3c90f76270134a9c6755ee6b71c0d5ab5d1257efe80aff38355d878e4922da991251476b47f614aa0fdfc9f195b8b4c1de028fe27d28b135159e650f8b57c6a49eec021aa87d29e16ce72aa56c230a993dc378592c506d9c9044b54b14a8b2628baaf5c424aa5da93b0c654935cb0ac69b0bbc9f357e4f8af92023f6a32edcf54f8a336a86d2e3f3ccd804b4f3d3cd6ce7e7c40264f75e4990fde9fdcfddce1f63791e9fe0ca4d5a5533a92c0ed8aa419fc56ed4ad7c59d2c5b72db611b4c5768f0a577cbd2b1378d700ea51a4a477c11518e28069f3a024a63d2831b50398e2dc37f111686c0ca41f9d1c27c6d3578adbc7691097cfc99098322831756072f8235fdc1a9bc81807689b41bf5766744f947c5e57dcfabc8e6d9244954589aa13abdde68af7e3d22da004cba6f6325833c60f5511a81d73a26ad9275fa72815f562b96bca5d1cb0e50a6ccdd21471f5ddaefacf1ef3c71a9fe7c69bbae3ac864785385a2dfc5299f7c627f71a67792e9cb7969ea2a990ee715e58ba8787a4741f9ddbe9755431e91e865ed2030d1006b93a27d0d5d90e296ff939bd8e62323dc50346ba8767b5741fbd06e975ce8548f7d107969e72245c7f568e29494bf03940e9c85404f57852119fee975e6bfc21dd63f7687abda6dfa4fb6c55a47b7a7a4af7350e9ceeb9e5ace665b5573dbd8e5ef7e4246efde4eb4c5e900dfa7f3ebf3ab39775683087c05760e63f76ab6308fdd4b1f9cc9e4ebf8295b1d44b2b66d5ee90ed5ecb06f722edb29da1b3a685ab25d2c94b04eb35f107749c0d350967762c718e003887998433279638cb00cee126e1cc8d25ce9301ce1126e11c144b9c97029c234dc2393896386f0538f78c0267090a149acfbd73301dced654386f61499ca34cc2991b4b9c97039c7b9984332b9638f70538479b8433279638cf0138c79884333b96388f0138c752e2dca18e9add9dd107d1a1ec4a85320dd4ea79a6a0cc8925ca4301ca7c535066c712e52c80721c25ca9e1a94de17f0e1bd8a64707b53c13d09c01d1fc5f0f310eb7f71cd4a2cc96e5c7eae42743cf30be2e7a5a5a01a9a10c52454bc56c73e2351eb65b3f0b0b6a3c23a18609d18d51b54dc0b4b9c4180087c723615bc95005e01f59c3809afb4c164e9b900dfdedbb20e8772a4d9b81915ca5f00ca4951acb890e564e3caa8bc702615ba3900dde4a8d0ad14812242b7890add0300dd9428de5b5eec0ce0aa8bc3ca989266deb95418f70218a746b55c4ac3c8bcc301ba6951a16b1899f73e806efab6ac7dddabfe113ee491b5036f040f7933a22807b35c0f79f274441e49d68899083c7226f5b34805b3a77bd993d1560af7484ed58b5f63ba3380372b8aec8cd5c5eec634617626f3c39d01ca42ea377796ba26858e114fc6b596c38b41474273006df6b68016c7de976600da9c283ab5bc3c01c32e2dd21eed3c2aac25a03e9e6b2256d2e12b32aced01d67d4c9ae3433aec4f36c7676780735f9370928e5393e19c0c70ee67124ed25914643857019cf34cc2493a658a0ce7e900e7fe26e1249dd04786f37280f30093700e8e25cebb01ce034d994d9145f91c44f61cfe1b4ba29c6f0aca9c58a2ac065eb9c01494d9b144d91ba05c680acadc58a2bc12a05c1405ca4c96fca650edd77e79884a71367ed5ce5a50562e36734e4f6e0c7b955600ac45e6ccab1816c3aee04120b31753af05efeed5cc63e50e0d326c6da8b035011eb884125be73a33b67b0a3ea10f924dc01f056096980473680c610e0530979a0493b043980c667f00b3d4249884b53619cc5d01cc834c8239248630e1aa82cb4c8219c737c0760730cb4c824938e44b06b32780b9dc2498843335c860ee0460ae300926e19a036430770130cb4d8249d84b4406b317805911054c6c3a963a404198cdc9fa897a0098079b0493b00222837918805919d54b4bab98fcec78449354c9f01d0ef0554531f2e8eefed5ada119e72ee07e00673525ce1d1d9c6556a032e67e8d0e1f818cdff0c461a0c772a56940092b1f32a0cd00d0559440f90c5a771770550c071fd240865e4d896b27503e26b7e31d3f74afb55bc0e03bb3c4652599274e0368d79833c59fb0e7926c5c670a40b936da719d2aecf31c31a8ad5b036c874491b9e103e26c07db5a31026e3f3c163bebe856084fb55f87227dfa1e4d96b9413573a849ab5691ae4749f6fc7d1df0d4c34cc249ba5a2a19ce4b00cec34dc249babc2719ce8700ce234cc249ba703719ce0280f348937092ae344d86f34c80739d493849d74127c37924c07954144b2ce5284da708badbc8d6c6d80ae01d4d09af1bf3dae274af5740e891e90922a8c782b6e6312642251cf121837a0c807aac8950097b33c9a03200f53813a112f6689241fd0b94a9c75342edcddc5dc4e5e2621b241fc080dd720da9cbf80ce0b5275002eeca6a8f11e15f878af338d11dc067d74781141604752d524b5ab66ea2427a05f0d213cd794d8070861c5977f2ae00e549db7282821b25e9ba0864309f0659fd649360124e842583f90c80798a493009a76893c17c12c03cd52498711c827b0ac03ccd2498840f9f6430970398a79b0493b07b840ce6c100e6069360c67131bd6200f30c9360c67199ef3200f34c936012be0a4806f35900f3ac283ecd319835cc4f732c03203746f50d09a91a113cb2018e9100ded95178e1a006ea852500e439512c26217b3579a7f06af0ba7ec3eacb5c0dba36cea5c4da8bf9e9789b6e9de72b74d8ebbf56585791e27d8faa2ffe3680f73c4abc1d189c2e3bc50ac88b80e9cc5e053bce5dc357808c7f3e25c2ed1c84fcc64b847f4aed52cb1c32706954e01800774194af0a54b1a556b0250daeac3c1364e60ba9eb72b9807da1a8b1175badb03c67a6311f098af762f63b02cfbc288ad11e775d6e2f00e5f64df7aad86448c9be94720ff0cd8ba36867da154d9ef04859dd4c152dcdea585737c701dfbc248a4fcee8ab1bc277835a52a16b04d05d4afda0586509acb00235940f7cec00e06d3271517bd29531c916b59f08cac5cb4cc44a3a204186f547e0ad976fcb77d5e2bfc8493780f20a735fba22443b9a0aed9f00ed95262d234e3a3c41d6346a02cad2ab4cc2991d4b9c0301ceab4dc299134b9c8b00ce6b4cc2991b4b9ceb01cecd26e11c144b9c17029cd79a8473702c71de00705e67d23b6c8362b938e90da0a174bd4938736389f35280f30693700e8e25ce8701ce1b4dc2493acd950ce75480f3269370e6c412e75900e7cd26e1cc8e25cea300ce5b4cf9940de9cb01645dca6d4123e9565350e6c412e5a900e56da6a0cc8e25ca8500e5ed667e158870563bd9c27c9341b979471458e14ba9d3ade05cb08035b4054cd301d63bcd798b328eef5d740319ffae2866b76759ffdd8bf3359ce9b00702bfbc3baa49d911af3a433659e61100ef9e283cd1bd88a97bd24ca1b58d7309790a8079efb62c21235b63663615ca3b4009795fd443c172c5832231ec2bb763ade0bc0c5d6585b5179e205d0da13b15da9b00dafbb7d5fcb886301dfb4490dd1f306795e238bed53b04a07c30aa6a4836d9c7d5bc23045f6d89efead95d01cc2d51ce765fccea7e33288e1f42de1b94980f990694f0f9870c680500fab06940e3f83e463a00fa886940e3f871916100e8a3a601251ccc20037a1700fa58d4eb1b7ae9e924ac98c87a3a3f0135fd5613a1c6b1fbf80b00f57113a11256506450df01509f30112a61254506f50300f54913a1122eca4706b503a8a89e32112ae1482719d41d00d4a74d844ad8a42283da12407dc644a8848bf591416d03a03e6b2254c205a8c8a0ae00509f3369ca77161b16c38ee77e00e7f326e1cc8e25ce7900e70b26e1cc8925ce7500e78b26e1cc8d25ce7300ce974cc239289638af05385f8e62d0cefe2878a9986c53ee5acd2ba289376403c96b5812e52b510cda799b10463ad99b6c04f478e097af9a04338ec3c9070298af9904338e9315e70398af9b04338e8b44ef0360be6112cc382e12bd1f80f9a6892bda90be9640b6a2cd7100eb5b2662257d07890c6b2780f56d4aac3d3558f5abdb4c702e89ec438f055470f300dc774c864bd89c22839b0de0be6b325cc24a8c0c6e7700f73d93e11236b7c8e0fe8725e1be6f325cc2475632b885c0733f3077b936c251a8d154688f06683fa45ee93bf98d847c6bbbc86251c2265b9794c4b04faa0dc8f01f99d45b4aba4006596f694fe0871f9b8493b4938f0ce75e00e72726e1245d6f840ce7c100e7a726e1245dab89eef54580f333937092ae2446867313c0f9b949384997be22c3793bc0f90525ce3e1a9c5e5b9bb0978a7074f4572ac84701c85fc60132e16c2832c84500f25771804cd8ad4206f96d9684fc751c201376af90417e1140fe260e9009bbb6c920b700c5c53fe20099b08b9b0cf27bc093bf8d0364c25e2d32c80380277f1707c884ed6432c8ad01e47fc60132e1582e19e4a900f2bfe20099f04d2c32c87b02c8df9bb2d224693f2ed9dbd77f80eaed07535092763a92a13c0478e5bf4d4149da1d4e86722c40f963948b2c940906bc0c6d58cb809c0580fe64e682b2717c25b80a949e3f4751db273f1fbc585c5e213cd5fbb274848fb96423b78b81effe1207c8848fb96490a700c8bfc601721c17581c0920ff1607c884551d19e4dd01e4df4d698691be4e4cd66ae80c50fe610a4ad2775fc9509e0750fec71494a46f6593a15c0650fe775baeae1ad92c58b2c59417b024caff51a2ece0a0e45ee75e6e3ea2775d4753219c0110fe69cec70fe2f80adcbf00cabfa2f0c6da1f3f88bb374e000859634284adac9d2a4b6085158877362fb482708445319c40d409404b5042dbbe8e0a45c69434fbcea5c2b827c0d88812a3bf8f1c103e2892d5cbb780264e634a94f04345f3add283af6b9e271efeb829dcec19d65eb1b8c16c2112c1fae79ba8b01e0b3cb4092556f981835ceb7ff2258a02d650beac331f804c8b22ab6325a6bbd14338604cd6e859045036a54429dffbcfacd5e869387e390ec06c4609b3b9b553ea8cb6e73b23ebf16bf8b404b89a53e292efe9c9fec862ed87351ad280db73006d8b286a702f8f85eeb9788403c3644b25ec0b1a462d4dc44a3a0b840c6b3b80b5152556bfdf671e44d97c27fb3ef36690f95b9b84333796382f0238b73309e7e058e2bc17e06c6312ceac58e21c0b70b63509674e2c719e0e70b6330927e94a68643897029ceda3c089c1acbdec01e1d33ad913531fd050ea60124ed205e5c8704e07383b9a8433279638d7029cdb9b843337963837009c9d4cc239289638af023877a0c4d98fd5ee3476cf79b35f89592efee6a3972b8564f273af85cc9e064e3e963e980a765f50ef77de9683719135f0c9baf27e0528bb988292b4714f86b21214013b9a8292b4614ff72d6780b2ab292849fb97c8505e0250768ba253d9ffcb3171fc6056252837bb6f4b0f750f12132e0c4336489c033cb40725cab62c39485c2c5a9ccba31a14269b4c3302f8e14e51ccfab027d3145a879731fbf5eb1542a83c9ae93374cf430064cf28ca49395ccc7dafa4e674439bf6ba0464ee5e94587b6bca49db17f984af156c6ff11c5491b217941030591f6863e0b7bdcd99ad14c78f114d02287736a9779ef49b63649e7937c0d9c7249ca45fc423c37935c0d9d7249ca4afff91e1dc1fe0dcc5249ca4af0092e1bc00e0dcd5249ca4af0192e13c09e0ec17c5e44508d3fb4706081703184d8576146891a69b39cb8ed063c966d9e502acfda37810cd610df3f5830340d6dfcda49274106576272b49af0538773709676e2c715e0c700e3009e7e058e2bc1fe0dcc3249c59b1c49907700e3409674e2c719e017066988493f4fbcc64380f02383329717663ea1b49bc75698b34b40ee65d40bb332b8a76a7845a9a722e48fcda9dff03de996d0ac838be1df73c0099630a48c2b511c9400e07593bd7149084150f19c8fe00e420534012cefa2003b900801c6c0ac838ae813c09801c620a48c279c76420cf0720879a029270b5633290870390c3cc99d045584a9235c97702288747f19ce3b7873d8efdebff6049a8234c844a38f5900cea5700ea4813a11236dbc9a0be0fa0ee692254c2263c19d45700d451264225ecf22083fa3280ba97895009bb3fc8a0be04a08e36112a61339f0ceae700ea1813a11236f9c9a07e06a08e35112a61e39f0ceac7006a9e8950e3b884d547006a3e25d4762cb99439bfa8614ca9b909e01b17c5b33d3e8e19f7c18dd500e5f8285ed6ca523279047e38930adea300de044a787c0d78f732a8b32de522eb08179cccec79736531f4bfed00c2899408bb32777f279ff4badaa948dc593aa2a72032af5c09baeb0acc798388b0938eace7b30878e7de26ce2d265d0e80acf9330e78e82413b192aefd4186f5dfc05b279bb40410e9e443b237889b022f9d62124ed2d97264383300cea926e1249dcb49867329c039cd249ca4f3e0c9709e08704e370927e95b1a64382f023867988493f4b502329c37039c334d9ab84dbab81fd9c4eddb40436996493849979e24c37925c05968124ed2657bc970ee0770ce360927e93ab36438cf0538e7988493741564329cc7039c73b7e5bc3a77468fe314c556a056dfc7149439b144790440b9af2928b36389f20080723f4a94f203a3f60a74723bc5ba60952051cee2bcfedc8da09c9c17c5c01abff112e18f527b8513247efdee09006fff283a88fd2f724a38d84bb6c86916c07a40142f1778abbbe35746be0b401e680ac8384e3f7813809c6f0ac838be5bf92900b9c01490717cb7f2430072a12920e3f86ee53700e4225340c6f1ddca2f01c8c5a6808ce3bb95ff04208b4c0119c747c4ef00c862534012ce2f2203f91300b9c41490842ffe9181fc01802c31e76d5fc20610d9b3f77f01caa551f497bbfb7f6c63c631fb730e726152f27e20b2d998c300ce524a9cbcc7bf525c2a3bd07857c562b6ccba2c7edd67ed01b683a27843228b35a437244e05f89651e26b61ed5459022bac40332c0ac5e23f19b0de54c03a00606551f57a9788326dbe656e159b6305e01714c5bad7fb1080713925c6ceaeca6382c095273e0d52e9541ab3c5a511c0dc4405f3080073853913f9093b6cc91a358300ca724a941d815f1e2ccac22a972f4650a990f9e383006205f5d38aac5492cd983ce715285e6ac2d79fe2573b7701200f8ea294f4f6b49215cbcfcdcd06e3d59526c18ce30b4f7301cc2a936012769391c12c0030ab4d8249d8794b06732680b9d2249871fc32da780073954930e3b83cde040073b54930e3d8fb3806c05c63124cc249016430f301ccb526c18ce3c2f48301cc434c8219c7e7f1a100e6a126be014e3a7797ec0df05280f53013b19236e4c9b06e0fb01e4e8935d8d7fb085ba2a3a9d01603b44798f4a228695b94acffbd17c079a44938b363897334c0b9ce249c39b1c45905701e6512cedc58e23c0de03cda249c836289f33280f31893700e8e25ce3b01ce63a398c1c1e7aead12a3e87cd82dee333836b224bee34c79a391b41b840ce5ef00e5f1a6a0cc8925ca3520539f600acaec58a2cc0228d79b8232379628af06284fa444d981256777b8d7638da8ba194d85700f50469e64e61bb784a396646fdcae02584f36259393cef320cbe41d41263fc5149439b14479364079aa2928b36389f22080f2b428dee0e1a8ece5beb9a905aca1cc581f0f4acad3a30099d54041e603901ba298c98e656e1953d29509e65261bc0664ec33a26a532697bf992a7c3192579fe8fa2781279e1945961ed640b3f47400f22c735e0488e39ccc8500e5469356031c44594a92ad06780dc079b64938736389f34280f31c93700e8e25ce7b00ce734dc2493a038e0ce76880f33c9370e6c412e7c900e7f926e1cc8e25ce2500e705d42fdaf38957554e1b934fceca772662c5af91de0a60bb9012db8eacf68bcfee3776dd0d76e2a71eb2c6fa3a00f422533ad7482b1c32943f0394179b8292b4b22143b91c74675c620a4ad28a860ce58e00e5a5a6a0247dde2143793140b9891265570dca39168f3c4b289f4d6263ad80555640fb987c5d9f10e9262aa41700a49799b312561c5f39cd04282fa79fc1c6a7fcf1d55faa98bdf2019feebfd00acc271814c5b0657917a8bdafa0c4d79ec11ef499d621aecb1787a88a75fff97a00f0caa8d6244af69fcbd311f59e9365e38100e35551bcbd53cd965aa7b9efe9dfdd99e05c0027ba905636055468b301daaba35aa52df239be7453a401be6b28f175739590b0a494ab05369c05176703a89b29a1b60550b90f9638d54d041e49f6a6630680772dbd478eaba96cf2aca02b1ddf5b26308e75967db225c75bdb62d1408adf534e5b00f53a13dfca259d404de6ab7340f3fc7a13b192be2d4186753b80f5064aacbce779152b155dbee56cba158863e393a9c9a075a782d60e64f11b4d1acb194439ab926c2ce77680f3269370e6c612e75500e7cd26e1249d894e86731ec0798b49384967a393e13c1fe0bcd5249ca433d2c9709e0070de1645af917b467a43e9359a0930de1ec56364b6d2c68cf384d5c700bc3bcc5d308770e5acd15468f700cdf33b4d5aa580748a0159175c6380f32e9370928e8d93e1dc0de0bcdb249ca4b336c870ee0f70de63124ed2e90664384f0038ef350927e9e47f329ce7029cf799849374b63a19ceeb00cefbcdeccf247c1e22ebcfec02b03e60d2e325e92a59648f9737b324ce074dc249ba861b19ce4d00e7169370922e3a4686f37180f3219370922e274a86b310e07cd8249ca4eb5f92e13c1be07cc4249ca4abb392e13c1ae07c348af7cb1733fd6bd1ee8c1ebfeeba3e00e463a6808ce37cf6ee00e4565340c67145b71c00f2715340127e4f850ce46e00e413a68024ac6cc840ce02209f340524e18aff64207301c8a74c0149f87a0a19c80a00f269534012ae094306b21c807c268a8e37ff6b5f12563d646b5fee0db03e4b89b533f3d73d4cd88b49d6399c00bd98cf990493f02ba764301b0198cf9b04338ec3162f806cfe824930099fc4c960be0a60be68124cc20a880ce66b00e64b26c1247c222783f93a80f9b24930099f81c860be0160be6212cc387e68e62d00f3559360123e0b91c1fc1ac07ccd2498844fe86430bf07305f37672d8e387eb1bc0768b2bf11c5746cfea6b9548d682efb5c2a78fb003f7c338a7147b8c6db188b46b57509376995c8cc8b1da4715d97e35080f3ad283adedceb7270831bc6bad60300c8b7a358fea9cc0ac4cb46fe0ac06aa783cd5d52c24e37c2a771b2d50fca4139f90ef58a1c55cc5ea9085bc6317e1eb93df0c877a358d024535433fc7595b2e82a1ab25a7a0bc0f71e25be36c0fb0a052ebe54441e938b48c4cff33a0274ef47fdca945cf6ae488cf0c8ed582b38ffca197f49bf5c6471d23291ece5fceb4199f84114f5f5d0065a5f57031ffd308ae7196cc4d1fd3c43d89d4656528e01283fa244d983a98b9279cfec8460e9323b00fbb1a960097bd3c9c05e06c07e622a58c2311f32b0e701b09f9a0a368ef57e6f00f63353c112f6b893817d0280fddc54b084bd9c64606f0560bf30a78145386186ac81b518a0fc9212e576d68efb5bd0c9550dab62386dab2900f795496ff592be7e4ad659dc173c7c7e6d124ed2d58dc870ce0038bf310927e9da5b64388f0438ff61124ed285f6c8706e0438bf350927e93290643837039cdf51e2e43b3c30ef878f1fa616a0c6fea7890b4790ae6544b670c410e07dff32112be98a5b6458bf15deda2c4d111f5f4b3c4f9460bc0c5b2cecb79f5406b209a2715d2c902cb6f6278b47c36ab6c00232cffae72f2d0eb0fee98e27c44c90716c0dab1047b95e91d05e6e9de59655b1cc9dad20df73d74838ae919ee06f3b578a7bdb0beb2747a7aa44b413e273255c878f5d4d617c0ac4424b79a1d81632f9c5970cfe526e62b0f5cb7ee41d58f3b03bd059cb6eb9b3278fd7adc9e3995aed0718192585ca424ba1ba62643b15bf7e8960572c540bea8c69ddf1c353bb758a54c9e8cbd3a221c7ffdf3cdd9b3ae9de2863171edfac107caf6e8b7ee4776e4454b2f29a510e13cf109f0ce1ff8df7ebe9568872615ca53033885fb7b462e7d62b15f7cdd8d54c9f0e2fee3fc1b2ac5146bffafab47f8b7ea6f4695bcdee0f55b42778889d3e1dd438274355087f5858e30b760e5f6afd5de481440fd1d388ab8db1f64a445c4b85ea72267f785dc95b5fbc28fa8592a7cfa9240d39c7e0a545262f2d7e7565a84c9ea17efbdbd343f5f4df2979d663cadeff636fffa3b6b7ffe76f6f0fd5dbff4bc9b315f0f6949fd2fc7fece3ffabede37ffeede3a1faf85f943cdb32ddf3cd6c4bdd7e00fbfb5927e9ebac492d5fe76cfef6f5f07cbd1125cf4e4cdf4eb7c7de4bfef67bc4ef1bd7f6fb267ffb7d487ecfff75164d0de87cd3acf045428fffa4fd1f5b7cb10ac7bf0300 serializedProgramBytesString: - serializedSignature: ed08431140a5ae0951f96fba72ad12446c171f94edc9281ca17d4612499fa6d2d74084c7cbb52b3c614d49621a254ce7b4e61eaf5bd60bd25e9cf0858efa5200 + serializedSignature: e53c7a6d4a091cf11f0cd962d0d23a92e8b348fa92f36af81ea3ac20137a7b4ef3ad28617b1e1badf520dd4b9d2cc0350d296c9029b0445f32b31d5f2728d801 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset b/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset index 3c8d0a1..dd0c0b6 100644 --- a/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset +++ b/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5dcb5b1bc9116f0142086303e66dfc00bf90cd4302bf5fd8186c2f6baf710c789d7837181b61b31186057663c7bbd9bc1f9bc7f7e596434e39e7945bbe2fa77c39e690638e39e46fc82587a4aaa60795465d9246520b0d59e943ad99eeaeaefa5575554d4f6ba8892b788586e0e3917aa826d5889a574b6a4dbd826f9350aec2db3972cf3f501b50be80cf45a81b527d797ae26b20d40d9fd370b4a9b6a0e727ea39942b543fab92f07d1afa26e108cf2ec35f125a85eaa0d3bc9a5233eabeea0a75e421f1883a6dea7321942bd4009f37d51ba84d125338489caabae063166a36a96e159876db3d511f9258ab50f71cfa6ca814d07c46141bda238abe28a768d4659d2efbe0af1efe46d931d6bde36957abdb8de9e31af88b227dfd9dd3deabcb565df6ebb6f87d8f2ef7b1734dba6c66e7fa75d9a2cf85e1ef9f058cdde019fba8e6fb0c3b069948bd4033f4c0d3ef986e7f961d63b9df43ef5c26bd9a83fab89ed1c3efe73dfde34c4677cc21cf9871761ecb015d7f811df3311b3cfdda74fb8b9ef3edec18eb2f690c7ec9fa61799cf118d163adebe313baef657ddcc1cebb7db1fe8a470f2719cd16768ecb773553bedacff471a707c316ddfe9aa7beddc383b7be4ba56dcf54dfadd276c8eb7b3ced62ba7edc837fd4537fd1c1b7f66ffafc01c69fcb873b1e96a774bfeb02dd532a53afaebe4eb3366e69d2b51f9b1b56993637ece8a4eeef1e3a6ebf41ddfe06e3c93d8f6542d74fb0632c7b597b5e9fc766d12d89f3caedeb1e0bb2847f5725b2fc4bd0773e3ebce378751f2d50f751769ee3753313affac71ecca3ac6f5897232a339e8ce8bebff5b473792f249e1cd6a5ebef78ec38a4d273c83d7744a5fd44ced8110e859c589784d4605dc569609c6585a6166ecffc490592aec70f7c0dd0b05b10bed7818021b2cf53deb005516bcc18d97b424d8cef49fa5c84162b4474327b883f650d81cca5e09d6469c9269cbf43590d26262b5033a2ee4189bd9e824a9fc03b93ca23183605a94d52cdc1e73ad17b0a6c67b7cc2712a630de3e0f81a69361adc21917d075384e1187b3f4f929719a24eea7e1dc16e57baf20e3bb09e56b1a2d5bf60df86e1a734e4366e6d19c6849e79d74ce55d3144883dcc73197fa4a233ba2114a6327f534ac8b5376fb659626bec2d07132e838a7358d51822c94716e4cc5c99f3fcc42d0bf8cd9129aeddbc1fb3c04af5cb298914175f79204690dfff12f337ffecdeffffd9f70a66867549c52f9837944cb052cd28b853ab328e416211cae4b20a35ef84326f8313d0fcd56107ea7dd0ab5f3af807a8a4c990a0861389f832fafe12f058da7a07c06552fc0d3e1757b966612482642e06687ce7c0c4af0d698e06da834bcf9fd492e781bb6e54ac38b2f33825101c17c3c4808d61a104c44741e97a575e22beae10b5b0bd4eb4cfaa18c6fc1aa7ee6e19c9356dda2da158ac50e4a23da6eb708a75c2d73eb0d1745863d009975d6443ac34589f2f025e9326cd225a2bdd7c4aa578d4db21aeb4d6a6cdc992052dc244377d5e541a0579c64cd396380df291631a1474b6a7315440febd688ca22b4f58f205e970d7add9419be5682af3b4bb8fc2c4810369820a415c8f91d0aa3d2f26d6e10f717ec33da08c39e9c9152e24142316af20f388ddb0db3c3e8ea9b651fd168228e7aeb30c4b7ffc22b8b785426be478a529d8578b61c01aa4922dc5522e1bd121cdd0638fe6ac23a071cfb24ae7b4ae4ba59227ca044c22d12e1de1209b79a3c03815fc90c700666dd47ca5903f0ef150e16ec150e2973f6976f7cc923ec973cc2e13278843649e7b8d457726ad92eb1de67603de493f50e89f57e13ebe89d9ea8b72a01d85f5297d56d20fe3968bccf97409d264ba6995ec918c72da9b81877745b8e344471722cd9d1ac90d1e8e61edd3a80d708bc2261f3e438aecc21b39041a409d22559d9098395d5f8b4b26e89f84903f15a9fc47b24131e3099304e9aab84488a50b906b0a3417faec6a11c85120d7c4c9bf55b32f0ab2ace7a8cfb32f603127731137718a51d6e9e686e1c2e901f3fa3f64aa39e328deadccdf043ffa044ffb4c9c3fb207c48223c5822e1c326c298a60c29c3aa44c45f9a7244e27ad804374ee1dbf04ee8b71f31fa4c23a15bc63b59d9572d5ecaad32e57e49867889c81f95584e94caf231c9ad8c1adc8af2e9568e4b788c9588c70903e138a58d955d29752ead908effd087fb558e980036c62bbc936b5e0ccdcd8314ab4e4aaa3957a26a0624533d5faaa9c624962f94c8f22989f0c512099f96085f2a91f0a044f872898487247770a50cee6058328daba59ac68844f95aa994e31220e365002421a9f17a896a1c9508df5086607a59b9fb2166d594ba0b3e6f11bc4852cd93d74cd1d2f28af68d0bf09e866f4ef715b54467b84fe219b4b72e7351cf8f44639244132689d0d79817c571497c4e394be78e34282972baa5cf7a79e68b68deba47200d62e04792339224374d924c2925a2ebf0bf06b16c0164fc183a2c6a6dbdc9a315fbfa3a2b49396992f28447ca09401c37f3bed132bed03abaa792a4872df5328bd7f47abb1f3ecf497c4e99f89cf0f0991ed38f2ed2bde4f3e5d2c37949be5b26f92e7ae4e3b6efd509da0be619b9a49367529a9a1f692e48d2dc2e5e5bf7c8b36d82577849e8eea4b62e4af2dd31c977cd87b666f50c2a4cb672fbbc4b925cef98e4ba5e90de268087251d9bd6caa2b7e23cc86549b669936c313132cd6d5fa1708fe75eb764cfa574deef87db2b12b7ef9ab81dcf61610e9fb7c907ac42977c91b3d098c37bf991ecaa24d95d9364b7f34ae658d934e926b73f97e5cc358f8af712d72449ef15e22538f6a579895c5a2cc64b8c4b72bd67926bb202b699c6a75c567a5d92f1be49c6c715997fa5e789c5a271434263c684c6988f787727af2597478209498207c5d96c61b1ad388f53ac8c372519bf6692f16e41d1fb0ead812d529b8deddc6b06bea7b3e7ca6462117887e8b6dc2da2b301fd1f90f7c2a34d15a7bbc60955f86f06908355982d38f21c8cfc6c7b752e3705dc1f25fd8260597957fe8add4c9e4f0a074decbf4cbf387037289ba4cb2f93bc713ea225726901d2748779b7498a2bd2dbb7246be274a37bb0486bcacf05ee12abaf35db90ffadb40e81fbf4b35a7dd76581ba2f4293adfcf4f36d35182602ee0eeb32fc68c6591142e7b9a19ccb3a7c45c23589364abc2d82d34ce02ca8047dbe4f5d91d42d8a4cd82d0870fda13e0dd7239b70350a700501a40f984dbd5f0990460308d23f08a448d843dc7be155ae5f45e543560e44cd14fa5f037b6be4d59220842730d1fea16ae3fc310f2cb12ce71c13a7584cb4ab58015e2c9d2f99f39c04e64b5fff3f4f651298ca7c03411875233f798b2736bd45a7d69d93b9bea20c5abe3618f58e5fca0fa1a219fe24528870c5f89493ccf17eb0b350a697df70b25883f2ac2d284f30283fb409653bf335cff5de8b359ad6c832d6ac93c7c2e6c1b3c87d0cc66fda84314cd4d019a7b223760080aa65402d5462ea3ed761c4bb8e95e9052d4e5d6b50b631289fda84723f9bbaab7af045ba3511f469dbcc205cb409619786f085184ae633d6af2c46e5a82d300f33309f5513981627b73530f732309f5762722776dde46e62102ed984b09106707fcb8e8ce2d16b7b9035db822cca204bda84ec80b6ba14344a6d5fafaed23d81dd15a58f3348976d42ea2fe1391740288f30285fd88472af8612075e26fb7469e3bd6c6bc0856d01a718702f77d206831f971b19942b36a1440952cad91384cb4f0e0ec10b29f50cb08f2a617b852d7b9d09a0ff3bc5a0fc56f58492b10042d9c3a04cd984323337bca727f4a63dc8da6c41d6c0205bdd49ebcbdc816431881cb205652b83f255f5f8c420a6d7fd0cca359b50f61ba04426b600910d387e573ff471b7253c350ce0759b00b7a8f44244fa27e2415f846861f07d5c3d31fb6c00a1ec65506ed884d2bd5535b62b6f551d64306eda84b14365aef1ace4d8af69d1335abbb2893320b7aa278a07716527c1a0fcc42694bd1e9bc4b47c19de490a35bb2b353acd40fdd426a8ee66a1ece5b257ba49f0c00b31f0be6d13bc832adfcd2ce99728166df2b82d583b19acaf2b117c24502b74b3d55af0196240bea916208318c58f3120bf533d513c888b6a3106e5db4a4059d8b54e1077387630283fb3096554f1fd6473ca79f88535c09a6c0156c700fbdc2660eec5a1bb4cb1bb2e0ef73018bf6b134677dbc9d8aedb76728841f885eda99bbeb510dca91b66807daf12beceb13777c38935c05a6d011661807ddf26606eee27c5d9a027d1ed0cc81f540b90414ca2f733207f582d405abcc56f0dc86e06e48faa05488bd722d680ec6240fed82690ee6664e9b22ef3d90356a7b7b580d3c7c0fc4935816931e85803f32803f3a7d504a6c5696e0dcc0106e6cfaa094c8bc1c71a98c30ccc9f57139816ef565b03738481f9a54d30fdad2b06f1c6ff2083f2179580b2b075c5206e213da076cdd3181278f586ffd1be3eaccd21e6f9756c4c58dd8c094b273161d3754c5839701e81d0aab17b0512bca79254bb448fb45a648f4388d3bf87c1c7b0fa79e04f6e9a885c6e6abf427842e6d9922a9bcecbf1fc0593a4f9e593eda7298756e2f46f7376b3fcbf56ce3f5da7179a69173da9631e34bfa49fb636038d9788297c85ff072baa6f766f850000 serializedProgramBytesString: - serializedSignature: fe5b93c9aa101676ddc33e4dd1e9b24715d834de57afc429598242a8c9744ff21635492e19948feb8dada9793e2cf124d7312a631f9acfa8df361dca220b7d0e + serializedSignature: 8b3087c4dbdea76c6671d9cd61174b528327e9f6acc8b233432142e084f4d01ddf1e8ce9343596ea20ce82bfc95bcdce72f678dc518bfd7d382dc1c721f35a02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset b/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset index efef429..14e8050 100644 --- a/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset +++ b/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d0778144796806b0049e41c0d36c289b10d9210c118078244b2c1601038602c8434123292902521c011679c13ce39e78c73ce39acedddf5ee7af7f6ee76eff6eef6f6f6eef672d8ab575dad79d3536fa65b3d6f54ed5bf8a452a7d7effdf52a87ee552ae4bfd814f96bad58252a44895823eac416d122ffaa9061b3fcef1cb9e7578a361936c8df35f2da14519ce549f837393656fe5e2a8fda45877c72aba89561a3babe5a24e4df4be5b309790467ebe54f42de15eb231f5a232ac50a71ac18131b9545c45af550bb3e1703bb627de5ef056287bc9a504ac14b4ad5a531f2d76a79a55d5d6b964abbf7ad13eb9559cdf25aad7ca64d3449991b95c4bedf482d62ca26150cd6e1001d0e923ffdf4dfbdf4df7df5dfd43957c610242b930cf7fe813a1c1ae29dc3902c3fef74ef191ee29dfd753822848c913aec8d648c423abae746cb9f02f9e76ff5f118e7b860833e1eeb1cf71beae39dbd75789afc29943f2fa363e9a9bd2638b27aefd4e7c779986dd5cfbde2397e551fefa5c3bd75d8a9afbf868e21dca6cfbf8e8e21dcaecfbf818e219ca07590ba8df8569f1b6fe0e7dad7e6b1afcdb1af77ab3edec773ff0e7dff9be818c2d3f5f9b7f471313a0fe1191e1e67e87022d2b7ccc3749287599f2c3a3fe53cdfe7537d7edf8071922d2ef6437ac0f5b73d7a7578f4ea70aef571e5efefb9df2fcb03bacfb28bc5811e5b0b75d8aeff7e071d4338d963d3bba9361554eae37840c699d29ccbff201d9ea59f7d0f1d4378267adf993a3c1b9d3b5887e7a07367a37310eed4b2df47c7d2aea20f3d72fb231987e8708a48e6e19ab758a6cf15e9f04291ea0b173af20bab9cfb8bf6e8f3533dfc2ef2f0738f5d7e253a2cd5e1c5fafa07e818c25d9ef7efd2f6edf1c8b944a4e62397e8b00cd903d73f14a9f65dea917fa9967fb53e9ee6d1e73291ead3e5e83c84977becbe5c903edd65c3741dce20eea5fccdf5b3993a3c4fa4fad9793a3c17c5cbb93a3c5fa4fbd905e8dcf9e81cf683f7d1b1e4d4f72e8f5cec67b37478a8a0fdcc64d76c11cc970ed3e19c80eff196ed5718985c89ce5d81ce417895d6e323742c99f43b33c33bdd771dae9ffd9838ff093a0fc79f6690e9da71a40eaf463a1fa539f4d5c78374788d96fb193a8670ae0eaf15a9f9e5b58e6dfd3bf4f13c1d16e8b02f7a373cf7b973adbf5b87994fe8719d478feb74b84087bb3d7aecd67ab8722b3c7ab8ef7f051d4378046212b4dee696110b75384c24fdeb4d7dcead575c2f52f393eb1d7d07b8f98eabc30de86ff7d945e81e90f185e7fa627dfe4b1f3a2fd1e1521f3adfe8d1f94647e781ae1fbb7ade64d0f9e82c3a1f13406737ad2ef7a1f3cd1e9d6f76741ee4e697ae9eb718743e368bce2b02e87c9c0e57f9d0f9568fceb73a3a0f1eebd1f936f4f74a1dde6eb06375163baa900cd3f53501ec5cabc3e37dd87987c7ce3bb49d6e1ee6da71a7c1a613b2d87462009d4fd2e13a1f3adfe5d1f92e47e7213b3d3adf6dd0f9e42c3aaf0fa0f3293aacf6a1f33d1e9def71741eead6235c3def35e8bc218bce35017476cbaefb3cfadca7f5d985ee83eb3f0820f37e8fccfbb5ccef3c32bf0a20f3018fcc071c99c3ca3c32fd94b9b53aacd3e1461d26b48caf03e8f5a047af07b55e5f7aeeabd7f77d1340f6431ed90f39b2874ff1dcd7a0effb6100d90f8bf47ad323e8dcc3e81c848f8ad4bae4a35a97173d723789d43a921f5d1ef3d8f998237bc448cf7d8d22b59ee5a70fe5718fecc7b56cb76e3251874f88f4f4b65987a70a737a6b42324cd79b45f6f43841872d3a7c4a3ff323740ce19348bf2d3a7c1a9d7b5287cf88d436b5db967e16ddfb2cba17c23dfa991fa363c968d44d1ed9ee73cfe9fbbf45c710bafd36cfebeb3f41c7d8cf5ed0d77f8a8ee17dfb7bee7f51dff73374ecda8de57ce791e3eae1eaf512b2fd251d8e47e74cf1e2da3a171dc3bb7e2e54be3ed2adf71cec535ecab98298ea715e22739c1a49ad54dd043d0f7ebbc6dd27b3778a83e842f805ff26abd776881df2d184a9677a8deaf7ee90addb7263cff4b8d840a47785fa5d23ef6854427f91fe8a97d25e01ca35c9ff09d4adde2ecf2f56bdf2d0b1de28af94c88a65a37a6a836cceaf93ff53a5ac95af6d125be55195fcddaae46d906aa7df99cd24e882f73eb34aca7446089ae5191768ab3c6e521aae56bf3b95a609a5fd5279ae438d57b4c8ec78810cb7abb7a5dbde26ff36bdb34a2333eb681e28a0ce3bc3116e34554a6b40fb52952ffd29467a2246007de12f7432ec53aa7a612f4d8b893f31743219a8382fd532a62964b19473e5a254f51dac4a2318dcc6740bcdfeedf09e256664b4c54c06a27bbcb22019c3af2d6e5cffc7d965bf2e48356dba2855dde313b29896092cc88bc746a749c86c4241419f3250d48b3f66c2afba6257e711bf735fa3ba2f780414aa9229350262d04cab927f6c973f4d2af535aa61db2d52c816794b9b52322d7eca405891429c5e8066539382dccb04b96fbe2167cf553241eedb65571232fc3313ec4710cca60345b0b789a0aa919dcc4a30bdfae5feb5403ebb4992e854652af893a9ba969929347da67a989a790e503c8b8d95c8601a5184fb9808abb659132be135f29c53c15ca8ae36aa5a498958ae9edc24df05f5943a2531a16da29e71b92e575334b62a6d32c7c040df313048c5007448706b4cc55081298606f44c49d9bd3c049aef633cb4bfec45e5214332167441739042133d35f765738ff8b72b738b3a86b7b9138672e7dd43bb6c4ef22e55e33ca519fc38379a41f95ba8abc4a2a8c01cc5c35514f32b43394591c92906f75ca6375fbea34e65dfb89292c9dae413fedd6284ef4c6f64d64c2f571a5331d4d714436a8a5b551e333db8b64549a991f706cff8604ed921deca9319f968857c6c9a71d955a010f633202c8372638c213b5655ba7e1ec5803721bcbf297e54bed399978ad96a51298e912ae20abe29d76857086b6498407f3952924fae949ad4489ddd62dbb9eebe23731c8ff59daac6a9289e832a73f9b482729301a6981cd633d58b69b21d1b3c95c1ccc71169fe6c8e83f1192b17d4fb297603a924362107496c90493844ccde667bbda2c7d3a2079b444396bb8f486fedfd51fe4b13de8f163e84d27b6268bd879a4403efe21cf01e46099f9403e1c329e1fbe640f808937060b59f296ff20a1e470b1e69120c51bfbf1fc10368c1a3281c07e400c768cabb0f3478f7533183f00cde3d86123ed920fccd80c2c752c2e306e15f06143ece241c6ac2304695d68fe614536ed1522c33c46435af589c21cac4593284ecb7418f2038edde3a79769baa006e524f74c8e31af9d3a94437aaeb9d486eb3aad7d44829f07c49ba4545b4457b51b80e36e07ab157305ce329df3f24a4ef4f30082e55f9030c85dbd022cd6d6b748a8997b17086a9cbf118fce6d3952acaf736c58aca58cf658d15bf83c38bd57aa9845821ab23a70a67542f9d863b3a087d51f53a45b67435cd32bf2b732c9608439f822a1f160aff43dcfc5640a7422fe54d65ca9b4a327893499be0fe64f6e569eaed76b1a17c7f1f2a1f2d37e4a39b7a07cb472752c5ce743ff96886dcbf98123cc3549e413d6b912a915ab29441c58a55b19a04d1a6a9cfe92af382683889d270a649431813aa501a36290d5be4df507ad62bffabf36894b9142d56be90bcdeaa9b861bd5c48ecdfa692897a19c86f2db5bc26f53b95913d2639bf2fecd01cbe87d2906b34c0c0ef255eb68561ab7eb11b9627915524487ba3391d60f1f4cdffd4ce580aaae1ec75a0e041f6137e7d3b0c4a39f072bb424cdb9d46c954b8d4ab32ce34034416e7f2a1739cc908bece9132c17398072a33926379ae049ecb5cac99d64d5e6710f27b9772f811f486975b849abe5591378263d6d4ad4934d764395171677846dbec529a8479aa036faca3136a92e33c76c688fb85dd1c56a25fa16352fa75d23ae926776c810ced5c97b3b503e03aed2a2cbe6848eb2f4ce3ab704816848e8dcb9519de934449feb84c9523f58641c44f13acac46b3aaa9104e97e9c2fef71d6ee97e8e79367cc5d90416c38d894ebaa767c3e674a78eb81c172deb9a6fa8c31d79d27ccb324b2bd9fca790fa172def9869c77ffc26039ef149370e82b838561deeebc58a0eebca994e756983cb7da574a77b2bd1a95da921e9a9af2f093c079a3eea7a07389d47741e77b47572a6fd469be4d799be37b89aeecbc46e7184d01537589890db4472b457a43ac0c1a62d0d6705a3e8b44b67634e471a059bb2c7cc0bf9abbd3eef15a338db6a6948ae9c5a69806335779689a071c83102d33e900551f58a1e7ad328d34155ab369e1d3a824b8d490047715054b82e514bda34df4a68ad4ca4fbbfcab5dd5e692a556baafd2dedefdead1740aca3106287b0242994141596682b25e98eb5ee0e2f5ba08f60fc5a928ac56054fc2735f7aadac5e45059e86ed54097618ea61c53ac36fd3d1d524ef0a9671cca4b82ca79ca53bd501e799648611be0a308b7296630dce7279df60ce72285588ad301462bd021562b329de2b4dbcd7fa2ac4bc055187fc5fa38a13c72ffdd12f569e54ecb3ba66aaca06f3bcc3a8183cce10837f08188373a8185c6588c160a38a879b44430305ea9ee9d337bc9247d3928fa07c0326b184e9fb3a9212bcc6e4747d542a72a235c85b8ea22274ad2142ffbb5fb0089d6b120e6d4858d8ec6d43c64c519aa10d398fe27382890fc46032794ce92a0a8ed40912ce40b3198ea7052c03e7530c4f3430bca07f30860b2886271918f60ac8b08262b8cec470b0c0b5cd748641985552cc4e3630ab1a108cd9428ad97a03331190d9228ad9292666d02f572dff97c91fc892e16fa78f17460282105b4cbdb7daf4de61e8bdd5b2086c414502d4bb6be4df3b02bd7f0915631b0c31d67760b0185b4ac5584d0e728aa329721b33c5d8b4d031760cf5dedaa031b65a550edae4ef20ef5f46c5589d21c65e0d1863cba9184be4205f3a9622579f29c6ca43c7d80aeabd0da6f70ec910630b55cb2cc8bb571ade5daaa6a2f0ce19486f1a50cd81648301dbd9a6e4069f54091b0eec6dc88b557e6cec53030e71a239932b9da9feb7e3a8b474aa212db50e0a969656516969b3212df50e989656533edd94292d4d0f9d96aaa8f7369bde3b0aa5a54e434c755f8f35941e2d4173e1a43641debf96f29c2d06cf39617030cf399ef29c5683e7f409e8392750e44ecbe43933437bce89d47bdb4cef1d9a21c696099859df1ae8ed2751f1d56e88af814382c5d73a2abe3a0cf1551030be4ea6b86dcd145fb342c7d77aeabd9d4153d84ad5cd061d7441de7f0a1563db0c31f666c018aba6626cbb21c60a03c6d8068adc8e4c317668e818aba1de7b7ad014e6762f0579fb460ae91906a42220d25a9370186d38b3eb826750057688edaf26730619eea8a3109e6d42d85f214cadd007cd9812863796aae9c45092f5dcf445a8eac24625edeaef4e5dfdaa52ef4e2ea80f333111f6df0d5655dc29a0aa582eb24fcdcb85f654a5b1de14636a8ef649798931a7529b5c55e4f629c360b3b7eaebde953926ce157e07c0cf5331b08ff056d6836943916d30915573c5f3bbb785e3212027f86402d8f577a229b733f2bc40501b5764d68122b8c9947f41be7aa108d923de4849be28ace453a9bcfd622a6fdfd5adbc7d3395b75f62cadbdd0a0d743fe0b19eee17cf4dd4fb2f35bd7fb87eff0cf9d3ac3cb85d38d344bbaf4133a5c165260dc6085c41a8940cb609f72b1c09f5ee4a19c2148c0655256f08a44b8b4917682fc276dfde417d15d70106f5b79884c321ec3fedddfae7f0869ffc6ec9eec7ff90f68202fa05ad14c92b4d24dd2a1e70ab9727ab85bb235b63c0eea4d3a8547855d854d84649be3aace47693648851d8303b6cc5b08352fbdab06a6fa5a218f6d70e3304d869105caa162df5cc32a2f0538a329788bbfdf05a44f3da668a08e0757d48c1db29c1378414bcc314c36af5d8a93d12c3b9582e93398e6ff443ac8c26763a95d86e0a99d8cea004df1c52f09926c1d0a6bec58fe00c4b77cf320986dac0ad7e044fa5059f6df24ab57aaebe47bc92cf1b6f339132d6bf614ff8780c2631736849d5d2cf314531c4c41d7ea2f8763a8a7752a5e19d614bc3732977bf2ba4bb9f47b9fbdd21ddfd7c0af23d21215f4009be37a4e00ba9d8bb2f6cec5d44e582f787cc052f36098622f4013f823314a1bb28160f86657109a5f2432155be9452f9e1b02a5f4645df2321a3ef724af0a321055f41a591c742a6912b29c18f87147c15157b4f848dbdab29c84f86847c8d493034ac6097fab00dab6b291e4f87e5711da5f63339507b37a5f6b361d5be9e92bc27ace41b2820cfe500c88d94dacf8755fb264aed1772a0f6cd94da2f8655fb164aed9772a0f6ad94da2f8755fb364aed5772a0f6ed26e1d0ff07df8723c768bc2f68a45f7007c5e5b5b05ceea4b8bc9e032e77516abf1156edbb29b5dfcc81daf7506abf1556ed7b29b5dfce81daf7516abf1356edfb29c9ef8695fc0025f9bdb0921fa424bf1f56f24394e40fc24a7ed824196a67f0edbe30b5b34728c11f8514fc28c5e2e3b02c1ea3247f1256f2e394e44fc34a7ec224196aa09ff9c19ca1aafaa449306cc2f8b91fc1c369c14f5182bf0829f86993603884cf47798790dc7f4186909e31bd00b252f8b65bd8acf4594af8573910be87f2bfafc3fadf7326c9308deb1b3fb19961ebb6e74d8241911ffa113c8f16fc02c5e2476159bc4839e08f73e4802f995e0029e25b3f4c32f4bcbd6c120c99037c812c6d7014d659993b5557a4ecac0103a830b9aa5a4a6d568b751bf5a7aee04a76097017ee2e4edd9f394866f60a65df4f4df6c15a3cfc5efc4d12c7aa457ad8adc6a025be3bf54a26dbf053412c7b95b2ec6726cb669231979c18e058e84c0f489df7edd796b5f289a0c3e4af51767c67b2e370d20ed3c09963114cc4e85003f9dec153da1bd3075a83d8f43a65d3cf4d361d4ada94ae45aa4578af322e5bdea06cf985c99639a42de9eb437a2a76dea42cfa3393454774dba2068347d23699fc3788556f5156fdd264153d8c46a79f16ad61ae72b0b7298dffdca431fda1042a1e162bbdd3afc236e4155d9b8039e907eeaf0aa4fd3b94f67f61d2fe004fc9325fe5af356ae309cc7899d2a641c0ae565ecec96fb304d1f35d4acfbfa44a78f33b71a9be509c266faf51e53ac406ad297d3e5725fc7b947dbf32d9b7a41be507e54799cb7f2a9da7cb0962edfb94b5bf3659bba61bf535b89a1ebb7eea6cf9acd77d4071f82b1387b9814bd845c2d92eb07b711cae7cfa90b2edaf4db61d98b37c31781ef811a5e96f4c9aae0eec8da67cc6364ffc9862f0372606ab843b1ddf5def9a5c92625a41eb4ec3f7f33912875c7b5749b24553cc64692e6af09f5004fed644e0f8bc1158a86a2c1b95adb0b3598792eeec3559abf73edb2160d3a8dc79c3a7148bbfa3f2255e16ee32a75cc4f367946dbf35d936cd5393a85096742adddc545e25cfd17582e4e762725313fa9cd2ffef4dfa1f23f2d117c0dd4bf00565f3ef4c3627bafcd15d6685175939d421feea458d9e4cb8b4ebcee4d2ad55ca069830df99e289902a9ddd7f1af48288b5aafddad8954a73d3a3d21ddffe92e2f40f54bd8a9313d43c2ac4566511c84d3e93ad3e1296c30f280ebfef99fccb3d930bdbbea26cfb47936df3f2609bbbd63a17d67d4d59f74f26eb2eef310f86fe4697449dcc43db74bbab3d40eac765066d457261a97959692ea87f4351ff6713f52a769f825a1fec2cb546deb94c9d312deac40b3f7341e18714853f9828accc43ad27d115d7a65225b9603317d6ff88b2fe5f4cd6d3ada0a0edb576950e567afa80b135ee170682f446247ba68230f831c5e05f4d0cfcf5322d13ce52ca2abdc3734ff6327d4bd9f76f26fbca3df6e1da8ab7e7cf89dd4cb6d1359f2016fc84b2e0df4d169cc4583e381687a909e686c84f2922ff6122b228439cfae9410bdf06e8bef7fe8cb2f43ffd786fe696db2cb5ecd9bf15c9a78258f01d65c17ff9cf5fe09dc17bb11dfba8f3b98aa19f53f6fd3755efce9e7fce97e9b14ed9e66c891d3effccd6ee2e92ff633198dbb150dd09dff858a94a54a7bc2a551fc12aebca5bb27faf0bdede2cbd09a85675e50ed93704f91ff98e42d8f450287e80dc5dc76d584257a1e437698f7537102f5139558bf27be8312a912592f31546bf1bb398f2c912945362ebfc6fd1e2dd6022162bd216b9b22469f545b0ef9ba5ff0bb13a4ac76aafd262b0f1906e7a53762dfe086feb6df621d33620c912caa4fb64bd43b4d3da515b57ba837ee6aa6cd63766fb92c95425c0ad036615b706256f93b871cacd9c4ca54d57cda6c484282ae855063101bbc2b2e172b665805831edc91a0554df0d48a28a71a21a61f42cfc410fdf765a800dfeb9d87a717b587214be46094ad664a380aa03a1ea9defc4989c30160554958392a8fa70a24add6b31755fcc643f4d1490ed1a964456c0896ca44286075740107c9ca8430b723e25056a4501dc97fd92e00af39d2c933bcd4701551c9591459ca80a5166bf54544602ce6f50f6de97130e2cc9a076858d02a85f0e4e82eac7096a800194537f8f02a6dd439298fa7363aa8eac37dd36348969404f54159cc10c773a4f1490cd1b9e4436903ba7f2967851023505e5548338410d4ef12dc7a3e0634c201426404501d6a7c8ab06f75c42744715a380ec57a8ce3e8413997777ed2895834b50063f347f89307d2bf228c0aa441e358cbf31e3c282664c83ee928e4adf682bea1b1d9ecfc417257ffa3d4a7c23f82ba1de3e2b98a614054c570f044c45051ee1de31e9ee8fef04634b8f44c1b0c642b15dcd2869134ec78d67646a92bcc53acd47c6d0c8523c401f7a3c4bc7713cadaf21ee63ec279e25ff8b07ea258b67e91a325f4f0eafc433a41ef3b3c9dee078c64a7a3c6367433c430b3b4ed639e2191a9ce94fb999653c6bf11cf7d9994bdf975a81cc765f9251b6da7b72d8dd3c5c5e06c3eea362ffbf47c4cb60447c3440785943704a9d319ca5ce581d73ce04881635dd929e30029fbc9ceed561429a0ea91bfeba1991499b7e2925d3683f0676a774829dd4dc427cac4d38cb2389f33184735c3e70369040b1fad56a290e1bce7e5c388f4338f7e2c4e97e41b156e796deb97d78de58191fc8022e905b10c8f19c20476749e6581c78251bca222e94a7239413f80753699f4cce1067c4389b0b6319c2b877beba6eb60a77d944f2cb3e6ce8cee342578fd0edc3896e2f852ebd61542d362b880b543d70b31608ebee617d505ab33c77488770211d88904ee4ce1fa9f6968f1939b943d9c88572254259cc89d2fdb2267c66b45d35783b84f7b35dd1ab4136227c93f2515253c54b6a49cd58e9612ba9c72194fb72a2dc47a4577afcee2ec28a761117da4e84763f9b9a8daced1cb6447f0fc2b9bf4d38cb2389f30584f3807ce06c923735e962a8ed7b978f5e8d701ec889738e07e7d6ae3c34752d742e571db346c938ae28391745c964ce2871bf4eeab79fe9b008f632cd4230e336c19c1d4198d311cc836c8239338230f747300fb609e68c08c2dc07c13cc42698874610e63404738a4d30a338cc71088239d526988c1dcb6c30c720982536c164ac67b2c11c8d6096da04937170980de65e0866994d30cb2308732c82392d1f30a97e526f9709633267eb30391cc12ccf479f3d0cc675766d8a92a73efbf15cf886207cd3ed1812664cd26c43c22d08e30c4e8cc3911736eb97d7a8699d79f244b6aeba8908e1cc7cf47c9689e40710a80eb66aa55eda460c11e8661b8170ceb267308eb12b83cd330f44280fb56b665c14eb929508e76c4e9ce385dfb1cdd49de3183b356ee782fa08827a988d50193b37d8a03e8ca0ceb1112a636eca06f54a04f5701ba1327610b341bd02413dc246a88c05151bd40b10d4236d84cad85262837a3e827a948d50193b8ed9a09e83a0ceb5112a63cf121bd4b311d4799c50fdade070be48c3e89d6c7d4c872290f36d01c9e8916c20a720900b6c01c95808b1819c834056e4a373846acfa7768e30b691d83a479e40282b7b7230231525eb645a36981508e6429b60327689b0c15c84602eb209266303930de69108e6629b6046b143791e82b9c426988c65391bcc9908e6529b60327679b0c19c8d601e6d13cc282e3e2847308fb1096614d7aecf403097d9049371a63b1bccc508e6729b6032aec16083793482792c274c77732e7871bd6a4abab21b3957aeb3edec2110b8159ce026884c333e4cfbabe561e6075be7c6208475654fcefc88fe1ce2c108e5719c28fd2fc3ae10de4583ac68a772a13d0ba15d958f493554175cfa326cc6ea11db34d81b11ced536e12c8f24ce8710ce2abba67c4571fdda1284730d274e98ce5c2b0f5ae5635bd5eb5709e7b3e00975c4b82bcd202e787d10bcb59cf0f00cf7664961bb54b64ee4695e31dbfe48a310bee3ed19eb8962efd04508e509dcc938b9f56c12681efc700017bcf108de89f94ac620e4fbb1b9d42684efa49e6cd5a426e328f6984f4228d7d9d1aa316d2ec588966d73a9ed08edc93655c359bbd6d812fd0308e77a4e9c137d7bea62fd48dee6b79571c1dd81e09e6297af32b671d87cf50e84b3da269ce591c4f938c2b98113e77ebe937e7ad7db7cd1a60aae1dbc59c0702ec84f21c8353d59a9ca5b6e3a8f0be5c108e5467b9a99511c37df8a50d672a2f4bf269d1123db9af4fd10c63a7b5a4c519c4a78104299b0ab3b388afb1c1d8570d6db5455629de8ca5655ba0fe16ce0c439d990d09d0d4add0f25395524e733495075daaa4426b7df77be429587c2692717ec0482bda927cbf9bc65036c3df3cf22948d9c280f10a99bf33a0ac06810f8655da05ea9286e797e31027d2a2768fcc1126704294fddce6cbdf62311bacdf6cc949b1ec9e52dad0866934d30a3b822a309c16cb609661457643423982d36c18ce2f8521d82b9c52698511c73df8c60b6da04338a3d4b1b10ccd36c8219c515193508661b274c77357ae6965074bf70f92202d9ce09729201a433cb1de6cab588a3557bbd35638f5314a771f742803bece9098d62adf30084726b3e50e2351ba6cf39b2afd360ebfe188a5076dad5a91cc54fe19c82706eb3635653fa8031ebac26b6b51a2f21b4dbedf2d428eeff3e1fe1dcc18913a6a437cb83ed6a167cbb1aead8aa488047462fc72c40e04ee70477a048ed30de284f6e92173b153aa82c79073edc7081e14ec62a135bbfe77308f5199ca8a16ec6ba7c95cd1bfb214467da33e3238add6f9723946771a2c40b0bdc5ae5525119e97ae47004efec7cc09be6f1c63c8cefb0556d262078e770cf358262a155c0d7d19df238390259a10a8d16554f6ce2c338920b6311c2b8d39e167614b793284528cfb56b720c63659b6d72cccd08e77936e12c8f24ce4711cef3ed6a0a46f15b946b11ce0bf2d1870e159f7a5d5a2764c5078a1b67fe7ab457f96e44202fe404d9571e740a77ef98e56a924bf49a77bd11ae8bf251674cdfb3a845df12bd123a86e05ddcf3035fecdf3b654bb4d72090bb6c01c9d85bc306b21d81bcc416908cb32dd840de80405e6a0b48c67a221bc8eb10c8cb6c01c9d835c606f21604f2725b40328e5cb381bc0981bcc216908c6d16369077229057da0292713a341bc8db10c8ab6c01c9d865c606f25e04f26a5b4032ee0bcc06f26e04f21a7b86b4a23809fa0c84f25a4e947b0bbc57d622e12c54824d9f40609d54ab430bdca806ff41bd3c0c77b1813d0281bd2e1f603bc42679b99d9ce5f37d59255682c0eeced720ac6b7f9efa1f2fe082d780e05dcf09cfddcbda9d9ad2a1a03963d9ce48f6f7696af4d308eb0df68c2b4671ba7e3142792327ca70bbbe31a265cb39b721b437e533f1c330c45a7911a6f5253c1e1bfd2d759e47586fe6c40ac32c35d2fa3a0193f6168b363575af553ec4068d6d4ba74204ed169bc6bb593fd5c536de7d17c279ab4d38cb2389730fc2799b3de5791417d3c711cadb3951f697074df2f236b5fe0684b4c8db7744d0fbfa226477d83579258acbea0e4338efecc9dea2bca164eb787b06a1bc2b1f95f36c9d1adf9f6d6ef74668efe644ebeebb0ed3a33b51a53cda13ab86217cf770e20bb664be3c9265f60908e6bd36c18ce2a68c272298f7d904338aebbaab10ccfb6d8219c5e54c6b10cc076c8219c581b41508e68336c18ce26e42ab11cc876c8219c5dd848e41301fb609661487278e45301fb1096614bfef7c3282f9a84d30a3b8206f3d82f91827cc83457a3787b3cbc06a5129739be9860d45dad1878c937f2d146d6a108379f781462ee4b723e48f738ffc2457f3ac14ce6228d6ef448ee382d61f417bc2aede4dc63c94ad77f32484f3494e9cb345eaa0aeb34adc9bf49389db94092c503b6325ba42e7d9b546cf66cd12d8bcfb4c141d4fd9317d213d2258a72fb0ed81701e42fbb44d639cac7df96ca34cd7239ccfd88493b595c586f34184f359bb8a35c6be29b6626d19c2b98713a73b579e6a1a447dd1413502f99c2d20a3b8e8601d02f9bc2d20a3b89c7a2e02f9822d20a3381a3f19817cd11690515c4ebd10817cc91690515c4ebd00817cd91690515c4ebd1c817cc51690515c4ebd14817cd51690515c4e7d3c02f99a2d20a3b89c7a1502f93a27c83291da61070b07cc7bffd2f3ebd2fb8ea2fe2de92711fe37f231e6e4b7db83b14dc4d6e9712d82f9a64d30195bea6c307723986fd904338add71a721986fdb0493b1c5ce06b30dc17cc7269851dc9ab403c17cd726988c2d7736983b11ccf76c82c9d8566283792182f9be4d30a3b884701782f9814d3019db4c6c302f45303fb40926634b9e0de65508e6479c3083ed9e14c5e5089721941fe703a5bf098c519cf2bd2f42f90927caf4fd92fc7f2289b1f2ceb687f6a908eca7b6828de2b7a76a11d8cfec98ea65daa986313360dba9e61284f6737bf2d528ceb19f8a507e61d3342fd6e9b66c95a7fb11ce2f3971162b9cc9a9b1ab755e598b38548bcd0a394ca7ad957f3bc217c910be97c1f8b1baf15c780728bc45051ee18bd28457285f026faa15ee9722616fc0c522a17242205d2b8f97a9a2a8436c90feb64efe0f1627ebe57fd3f998da1c70a1d8ae8646da94bc3a25bb595e05cdda45d92479cb0fc0450ab58bc48d5fe5882b59b5320a5b85f385eb84faee568bbaab4dfdc4b37c23339e616fa878a06f7ac5c97d54205a62b1613a26e0dc7201bbf9d54819352aac923f1b559c94426d2e364bfe72aa00255d857f891e526ad647eef9ec32211e324bfb0a60c7cce9b129671e94cd22c7e9e1f97a952c134aead2ac9666b78ff6c6811962a5743f888befb3fd5f43bceb68576e3a4625873532e6ebb40baf90373bc909fe15fc1ff9c434b136ba0100 serializedProgramBytesString: - serializedSignature: cdef2b890874c87de950f6589acd6b30763482fb041c7cdbcb0208fb1dcb63179402fcf54ae76c4ee93118cb1f00503d8251a523f4774c202524213719780109 + serializedSignature: 8f94f88358ca46bbcb30be86f583430c58854353ca0adfb6e329eea018ad7398b2f23d0f1cd60d9a20f02ea24569c461b7522087cc26777ffca3bd2693384f0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset index 224d74f..29fe759 100644 --- a/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset +++ b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5aeb72d346143e722cdf736b1b0cbd52681b53124b493afddb42a021338530499c3f0c134cec80191b32b661c22bf48dfa1e7d9ccea4e71cadc87ab52bd98e65e3147b2c59bbdab3e7fbce6557c74e38802f6b050f07b00b9b50860ad4e00dbcc66f9b786ee1dbbbf2db1f431bcf2ff058c5be15b81e31925ecbd6553c6ee35507ba38f22d1ce1b9c1fd7b50c7efdb38b68e57d47a8c9f3ade6525715005eec10e3c82a2b51421e2800775449b45b8ac0c1eefc27becadb3523489c35d453cec614f87fb5aa8b47fdf1378cab05ad8778463dad04499cf5962e61f1acb98f89417e799f36648e1a720aeb3e29c54be5be243f7ce4a632de99317fd73e23a27ceb624cb3fa795efb26e29f19997c6cbed0bd4767676f6af6d31e30f90832a9c8093a01b6f0de01afec868a720d1a98400bdccd37691fe1314a0b14c85edde850d58d75ae69a5590f4dee46315ef68b0509a4c99e2efc014a45c13df75c9ad3ad8bec55e498ed5c09e32fc89671af50cd6d0519e28520e70da26ba661df6f178c2f29ea1dac13ba320910baa637651a617212d6cf1093dc1eb266bb8c7c777ac699db5dfc6b62ec7eb6b8cd8bb783ee5d982d8dbf85d37e7bea04cafa33e504ced5e38fa66ba8768487b8763e79345266111a23eb528c230e97066fa2b60894f1c7a49c6e605c893b1e6a5eb9eb6757038b7ee06181c1c6310a1debfa3f87e1ac20c99bbc808ce2d4c2fbb17d60638b44c585f47c00a2395e495ac2b0109e1eadb76d2252555ea2d0df5ae2d96332da2ac8288ae0cc21326e1e911089f3109cf68845b030a4fea3c927703af62f5c80ab6794bed7dee6d707e2ec34344d215999a30f91b2bd3fdbe5f3ee48dda5bd624dc8369cbb3aab016f05e3725364f25ab0c10abb62687b5759621935bcd09598646bec4b9682dadb144fa8cd63af9bead5360ebb8a1d6198dc6260ba57416e21df5cb8f2276466b99d9be2d33c7965919206e466591b42e55a6c5734c4079354de6cc693263cac10b2348f05993d68b17d43aa7134c503eeb4770c12c386fa2e3f311d051d0851543d98b35ac7a257bf735f8bec1b7495f003d3f2a4bf36f8afae71b99321ce2fb0d2a7e0877d0cb6b1c09def30bf5e84799db4d3dfa785de2780d3e424751608ac2599d779001afe8585937e609354bdcc16f54417a2ff87a0154c239c4a7b93a8fea62ae0fc1aebae092d905e74c088a3a04bff765d75deeab32366f2d1aa9650740376f4277d5846e38fb6c09fb84a1e94ff220e8164ce8aee9d06d85a0d3ef1e3c6c1d81ada568da3f26959703f49306cea3c79ac6b76551debdcffcb571e4631e41571d703825bbd07fe18de66e611453c5641f357ace2933ba0cf72598cb70c7811c326c45260a85e74534fe98cb76fe53be0e5d342673f5292d10f9b290695e9f2e1bd2afc8aa7e4539e1700abf3da437456b416581d48cde87065f873c018ff8b7051440c9fb0803b7ca0382811739df0eca7c25eca89b6f9505f8a58b1154a2c9c9bc65bfcde6ed302f14f28af03f46e675c36d7682f131cf19e914d5a356925753e38517d38f4df36f647f2f45facc79fad5a74d97babefd9f67469732e3774442c14f242e2592eb71463b4d454b6903bc5ff9c88204fa10a34d99eb22c5c86c4fcce7fa01324cdca739ee3ddabe8f9bb6966187131b6d85b868cb49b4dd988cb7ad4d216db644dbcdc9d0e64e61902625da7e8893b62c0769ef4ad49942c2b212613fc64d18f999fc8cf94b7c84d97111969108fb69dc84c598c96223cc92085b1e376131e6b0d8080389b0d2b809db9842c26624c26e8d9bb018b7b2b111969008fb791c84bdfb50d58b3524e7e2222c2511763b4ec26802755bb12d9e004ea7d0d3f270698a252e7917fd72faa18e5032ec024ba18f705ebd625130409b6d2a67d3c6bbc692aa52edc2e1df037e85c18a7de132a30b0bab20156014cb05ffe030c962890ee9450a278510ab38fcebc565c64f7fa74909b3b39b16b9ac5641cbd78493efe0cd9e2bd3cbfe0f57be09a7702e0000 serializedProgramBytesString: - serializedSignature: e45ea1996c07ddb0597ffb682f3b068ec559030c74ed396b1926f84b33f4039fe79771b746e04c9d3bfb70914c6f656f9dd33eb6b517408ecbfcac1e9a1ce508 + serializedSignature: 3318a7c245a3007606507a7297031230af04dfd9717ee6eae7066369d94eacea9a857baab4b238c7b79569458e9929a9ccdbe10e151d718871bc080d7f71f00e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset b/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset index 4764b8c..92cdd5b 100644 --- a/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset +++ b/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed585b53d340143e5b1a0a5a41546ee2033e892392020eef72531cb908941774a0d0163bb605dbc2e05fc0077f8f7fc35fc3a3df3949da34d92654083a4832d9646f67cff9beb3bb67133309971a47b245eb34471394a62c1d52195f737897705b39a77c8d2a781f20cda06e9c46437af2f54c0d215d42ae4a35f43ca67dbc0b52bf41397c2fa16f0e392ecde3c9a1958aa3539ae66995566850f58788d8924e55bb4cb15daa0be92c7d436d4e94e2414ca91a44b2819aaad495a0b4d36e9b3e895925d4eda34f858a90b92712bb042e3c8612eddea27d868ec88c71f9f33660747a8603c8a23b634436923c6c0daa1e4180c68ab46054a3699ad25a31ac922ebde724cda04541841afe217efa8660e58ab8732e0aaa287f230c320905d44cd07bbcb9d72e4d02d46d8f942d0c5b048d39da447a24f276a1b6bf6598494c97b7cf3a645ade54428903e811f245d17043d213d13427da2fa1ac26be5d8677cfe27d2aa3f96dafe05b37e6a60d995e47bd53b52ab75cd7a1691ed6b0f66607bbd92d237f831186bed3b0a761dce439a2ce7c4cdc62682d32862cd6968c49814c35954d91c959b5ee43b07d1bfd16eafddbc27b865e05daa24786e91e110b1a0c2ffe3a9ff871fefdcc68366d9acc4e36ed49886941c0b2bc3135e093106c8261c453aca8177ea5833fc1851bd708bfd5ae20edda27a05376a66602542fb22b68b086a7206a576919d5653c07a2a88f9b140b4a08bcfecd334cc55600c77400775d37c0e12b4a10c05d75bb1a009315e96810ec6e8160980ead10ecd021c883a82f912298469915fa2c486d41f6cb86cc43c9f3684e5818d483715c9630f358740946fc4edde606e2a6149a12f846a9d95ddecdeccd8c12869ee4a4901cbd32ad9c22ae730ad65c7d8cd429fcf1b8f3358bbe9f41d6890459c7e8af8bdf8369bf07dd5f7a68d7e3df23f88f6a4f15ed69641809dc4a31780b825305bab9974d93c956a9364e306c5d09539a43cf4d68b02748879f677a03ce33f92b0b6dc3acb09629ee9f97f38f132ee9ac0bb7a975189fb02d7264016976801b67e9fde605c5c3eb624447968bc6147e5e7a65269ccada551179592f4f3cfdfe39cdfb9a717626b57e32a678523ff8cfe75b8ae7db43729dde6226b3af5efce16217aede231ead430f79fb51a7256045feb7d941efbeacf4157bcffd207b48b5ce9767c4cb1c44ba4594d3a2e722e684ff81628e5e03b8ac5850c51d17678ea5d8b6fe28c1635fd8c1cd03e7d164a72ebb007522034ef35fed6a80231770035102f7d406ce8a17ca021d2b51134f2cd33bfb17d54ed3306e937628151dc0dd51011c73013c18f5b4d67b66d96e12197889a8c0532ef086a2048fe9ffea5905abd101968c0ab00e7b53bf01e1538a378b6177ec31d682a6b10b6c6956a4d367e35046eb65597c32183723ef46d463722caa66dadcdd836586eff98fd954a5f7efe295f177156196ced2cb845cc900564ca6ec46db3f429e807c5002f23498b784e768158db3a2145fc66f1eedaccf751d0000 serializedProgramBytesString: - serializedSignature: d31a7053526c09e1feedbeb0df1511b57ac4634b104394e58f50cd74315f16150a6f483404f6a00a32d81e2899b622c680c38382971387205fede1f7016d7e0d + serializedSignature: 0f3993281d8a13be301d34d107204264f4a1ef7af4e87ec5ca66c3e9a6b2d09eddd29dbe8f714ffa3129d84c735a6bdf14b201a5b6a3ccf00f42d806b2d4c307 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset index 5c5da86..21d1438 100644 --- a/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset +++ b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09edd3f6cef44c4dd5d7d5d5617a86a284d2ff6287f5d780ea51edaa56f5ab617553ddd0bfda753aa53fce96bbffb29ad1e998fe1ed47987d5ae1c67c2bfaad826fddda5b766d59c3e735e0de97402f37bd588fedda5cf1dd15bb07754ff1fd147c596eb93fa5587baa42eaacad8861c2206f0a459b32f0676c556eaef36f5acce1d41a5e02209ccaad45fbd3a6716f3a6b4d2ee718fa9c7d1ac299d37a4cf9951935ae67594b87297d62986363957d0ff57e8ff1de6f732931699fd67c971ee7e733ae69f23db2079dc6c2f37f99d641bd2b8499b4cfe79a203a4c5266d36fbbaccf64a939698b4c5e43f64b64b4d5a66d2559ef35799f48cd97fc16cb799ed87cd76bbd9ee36db0f98b4dca415265d6dd235265d6bd25673fe45c756e4117ffdf5d7ff67f24f9b741db1653b6102e96623e392d9de499840bac593bf9b308174ab27ff8c49f7916bee25fb20dde6396733b9962bd33d0ed20de6f8cb667b3fe109e9468fbc2ac217d24a4f7eab49ebccfe2b641bd27a93264d7e0fd986f488d9dfeb9177ccecef23db901e37e9518fbca326ad65e49d34fbfbc936a4a74cdae891d768d28447de61a2b77b3df738480f9ae307cc760dd94ff5d9648e7b84948bcbdfe5ec1e07e97a4fb9adf3ecbfaa8cbfc66318bdceeb7832a8a655022b7e8dca3fccba67e60eb0186be00bfe55e165e774289bd6022c51ae1f63e89c6ad03e618b729b636544ef76fc1ed4474ca050b898e712af645c02949bd49f1112a267f5fe4e8cf010a427744ead0e1a1378d613da4d1fd39f742903fab2933acc8f68e79bd79702794f68b5338fcc65128473ef393d5aa6d3da4ce93d2ed069bd3d891af6e2f72dd47404b5efd2fbe6b0edbba15bbf369ddec6ab65da3ea37fdbaed96790d975b4373adc7ea769738ba9435b03da27b0fd592a91c5281140bfe251530d9727b0c57e29a32496183a41063a325d46461d228ba5edab5709ecebf46510f46f63a68576ff86bc9b2865501f9bcd1e3b1d28f2436845aa94553cddae0695c0bedab61c7665a30af2aab147ed57ff787c7912b4f4f28f59f827e3a64dcb34a9c463126c31928b38c9c5854a5e66f319ecff8e89fa4cbfdee73486673177022368adee128fe87dee2003e87347bafed28dc7cea30ed93d0b62fd760fac19136a321c2c098556823e724829217d394f5a6e2b151c7df48658937b51f73194e3bf1ec36067a7d73559d2a5483ab3a3954b078e60dc56638060995dad968c4a53ca579a15b6e2c1414d4f88c593ab61cb563830a2acccbb70cab1703666d8965d03ae688a6d4503f42a2c4a811765144d395f342bb9725fcdb9a38f722fe184afb10a7fc19753ade2b0ace5caca0796524ef8ba00849771c2d75b845754f913fe00c77c4300055ace09df1840815670c22b03d07c35277c53009aafe1846fb608ffcfbf1ff6257c2d277c4b009aafb3084f60cdbaa616a33b03c30fe8dc8fe863e7b2760fe0c8ec311b66bf8e78f8d8e335748bab6330bb168c5e5c245f6fa38da126dc6eca1c0ebde138ff2de1f6bca9ee505c1725fbf5397a1b6c1501e8edb4a9e4ad043bf84ab09113bcab40c1959ce0dd050adec409de53a0e0cd9ce0bd050adec209de57a0e0ad9ce0fd050adec6093e50a0e0ed9c60986eaff2088e3da837af9b21f629ed91cfa9a4baa353f98f1f9b76d8225b59d891ed9226f5a472a61bfd47b6eabc235b0d13d9725d9f8b6c3b398f3868f308b87b378104c3f58720fc6497cd52f09343f954aa1a5ef06e0ee1611b42b86937aa376eea5d6163f4836b0f87eb4881b8f672b86a6db8e0fedb2c69b56581f901b48f03942810d07e0e50d206088ebe652a3e54f7868210f901708003505720802a0e40bd0d00c4cea7f5cf413c7606fbc610afc3c250cd61682810430d87e1a80d0384b7260cf993e807a7750dde6b00ec51cd24c70153a7f737695f4ded6ff665f641ceec63059a7d88137cbc40c187399e276c3c61ec0bf44ea9abfab83b482cf5bbfeee6f3fcc8e70a63516685a2d27f8648182139ce053050a4eda04c3d402743a0b9d71a9e384370520bc9e137eda2afcf9763fc21b2cc21338af06b2c29f1469bf1b1d82bdbf034b9396795825708a0f7c26786d203a7abfe2f61e36ac8aaa165283eb851fe57cea4c000e7b8c13de1a80f0e39cf0b6006ac3099b70a80ded16f749966716b12967ef255bf84b3672f6740400eb2427fc6c00c24f71c2cf0550120f7225d12956124db64bc2262c012de846fa699be455b89947a3b68d17dc6c130c775760d569a1b76e5ab8f2bd6029dfca97ffdbe8a77ccfd884c3f1b0ce35a36f041292e6e3a7ffd3ca795137eb45afbdfa6a33f9c29b0c7ebca8cd72c904deee599c4513b0663b35540bb651bd68a198c0bb4fd9964514a611d4eb96d417d3a6c2aaddec8b330ad3826b57db6da58fb7cc9e5c94d2bf6219a706eb03976d3e80f7f16ab3d00f422f8f276473872be80ed20a714ed1c1c5ba1e5bacab57ee12e65e7de6055dd0831a3b54367804e319bcee536672aa565dd39f31ccb9a6a5cf6a7d064d21cd601e2db4f4d56b7ee2e859ce825e9b056758ceb028645a1f346734ef44cd9d75521d5ab767743eecb79f9dbe9e2a38ebce71d6f5d9acebf654e4f4eb3a76ddd4565e434d6f685d2794bb221884b4e2beecda67cf0bcaee4eceee7e9bdd7c30edc12b0f63f84af7c85b774ff76a4dd76ef9d1f93ca7f3804de74e4f59d1abd292eac4baecd6ff3e356e254dcfce961354f97471b63e62b3b5c547f9387bc62cdaa6966df1fbb91c3fb63dc4d976d5665b5b20b62dacfc16eaa917380b1fb559b8cfe3a929aa8e557dda42ba982053cb549e1f2d1fe6b47c934dcba605c400c88747062166bbe7f6ea5a378e756d244bbc4fefa2f9b1aa9bb3ea319b552716601574c3e6306238919db7c2d6b3f063cb45ce9637db6cb9e3c396d4b4d2795d22030bae2f61e570845376f8e17a89e3fab88d6b73464b92aa6f0ecd73a8c1149675b6da999e436fa30755a72f7396bdc566d9d59c9639fd98219f96159e130c8d2b1c8d6b361a07d8fa93f2326f2408aac5e8e1347dc2a669579e7d9b6e1c9d409c9ac6a519439ea8b5782d642f67efa0cdde46b664bad1a271357ab707701387d6c3d86a3a2d69764b83e8d1f471d65c0fc6cf6c356261dcfb394d8782d1f47a609a0e709a0e2f2c920511a31792134c247b84a33162a3716191690463f355cee6519bcdc7595f85a5ca7dca59d2ec583f6bbc75ceeccd4e203d6f4093831eaddd9262fd89c540c9b3184966f49997f10cd89a55095c899e54f93faa0ed79ec2a59193da8a41fdcb7de629bb049872e61e5c1f55de09c9853ec39ccb0a279ec2f9a36a903c176bb32eb74dfcf3dac5c6225796268dabd0ef354bc769a9162570adf8a1057a536e2d26e06acbec3ee47fc1bb23e0a28237db68014e3f6cd20c90fab5d461f33be795722d403d8202dca77c03786b03b857abd66f1887adb3fa331d53aa385e9484127852125331629a8f181ef807b1d023fc5c60d57161cf7a64068e0a0cd5b7b57ab017e40d7b03093e37f146d3fc291a08aa2d5e529da582a55a297beb9284566af23e6f4092d0804c01840e37de626dbf2159db5761995df38c518e7baf53c80b0e4ad26a7f693e462c24029c54a900795312d94a836c501f30a692b2b86aa4701d24b8a6257195195ccedcec1cce0c0ea197d5cb616b91c2d640b03d2d896db5c13685a77421341879c0f4f62dc49794c3572e856f05c13713465c1b4d1b7736c821db21856c2f41362b1dd79c61636a941b3d0f6b26b8e624715528fba31921c0bb2205af9dc09b0fa37a8e23289854bd2d1bd1c4ba1de504d9ad3090a5f7d404239a18b27a82ec19e98896de53ab8b604f6d17c1753b3c5c75b215520cd72182eb59495c7cc7f668043bb60f126c6f95c4b6c6609bc596735ecd907b84dd28269a0d410501f85c180d417ad756700c2ad6b5ad21c8de1646649bc5d3ea653d4c0c5725c175273c5c0db2eda618ae6d04d7dbc3a890e93d33c146402c861d23c89e0fc3c3523d33415c625d8d0304d70b92b8e277437e34dbc62401f56258a004639618a8a304d43bc20225380f2b06aa91807aa72428b7979f7abc20cab3156b09b6778511e09d2e4432a23dae0d04d7bbc3c35517d11ed71682eb3d92b8ec43a02822db4990bd571259ea7e12442f5881702fdc4f2a26f8de27ed71a9379b8530c72fd604b41064ef0fa392ba73fcd19dda7980207b298c6620352c3a11c161d11182eb0392b8f81958c1a6609b14b67504db0725b1951a6cde677d05ab665c0a9a22d03eb418d0043d4d0c5a8c40fbf06240131c718a412b22d03e22092df7ca9f28ce6cac24f83e1a0e3ee8e886bc704a0c5f09c1f731e92a3b4b4e09a1ab2b36b83a43a07d5c129afd0e4014ab699c20fb4418c8d287f0827701c4bc6c3f41f6494964b6a9c8e80eaad6106c9f0abf724671d2bb8e20fbb424b2cc71a8202eb171e81e82eb33e1c732c1a1bb582c3b4c907d360c0f4badc888e2eced5682eb7392b8b22f9a8aeefda8d504e0e7c3f3b78688de8fda44707d4112170c37dcbf8e13c208406cd0de44807d318c2620bd9321d8048855c95304d997c2a892a94ec6b1087632aa09ae2f4be2e227bb059f01105b6e7c8260fb8a34b6f43f2113423cbb2485ad8d60fbaa243678506f5e67f429e78d25d1bb9d729aa0fa5a18712cb5d4258a5dd9cd04d7d7c3c325fc948918ae8d04d7372471d9c79682c3713164bb09b26f4a22cbbdd445b0828a2d752923f8be25dd62da3b1a515c21b48a60fb76385ec7ddb613acb462f84a09beef48c7b921e5bee42f843e9a58d7b69520fbae24b262e3714f297857bd68f52c9182b58cc0fa5e18ed68fa003d8a7366cb09b2ef4b22cb1ca047f179e01d04d70fc2c325bc865b0c572dc1f5c3f070093f9329862b4170fd288cf8953e0e109c31131b075411643f0e3fe40b22130bf9c709b29f841bf2052717c52ae53e82eba792b84a94774546346733d613603f0b3f8a4511d97675cfbc70340993593f87628f9962afce98ff75dee0b9c6580763db6e35829303ce3b3e0755ea6d9e09208cefc7f6f396e0ec32c1b6ecd27e410df094ca6460a512c4eb436d96e6b68f2fe1b22ca592805bc6f7b4fdbf84722f36e55e948079ec585d00be975ba35f29fe85b5e1dc817fe395eb65057fad681a8f04350bf16b682cd2e54de075135bde983e1d9cedbfa6b1ac28b175a13eed5fa397257dda91368ef83db23bf3b0ce5e0e5e9b53474da33fd08552237879f89b8eb9496c8f41b3c84b6bd55b6368eb044a9d522eb662fcab0c45490845bf91e499c71b3befe55ac2478824448857d22a51122ad16f97bc3b50effe9d24cf3c1fb9be8f3dfcf7991efe87250f0fd4c3ff28c933ef67adee631fff53a68fff79c9c703f5f1bf4847f13ceeebdec71efed74c0fffdb928707eae17f97e4e96385e97dece5ffc8f4f27f2e7979a05efe2f499ebeffdcc17decebaf66fafa6b4bbe1e90afc3a712bbcef42f8c5dd2c70fa33cf817ff3f8fae33c60ab70000 serializedProgramBytesString: - serializedSignature: a0a68082ef3b3c61085106d2eb35c49fbd7add93509eaf4f973211ccac333f23c5d807d169798abd7e5ade99ea9894e3377318dd6a2483522ec7457c5a56750d + serializedSignature: b2968297ecf57382feebe6fc6aa39afca3931b4345cabd99e9d84bdf0dc58e280059fc4271f0642c4d99ec61dde9136e527ccb5ccb564f85f020e2064125470c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset index b342b19..a4aecd7 100644 --- a/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset +++ b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15080921409ce28aed248e21c1b002e2dc892d202624c4a6b8feb82810687148094324e122af9037ca1be471f2333f52e574f7cea2d1eeccae56d2088b582a7677ae9eeeaf8fe9d9111193c1c77808973db6c556d83cdb657976ce5ec1d30adccfe06b979cfa4d5684fb4bb8e6a0ed21bb1730123fd3c6185cd7a15462651879c98ee17e4aeddbcc82e775186b41096b4fe0cf825e46270cda65abec397bc6d2c64800893d1a54e27506ca65c4e1bacc7e87568b98c2494c6a4ac3651b5a4ad476064c3bfd5eb07d12eb0cda8e614c911580e611518cff03578364a2db00bfa7e0af0bfe868432defb78fd302ff7b2ebe1ac5b7876fa1afc0fc78c086540c2f8db453b29d070ea127ceca88b768fd03721d4e1bd838f49f372b432e7f5980ea10eef113e664c28238f7ff9f028e3c5a1db25a91be4f5e375d28cfbd09cb0e5bce6d7a1d32f94b1df24c76315ef6fdebcf9376a9055fe0076926317cc44c18d8f59edeee38c0c761cc238c29999a669cb60a217404062bdbbe41b65b6c416a5d63b6e2405be57e89a831ea7441427734df1a7670a64ae005f4b70bd12d4af91e7a2f39d42cb3cdb803b8e3a640be04c2f5c54f660da02b8afc576e07a41f40e816d6fcf2091d04ddd63b680a61d45cea0c601f402ca05e2709baeaf89538bb85f87ba32c5b45710d596e17e45b379652fc2b36cce1d0e999c47793051d5db21cb51d32a4883dc9b64bfef3472131aa1f038c5ddb0d3a408f8874713ef30b4830c06cb754e63c10eab55758bcca4f565cb83607819bd12caed3b08ef7d1f6450dd6992a0a261fc44abc55a62262e17c65480587ea022bd1963d443c19ffd68b433834cbaa13764d0c7b072a785d063db3951c941dff0f023a8b36ef83dd867b05b8ce01bf30817cc820ac28804c24c8c67165eaeba5d5c614f05e50e997290aab1dd42e53c07d97fe56b4778d5606a35e70241ae990469c69bb204cdafd24ba74c2f719e057a5872ab25a1564b544538d920e12e99be29373dd4aa6f27c1dc864ce22768cb417f8b562bacdf048a39981be96569864a525a3dc2df127a6bb6843eb284fb42badc28672a1b89c9104fb4dac3b6610cf62904aca3725c713372b796b587b04d29bc2c88071582719933a0cd0ed4e20c7d6a67e8961146d50caae475134fa98927647aa79deed15be569ce4b86f0de3654b3b70d93453ca8c3dbfcb853d94b8f4cad581c51a5506eb546d56a4dca88e38ca3b518e3b09a70af8aeb7413b8ee53111f6b02f17e15f17109712324f1940aef8906f11e50713d29e13a1e92eb415564996a426419924516b2cbd6ae2865dad563bff02bca7b0c5ff3b84c63e33a40543bba2a3864e1a94875f3ec00be98be21797c16a7adec5bb0a5be19e481ed0e532d75fee0a842d7b0cc6e50b57765783d6a10af970cdf561fb00d6611a765f68b0f761e13bda336d111951cf76472645df855e6b4f93c07ee6d2e4bf0dd012e7103e5a765b5f6c596ea0d5918f94655f2bd2f936f3fa49e6ca9d7483b626ba901fb6dc0f243e09256e1f2810c97a70ddaef1ab7df66797b1849c754927ea89254e451dc708a36be4e2f4b7f8341398a1465ae39d558bf9666d9fab84ad2fbcdd0e93ce7d43e373be70bd12a7f4d8cbc62f9293c79e3bab8a170b7d9b4f2a1249d5049fa914cd21f1b90340b4b6e8ee4c3d64be0135f99db526ec115cb97dcdf754a3ca992f8814ce2c735c5e92cf09027dbb58f011a8fd3416b500cbe868149e1f7d4b3086337090d2c959849b9758655b61f41676338fb1978137acc0e007074bd69f5a730cdd42765279e2ca1de439320296cbc70fc099dac392fe265d205cba43e208a71891c5a80346d346e9ba433a855e7303662d27e67b64e6b0ae602cf70bb3ae436143ed3b4093ca39f4800017ce571c01dc3a2c5141512384bd00bd23922e09c2934e188184dcb0e24459ef6e1071ddd45dcbdb236eb28b2d6ed8dd72bfa290e5d017b588bf4f26e2fa14deddbc6f927a295cf282ca5126ae5213283a176f67f1e05331805f1974c5d434ed0c8a055cce9f4ec24e9cbd698983a1d808fb9e66ae46cb0bbcad3fb6a11a41e6fa773b4a80ddbbc4ed87a386c17ae7d56461f68c3ba404b0aa09937636b0b6d085b42802dd30a5babde8b69b5b5982ed02202680b3a418b73d06c02177ae18aea82ab5f806b51275c090e57f5bb008d6e99d00559a700d9522ba259def5d241aba5a574c1d62dc0f6a94ed8621cb6d7fcdd8c46b0b4d9585400eb512bc03ad10f9636cb8a09607dd60a87f4a6174b6d98cac605d83ed7091ba6176750b8f2bc3e6d3f5b1b1440fbe2666cad1d77002901b62f75c2d62dc086ffca72d5a679191300fbaa150b804580b527587d02585feb04ab9783754caf5eaa0f13da71b36408c07da3133879f6df8e99598700d9b7ad8864e2f193c6ed9236e7ec1100fbaed580b563341b10007bdc0ac0ecf4a2a8db25b501d6cb6ecd094c0613a527aceac0439d3edb871e035c4eacfb9959d49ee7a7f8950310937e5788dba330a783fe34834f27b2a2282efd149aa69f669cb8c8246de4f425e9a315937e86799be55f66f67f07d307cd344d66bc0b9ab7895b900a1429432f529fe87f8750fcb8683f0000 serializedProgramBytesString: - serializedSignature: a13b10965522f94e1473a76dc3fe77809fd422bc6cbb702f57ab05aa7d3f09a04f3b9517111ddef9b8ef05d2a961152423b751e964c86e685cffc32365b0ba0c + serializedSignature: 5133ead068028001127c2e50d3df573122925e1b5d04ce16b8619e0c6780d2dce76d69cdaaf3750e771f57b429dd690caff3129397dfc13e2dac9af37f3b4c0a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset b/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset index 338db05..7182900 100644 --- a/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset +++ b/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c5545f6f8ef0342efbdf71204929086284ae8a04010027621a44034404c028215157b57ecbdf7de777575ed7dd575d7de5dd775752d6b2febffcedc99bcf3e6cd79efdd37398f19ffbff021937befdc3367be73a697db22d7f37f22e3fd5fcbbcc5de0c2fc75bea557aebbcb5fe5f337c778dff2fb892f71779f5bebbcaff5dee3f1bef0d4df226fb1913e9ebff9ee75f35788dfe9bebbd0adfade1cf977855fedff3fc77abfc2b76b7daff5fe5fb8ab4f25f5aeacdf44abd855e9f48af242296f1971ac4bd088b57a4adff7bbab7c97f5ac5956281e4f2477dfc5f4bfc270dfcd91a5f69e96f6f6f5f1ead35feb30aff9d7aafd697b9924b6c3b3fdfe37f78813356b8db09b7a570c7f9ffdbf9ffb33caf5599b8d75ab8a7077f4756836b16d35a71dd59f157a3f8dbaaf81b2ffced2faedb08f70c259c33c4fbaf88eb2e8abf1ac5df2f8a3f359cb6c23d5309e7cce0fdc81471dd55f157a3f8ab54fca9e1b40bfcb5784c89f7598abcb384bcbb92f0e929dcadcafb5b453853147fe70b7f07806be65e20eed7826be65e28eeaf01d73a3d7a09f76c458fb395f84a7f17297a5c24dc8b153d2e16ee258a1e97207a24e1d972a0e24f725b0baee1fbab95f74b40b8321fb4536c0b61d0f23cc5df394ad8e728efaf56de7f4009bb0d085bdadbb94ad8e706efb6eaa9f83b4f09fb3ce5fdd5cafbdb2b61b70561b7107fb7157fc3b2649c172d4bda29f72e05f72e15ee658afe9789f06ff282f247e6e309c2cd13eee55eac3d5d2edc5cafa9ec9af09ab8979320fc2b94f0af08c26f2dcb8756c2bd52f17765f02cab2c082beb2245ee44e15e25de5b07ae997b35d0e56a1096bc9725dc6b9470af11e13e17f861e618136ebe70af55c2bd16c8157cdac8b2bd40617bbdc2f67ae11645dfcd95e570a170af03ba5f97985953b8922d12c7d6b789383ea6c8d571ba4191718390f18d125729a358f8af53ee4f4a23ddb2c0bded45789bbde47945c6ff4645f71b05a787c5f508c5dfea587fed65193619f897faec28dc9bc13d19eecec2dd41c83d50793e15bcab7b5e22dc29c8f369c2dd09793e5d498399c2bd2581ae3392e87a4b125d6725d175768abab652dcdb80ce7310bf73857b87176b5b7708f77620e376e1de0aeedd2adc9b147bb949b1835d847ba7e65dc9719e124ff97c2a7857f75c72dc15792e39ce479eab1c17783cbf7469f462f333164759ee8c54fcad8ef5d741e6d7c9c0bf64b1d08bcf13325c2c4fc8e7589e90cf259f52e4b9e4b30879aef249547e0cf7a27982b9778977ebc1b5cfa2e3038abfbb41bc5b0b3fb2ecdf4df1e3ebd571b3b8d746f8dd0730c2fcb6157ee5f5624dd84bc03de69645e574923a2f0dae7b540af9ef89fbcb9438e9de4dc46e7725be61dfdf436110f6fd3d152e61df97f599d4ff1e25ed3b28f7f747debb5779af9b725f7d4fc6f73ee5bd8eca7decbdfb95f7ba2bf7d5f7249f3f28ef7552ee63effd5179af87725f7d4fdad303e27983b86eafdc57df1beea5d63e56eb8d3f79a9d71b0f7bb1f5c6c3c27d08c87848b87b29b2e4fdbd85fb8822eb11e1fe59dc6f04d7cc7d1084f1a092a68f2a8c1f0d74efba45612a65f836def5294596b4c7c714598f09594f29fea03e7d84fbb8175b673c1ebcdbadade2ef41e16fbdb8ee2ddc2794f79f08deef2e6d5b4dbb27810e52c65321d2f319250d9e11eed340c6d3c2dd479125efef2bdce71459cf09f759253d9f52ee4b06896c56f6e19f57f83c2ff8dca7c46f3fe1bea0e8f48270ff22ee6f00d7cc7d51dc3f480957de97bacabeed4b8a3e2f053af498abe8b35cb82f2bfabc2cdcbf8afb1bc135735f11f73729e1bee2a5ce4e96c37f13ef1c0cae99aeaccdc6eab7eb12c852edee55601f2b3cbd8d950bf77525ceaf0bf7352043f693ff0eee49392b85fb9622e72de1be0dde795bb86f7ab16db23703793d370771edb91584279fb7037f33f70d8d2e15c27d57d1e55de1be07de794fb8ef08bf8728b2e4b8dd078aac0f84fb2190f5a170df57640d15ee475eac1d7e1484d3bbafe2ef1f40e61bc2fd18dcfb3878afd7c34077e65681e72c9c4315ff9f89eb51c2fda7d754ceb26289df1bad3c93fac87b4cee61e27a98703f51e2f58988d7978abf7f69e2f529b8f7a9784f8e39bdafc4eb53255ed2bfecf7cb78fd1bc44bdaec68e599d447de83f11a2cdccf94787d1684d757f619aa85fb5f20f31d708fb99f2b3a7f1ec8e8b355f1ff8df07738b866ee2a45ce11b172fa9eacc89175a8cc53df8af736836be6ca387d279e1fa9c8f95ed1e77b45ee0fe2f951ca7b3f28fe7e54c2ff0edc67ee4f4af88395fb4707e9d8c47c30084f3e67d743144e35e0dae7d45fb6c37569f63eb8c7dc2f9434fb2290d16faee23f599a493947c4cae95fa2c8314d3329276c9abd0fee9ba4d910e5be48b326e643407830cdd4faea3f204df6f7f4f5951c6bfcd28b2d8f6559f305902179bf18e8336091b82fc7fabf526ce5abc0ff80ae8a3f696bb29d3a48b85f2bef7f2dde5fa4f87b5f79bf65e2f007ae10d7fd9384f399224fce8dfcacb0f9d98bb7f9fee01e4c937ec2fd4509f317453719a69c77f95509f3572f6abbed14d9df2a610e481ccf41d28ea40dfc26fcad01d7ccfd9fb87f0cb88671395689cb0f88bfe362fd0d2a51fc4966c72bfa439659406ff9bc4a89770afd3ff62764c2af994e578930ee4b204b690f4522b169c4af992bdf657fb7147e4e00cfe47de6b612cf4f04d7feffc12529e821e304c7c1577809dba591368ace62de37d21ae82cc6a6868c5464c878b75564887e5ea49d17df765c0b9ec17137f97c1dd0d78fc750795ff269afa457fbe05dd55f93ff0e40873a8585f42b74887452e221c636221d010bd98f6800cf403c9a9ecb7e5e3df27cbda24b2ab6da59897b6711f74582556502594a7b3bd24589ab981b8d740571eda6d86a57709fb9dd155bed2ef4f92c053d649c7a84b0d55e8acea25f1ae90974ee19bc37ec4524debd151962bc80afe4c06cb54f6ab63afc36c5f6fa2ae9d5377857f5d7e4bf5f085b1da0c443948191fe8085ac0f1ac033688bf23966abf279185b956309a28f1e1928de3d095c337790b87f32b866ef1de435f52d464c49213c69478315d6838367236a85accd216c7248089b1ca6a4c330e10e05e93054e8f243a0cb48a55d1119a1e83e22f03ff2b5587f4dfee11c4a323b19ade827fa699151403f59ae378067d00ee473cc4ee4f354ec448c2945867bb1633a92eb46e5b99ae73685b045999e6314be638267a38e0fd263d445096489b1ca48b6176bc7d9e2b9e85b44c67a31e3a5fcba55d02de6fe7600ef09fb1e3d539125c65423db29b2b613b2662afea42cc8e760455f95df2169f01ba7f01b27f4794ac4e3ad04b2d4bc35de4b3d6fe578b1b62bd68f44264465f0bffdf7c688f51fd9b20f29f34abea27b7ee03fbb30d65f93ff022ff5bc55a4e85724dc42a09f5cd3d1009ec1bc239f63794b3e4f256fc9fa3057b1d55ce14e14f74f01d7cccdd3d8d1a1e099ce8e0e4bc38ee45a8f1a70ed3f1bdb3548bbb12313c892f5f4a4d8b835dddf5e1387c39577d4381c11220e329f4f06e1c87b3b827b72fe78b37826d764ac03d7ccdd09d8c84ec2dd59f83d15c895f7992be7c24f03d77e5cc69d87843d55095bcc99474a40d8254a58d3c43ba7836be64ed7c451b89119e0d9910a53e9578c894466293acd12ee4ca0932c1767837bd3c13de6ca399d33c0356351a7c447a6575694937cd6548eee28649d29ec50ced9f455b8d7806b16d66b8abfc9c25f2af311472befce8db5eb882cc7b644f51f3f3f05b9324de6293acf0b741e7fa890757a0259aa1dc93526ebc035737701e92ec75e649e90eb4e4e03d72cfc5f02f9130a810ce62ef0626c5fcae3f7a1bcb362e54d9063009a7848d94db216c6da76d3fd528d6d1fa3bca3ae0f39d64b5e768872d713e31d91ddc43b5bc135731781f0c598476471f45e448c774596288c24eb32e0b70cf865ee52251d9606dc72cf5364cbf796c5328ac8f51db20fb8bb620b72fd46b5b8de433c3f1b5cb3f046c6fa8fec29fc9d03ae65bca19c73153975b17a45f60271df4be8920378eaec42597bc1af41fecf91f9ac3a3579da7ba24fec152936b0b76203721dc0c95e533ecf93fac93aae308df0651dbf0f7857f6b5f605ccc4bc75643fc4b69603bfcb815fe6ae506c6b459046f95d15d9f2bd72c5b6ca4558b2be5ba9d8969cf394b655a1d8564510dec44f62fdf3bd00edc0df920373e518e179e09a8521e3502d9e37806b1886d039b20a8421e7234e4a627772fe7b37700dec2e4fce3d57a7262ff65e56848f15cef5aafcf6739d97cb3db15a21d52d39f2cde49b7198e8d6ec17fb19c3836df43b6675be00cd8e98a57cbf4da357e0e56b77c4f4e3636832f419fc77b9efa3860b3d3f1217c4fd714130e56afd7f55603b4f837f7f0edf0dc436f4d4f84f72bcf9becbde5ae14df4f6f6ffc54a59e6075beb37b4abbc32ff771d97b7c2573bde67b228b1ad3fea3b8b7d99c1cea435fe1d09b4cebfaee51a2ee1bf37704dabb8f6f3fc7b8d7c9fd45a6f9537dd7737f2d0e2e35eefffad0bb34c20d3eba8dfa084dd0fb641c9649ae9c786699fcbfb44ff9722db2245f85402cb1feca7552eefd59c189712ffc730286458c36d9e903191238bc4dccbf77279db6e711cc1f0718c8fa1debe03dec57e059f282e7a322cb907f0184453b8d788ef6f7cfaf48ba766c546adc0cb6553387cec3551d4128165f2b2f9687998286465b5ca638aaaf8233afc7cea694906f107fe6ab8bff009d09a577eb109c0a751cafc3f36faff6b7dcfa5bea2d1f28fe5b0b8b4c96382da70bcf19567321531c02d7480db661a70f2122511e0b64df18a02663f7a82ed1082c974c008b6d411e4adb17d4809c637bde45fd3fd7757fb2436707b5aefbfaf6baa2566caa64b27284cf53c3b709e43b50dc8701a61845b6908e731c21d754ab6539464fa2182b330c19d0c05b7d6d9045f915e96c15cc59eade352ca7dbfe1f3159b361ea7165c7a23e8c28da06f5ce492ab80257a1b5dda30845db55aa989d3054f9cb698e46ea692db6192bb6b24c71b5402c9ed7506c59708ec4f6a504bfd7b41ff6a167f5ac31be5ac795ecea597fa29b8bf1734de59ea62fea5492de0a722ace79a2436be1e2917403db9edb1b1174a6d313beda04b7376b3572a65484f3cc93b62827b1b0aee8409ee6328b83326b8afa1e02e98e07e8682bb6282fb1b0aee86091e6028b83b2678a0a1e01e98e04186827bea8a2e6edc15dba4e862edbc1c6f267fab8eb73c0e125553a23712175683532eac86f0c26a4c82c22a3dfdb0e2a9972e5919fda1a924eb103c597b638287190aee83091e6e28b82f267884a1e07e3a0be7a5ecf26d68e141ef32714597dcb247a66cd9a3b8658f486ad9a9ea8559747f5d3232daa35349c65178320ec0048f31143c50671fbcb2acda86f6c17abb757e688dde6c7e0256ad5fd698d94a76cab63296dbcad8a4b6928e8e98dd0cd2252f4b85ed5249deb178f20ec6ec669ca1dd0cc1048f37143c546790bc91b5629b1ae41a3f36abbc2a43339c90b219e670331c998219a6aa19667cc37449c988e7a692943978520ed725256fd6667e7c3abdd13bb670ac8fda37f6b0d1bb895ea2e1e5b063772374c9c2fada6cf59f51877d2426b9c054f2285d8a77db76b5493083b74e8ce935df00005bccd0520195cbbb3f89ea8df4b5f10bc5cd53c1afe79f9b3f354b6f844549abaff4d5c04c75b4cea058b2176b38e5314eac949f0a7e3dffdc733b67c5595a116e6963b02027250ab209a41f644141c1d450416663416e8f06595d5d3d55862b221d2ac8b1ba20d918e1e426cfd1207ff37fe284b7c3856f8709df41239c55eb61848fd30967fe774ca55249307c3d1e2bbca698165e13301e3b69787cd22a1c8f1c8cc7ce863c7275452e1f30a9d966452e93b98e5faf4dd2990a5ff44ed5f1d2968425bc249c90a42434d3152b11f374a9c2479b8e244d9554d749e9469de369c885328b7db79a6bc1ee5788b666e2b012a7e2b4263ea002e5e341b3bcd4577bd1c782add86ec1ad6946526b2ae30741b329f26a1ecb35695893de9267f2b0ed228359fe445d41c726cc98fa714b0d58c1c62c9b9d46bdce5be4df2ef749314de2cac0367819988f85395b17261b562bf7fface413be0b789a053da870a11660f5c51c4d7d31b375b8faa210ab2fe61ad617453ac13df8650a824b70c1c55822eca24b04d60d64c81bbde57e61609e1893b0d077d585ce464597fbfff2fcffc9b460feeab99f30fa6c8f19c77c8d7154b609671c9375c2591b886d34309a25de412799a515db42a0f684d9fa9c38e11371e13bea84b34ab154531be4b1da802dec6fcf8d392e9c99783853305bd84d670bddb92d94fa29beaca920623d7656882fe5b31ce55c4a98d4df49a3412e9f95605b17b6c5d230ec28ffc4d5f4624dc2e4f249907e71f1482534b1f923f86983d4766c194a769a0160b5d2ce98492cd599442f503c54f9e883da921905338f8dfc195bdf1d7cf8218c614cc5f458869b66a0c76a5e28550aa3485f83124c83dd751af4d49258285a17e96b310dd3620f9d165d80162cb4557eaaa71ff6742cec3d75617702612fe72d25d6860bac325c1535032b5bf7d294ad5ec8b2752656b6ee8d95adfba455b6cec2e0edab83d74353b6b26c1c94a8e996aeb3753ab0d2753f5d5cfb78c1a18db0dc51032bc3039b834578852ec2b059138d72facd9ab958e8e5bad075cd1a4c8bf49a35f3301b5ea9b1e1b6216d7817cc862b301bae4ccb8677c5a056e14520b3e105fe8d8de2133b8da2226af0b3755034af0a69c5f3312baec6ac7855fa56bc4017184b9fd55e7c73746bfb70cdd18558bad560e9b67f5ae956aa0b87113e40976ebd9bd24da610ebf6d6fa19ba9eaff3ad8b49b9ca5069b7084bbb5a2cedd6a49f76bb61796ead26cf4542e6b9c598f0751ae12d430a5f82595d9dc6eaaeea18ceeaca30cd0fd468ee85d47c29a679bd46f3bb426abe0c13dea011fe5e48e1bb63c21b35c287760a277c0f4cf87a8df0152185ef8909dfa0117e5948e17b6165c741bab283154db2029d2f5a286c606c53a852626f2ccc8dba3061535b1f767a55f63e98169b745af40031678ddd063e59b8de93fb7fa29da0303aec8be970b04e87811a128975498fcc7e985687e8b46ac73368050f87a5c86c3eac1b26bce558788762f6500706449778c1ee14360a50cabb62f5bc3b5c19b2ddb102d3e2309d1641d76b06af27cbfcdf0778c1e703d77ac118446da8b0cbb1b00fd785ddd7835daf443aa497fe2b316d8ed069c36a6f366d5ec1c30fd75ea8c042daac0b898de455f0b40e06e41bfdeaa83e24e94a2cc4237521b6e1712be7dddaf0615561611da50bcbf334257702e9d51ae9b97cbd6c267701aadb33c28da3b18372529bb4dce2e97700260b1f1bf85aa54b1bd64a3ac68b6f258dd4254d8256d26a4cf8b11ae15d430aafd1096776729cceaa58d33487ff0b635bfb63611caf0b03b60ae6f9fc77e3b71b42963a0760619e80d5026a5d181b767a655f2da6c5893a2dd820588d177c70b65c4c1196f2b5ff610734d660e19ea40bb7b326dc05a29c0a1bf25a2ce493b19025f7f53c97a53fe0b80e0bf99464212f8fe9a3862f99ebb0904fd585dc8d87bc40d4b0d1f45dc02dad410c1d8509ff402cfcd374e1f78f8979323dd2b3fb7a5d6dd22fd3b5c912317ac4e484af4dd8d14343e23ab82525fa1ae50ca44649a60356a33460697a66326b6621ac32c8478d58c867e942869327320dd7f1de43fa1aacc734d8aad3a0778c3d07e38672f47bbdcfc2a415bf41a709eb2c9fedc57796878e08d7593e489749f8de96cc2fdc660b0bc2671176225b8fb82ca2cf20e77a89966d63e163d963236622e7e94c04ce6cadf182afb2a76f9e9bb0b0cf4f9641a2e619ed642e10fa84d1e0604c830b9269501b37d4911e8343300d2ed469d02b0983f4077f0ec5f4b828593159cd0716d227701816f2c5ba90bb6909980c731c8e857f49b298d7f31222fd981f81857ca92ee4beda9847d35e37e414469bcd983697e9b4614dec0a64a2a22154b84762e15e8e51901d8b253cdca093c98638b0899330da1c856973854e9b615e7c772755add26b101eadd38f55a4577af11569def87015e9169d70d611beca339fa33806237bb58e6cd718b290597a79ed582cf46b74a1f789cb6b32459bc3c68ed3e892cbb7ccb2b9b34cb5575239d24ddf5ab9d6d7b29d828ccf8e6adb2bec84cd6c5e73a51e3ed65a395e978aecf27a2ffe64b6b74eeff150dddb3fbc1a97345978d29c8099c90d582128b37135ef73cb03336b428eb89e8865eb1b35d9ba6f5eb86c7d924e38f3cf3e186eb238f7649d21f32dda07901a72ea1b24e4c2bbe6dbd071b38e99d6f06fe186cf36bcd0ea8b659653b0cc72ab26b3bc79cb21a5f3763aab5f98cc722a96596ed36516d972d26796706d86d3b08aea764d45a5dd6896a0a23a5d279c4d72dce1196ed93a03937ca7a9e43331c977994a3e0b937cb7a9e4ad98e47b4c259f8d49bed754f23998e4fb4c259f8b49bedf54f27998e43f984a3e5f57fef3c321b6cd663ef32d4d89cbfe3feaca7e95d70c9cd705ba9460bc1e30147ca14e30abb81f4c45708213a72ec234fe93a1c61763821f32147c0986e261431497ea04b356d49f53119ca0157519963f1f31cd9f9763901f35847c05a6f263a62a5f89497edc54f2553ac96c38e18954606cc1055f8d19c6938686710dc6e2295316d7622c9e3664711dc6e2194316d763a6fcaca129df80417ece14f28d98e4e74d25df84497ec154f2cd3ac96c91dd5f52c15c820bbe0513fca2a1e05b318b7bc9d0e26ec304bf6c28f8764cf05f0d05df81e5ea570c73f59d58e2fdcd30f1eec20cf9efa6867cb74e32eb21beea990f65de83a9fd9aa9daf762925f37957c1f26f90d53c9f76392df3495fc074cf25ba692ff88497edb54f20398e4774c253f8899f4bbcd60d27fc20aa5f70c0ba58730c1ef1b0a7e58279895761fa422384169f7678cf387cdc0f9114ceb8f0cb57e14b3bb7f98dadd6398e48f4d253f8e49fea7a9e42730c99f984a7e12b3e77f19daf3533ac1ecf08f4f53119ce04cdda7318dff6da8f133982d7f6668cbcf6239f0f366c881cf615affc750ebe7319bfbc2d4e65ec054fed250e5bf6804e7f2435833391339ddbf627f879f89fccad7b25b1c59ed6cccd79e7e1a3251e0d8ccca8b987dfeb719ecf325cc8cbe3135a3973133fad6d08cfeaa13cc16e07de769d7b5a9a2cfc545bf82a1febe1950ff0d43fd8329eabf63927f3495fcaa4e322bcd7f4a25111394e6af612aff6caaf2eb98ddfd6268776f602aff6aaaf29b98e4ff994a7e0b83f19b218cb73195d91e262395dfd1490e3e2a9482ca09a671dfc558b44845700216ef6904e7f233c0d9c65afaf30c977833bd5dfd676ceb079319dc0f364444cfaa8bf595b8a66ba923a2ade85a4558453798fb4c5f1bacea7b1fb3852c435bf800b385d686b6f0a14e30b38536a908663411c11f6119aead6986fb874e32f3df2e1595131c71fe31a6727b5395ffa993cc16eb76882439e018fe0a75daf02758643a9a46e65f18ff4e86fc3fc554ee6caaf2bf31fe5dc8f87f8645a6ab69643ec724773395fc1f9d64d67aea9e4aca26683d7d81a9dcc354e52f759259c1d8d3b060fc0a53b997a9ca5f63927b9b4afeaf4e32ab55fa18563fdfe804b37e46df88793fe35b4ceb7e865a7f8709ee6f28f87b0cc78066c0f103267c603308ff114332c810c94f98e0c186827fc632f810c30cfe0b960d879a66c35f31958719aafc3f8de0dca1ece60a6fdb35dce141cfd37808e935e287a7dc881f11919fd3692ecdb006fd6fbaa46415ddc8549232c17a29d6edd45adf2853eb8be82433eb1b6d687d2d74825957618c6157a1252638db50702b0cf25853c8593ac9aca5b49d614ba935a6f2385395db607631ded02eda628227180a6e87d9458ea15db4c720e79a42ee80d9459ea15d74d40966d5e644c3fab513967af986a9d719835c600ab90ba672a1a1ca5d31832b3234b86e98e06243c1dd31c8934c21f7c02c797b434bee89a93cd954e55e985dec606817bd31c13b1a0aee83d9c51443bbe88b41dec914723fcc2e7636b48bfe580937d5b0841b80a55e8961ea0dd409663db569cdd0531ba413ce660da7474c670d0763c631c3d4388660c631d3d03886622acf32557918661db30dad6338661d739ac13a46603ce69af2188925e13cc3241c85e5ef5d0cf3f7682c0577354cc13118e4f9a690b331db58d00cb63116537ba1a9dadb61924b4d258fc3242f32953c1eb3e7dd0ced7902a6f26253957330835e6268d0b998d9953583d9e5e984b389d6a511dd322455f2d7b8e48998e465a692f3b134dcdd340d0b30b3dbc3d0ec0ab162744fc362b408b3babd0cadae1883bcb729e449983defd30cf6bcbd4e385b71ba6f2a3c12ac389d8c69bd5f3368bd03067bb929ec1d31b5573483da5330e32b3734be9d7482d9211c2b53117c0b2e78670c474533e0988ae1a834c45182e1a832c4310d2befaa0dcbbbe91ac1b9c3fccb083b4b3af3bbe8d5b39b9b6ffffc2a1d29edfcc7ea081b1b679f7ca6d0129b0b998125718d6112cfc404ef6f287816968d0e30cc46b375829951d6a62278353e6e33072bbed79816df73b1f26a6d339457f330b5d799aabd0b5660d5191658bb62b671a0a16dccc758d49bb258802561433324e1422c13361a66c2524cebf5cda0f522cc3c36189ac76e98e0830c052fd60966971b23f1e74ec99fb800b2f0009660bc373503ef324cf8c1cd207c2996730e31cd39cb30e33ed4d0b877c74a91c30c4b913d3016879bb2d81333c0239ac900f7d205c0f6c36f4e8549092e786f2c4f1e699827f7c1901cd54c48f6c5343fda50f3fdb0fcb8a519f2e3724cf831cd207c0566e0c79a1a783996d98f33ccec2bb1cc7ebc6166afc0589c60caa252d77b1aee5f66f4f0f769fc5c7cb6122bfc26c61353ee159d14d11ffd9e3874acb7538519ffc9cd60fcd558829f629ae0abb0c2f754c3c2773536ee785a44739ce5ce4a2a30eb58c7ed889d4097c38fba5cc78f2c5eca3f635beffb5de8b1cf31977bf278eee070614c46e2a761063e6bb0989dae8bd9340feb75c33e378ce13c9e8b6a79be616f2d17b14e2ca1f9e2b73f16bf3374f19b82c66f8e177c283c3e9ec171ebd3f89d1afe1d8c7069b7cc7f16f64ce003b0589da98bd50e68ace24f990de2240f2c6f8c3b35114fbff81316c3c4a8168bd159ba184d426314af456c8c8223c283b852c5650d1697ade16c2e59eaacd2d8241e279d058789d55a2c5667eb625594464e92f12a0779293860bdba194b8475583cced1c5632f4faeb35eeae751961241aaac69fa6e67236f195473ad59cb605e93cf593c06ccc7621ecf2a11a77a11df393cbe8b782b629538b87e19b7cf1afff74a1e3b35de41ab23f8de91fa2cdd94adc3889cab23b29490c812fe947d18613d8f15931b7d270c8b744ad503310ee7e93854117330b30ccc2e9a83533dc6e97caccd00430cc814f8efc076c22cef40df7b396f29348acfe6e8dfc2ef375709d180c5ef025dfc66a414bf79bcecb3278e8d581c2fd4c5315f8963f0cddac06265e95de6dfc3354d6483d1b7c2c4603d16838b7431988dd6474bfdf767f29c56c773e7414d6df420174685eccedf5e2dbebdb6d077592d559d2425cdf3db062ca617eb629a97625ac9d36dc2a4947c278cf60761da5f62a27da23ca18f577a56b611d3fe52f37cc23ec8163e9fb0b7c2c460131683cb74319868cc1f8f5b7a297030a6ffe5cdd583d3b53b99ae73fdbfab78ed5bcf3f68159fcfd32f7f0fc16275852e56239bda1ab13bf7e0711db04d99a86d1046cb43312dafc4ca582cd4b07521de9a49d4ea4b3f3d0ec3627a1536c283d72673b8cdd4f916c3463d8298378874a9e0fab13e25de539b11e3c7b4f6381c8bd9d5ba988d4e9a8632b7cce72dd855bc466c9e9c7e04a6e9353a4d67a6d4ee9ac37bfbc1a70febfd926bb5760c26932dafcd582cafd5c5726ad2f458e27b5cc99f63b9227cecd22d2f8ec4e2765d2a2d67acbc98e65b7c25cf27fab1d1f4ca8a74e3781416c7eb75719c9e92950669188cb655a0f10c9f8ee9e5c3a3b118dea08b6171c2b2b0cc773736d5b4b2146c1477a97bf45bb098dc18aeedc062c258d6f196ff6cde2ea8f575d936b13a068bd54dba582d44da0e0bb9d607f17ae680985c17b421a25f2b0f37a6c87ce36d95f85309c2c4fc582ce63763e3de3a4d96f21c562b4a9460366f396f973488d7598a84eb17a55b1b1c87c5e8165d8c7213b603e3d9a612aff4753f1ed3fd56ac9c08afbb6c6db0f2bf81cf2495f3d9b2c0ee9aab4c3f018bc96dba98e4a4dc1a97dacff2d838be6ce7267b378ce627629adf9e4a9b099bb54b361a179b17e873c949582cefc0d227ec588f4ca90d4d629aa72e3d19d3fc4ef3de77e23e76f38c1e9c82e97f17563e998c3d251fd509a3fba998ee77eb741fa5e81e5d3941ddef390dd3f39ef4c7d3e7f37aadc18a1ecfe958fcee4d650c0d96286a9ae8473b521b850e138333b018dca78bc112b4fc0953dea6b24a22932b29cec418dc9f4abf556fa5c97a7699eaf19c85c5ed0fbab8ed9a52dcf4230fa5fedfd1d4de96b9722b16e73f86b3696c95429037e39f36f0d82c52d661c038c9cf7f271e218b951a2d19c230381b63f0402ae39bf89aa7e4e39b996e419d83c5f441f3798c62af30546f29fa5698189c8bc5e04fa9d7922cccf0b3ce41fcb0fbcd9542e761f17b081bab48d45a611a567a6c3ca254b37a26eabbf96669dbf8ff2211b6827816f7c956352ee2a31b41aecf1de13fe2f37bf2dc42b91a222766e544f43e0b7d8daf11e359d6b4ee217a8a2126e1611f58eb165ef03326c260cbef896bf64d06a3edb522d6413dc44604e6f092a58af727d928fe7cde036d8c3b17128b856e0508bbab8b5df238c975c2ea0ade48a48d889194e59366d345bfbb98fe99a56a3791aa2d7259733d322e4d6b4aaec5232cb4967a1bea1347168e3be8740f04c8518b085bc2bcdc9bcb8b884a9e20cbf8d04c95ff4a60e8494354f7b8aa214ee002644d9a54dc5290bd75e2fa71330b9a6bf5a26b51d8c9f3da64b5c86329f12825ae3e71b8e68b76d55affb54d7eba056d2bd643abe4517101dfa251517c8f51e2ebcaf12df7f2bce8a296a0420f3630b022c30560f35b45813d4e09ac3507c65e2fe7ed1d17e0b01f09e7094a383d399c52dffb02bf25b251d853a310d01093195d0057db250aee494a70fde24ab125be77a6062bc766f316a89b25d9e9a3a3089fca6cbd39cdb7c14ade9471a7de6c04f5e6d394b8bac7e192b32c6c7d757d53ffdb0568b583a2d09ea184d6bba97c939991358d6bf9700e5bf859a7645217e05d34360aef594a78031364d060357bb517eca874b3a4fb6c5c14e473992de964d69dcf270cddc8b47d8746713d4f89ab731cae523edf2afbb82ec0baaf4314d60bf4d5022be1a2bd4ea62edbeab6944f8c069d2b17a0edd3230aed2f94d0fac759d862aec23a3e20272dcdcd52edb5ec28c417e9fb0e106270f496abd5c163c3a3e05ea204d743936597f0fe2913e85aa61dda3d8aede5cc560bb29c73a7b7f04d4706ab4d96225c9d8b4a7f74371c617c1c9a355966791bf9ac5c3d9757a98e4bb3c5e5d669fe5738ae9c1d37f8939dd2f85976d22688ce47ac3566a7302eacf3a3f681b3438dd16487285cb2536e3b64a7dcf9d4c5486deb6687aa39b2d31830ce4e7378263bed864176e89e66b651f72a3a3da79f56cb63d373affc7f3e7396c766cefec620b0135fd84f504bfd9db296ea2bca9760a2742d5f16824f292f67e76bab3a0c8cd321f63c235943e9b46917538775492582e9d4633778d14aff559b70e63b89f30180f3359b70163889f36d80f3759b70163a89f31780f30d9b70163989937d0048e27cd3269cc54ee29c0370be45bf7001c719bbdc2adf9b4407730b15cc2200f36d9b60163b083307c07cc72698450ec21c0d60be6b13cc4207610e0330dfb3092661054406730080f9be4d30f31d84d91bc0fcc02698131d84d90bc0fcd02698790ec2ec02607e6413ccc90ec29c0a60fec32698db3b08730a80f931fd6a2a1c26dcd83691b29539910ae51280f29f94287b099415629c5ddd3706f72411563d5954204ff1a2203fb1052461b54306f27800f25fd4ab12986736f9074bc5e8c931655e70220e19c45154100700889f524264a35ceb62668aa3737accd3063a783da9e07505f0fe4dbf2a2bb67a4976baca72ca91a1561122a4dd4035f3d9b6acb1a138d28aa60d95757e0bacf3f34cb424b18a26166521a55d92c13c02c0fc8f4d3009c7d2c9606e0630bfb00926e1882519ccc300cc2f6d8249d8cb2183793880f9954d3009472cc9601e02607e6d134cc2b1743298870298ffb5092661d7910ce62600f31b9b60bad8ce3c18c0fcd6269884239664308f0430bfb30926e1583a19cca300ccefa9073758a0ecdcae4008bbaa048bc7dd5b3d3402c0fb615bf6c46327225c9c20bb0aa0fc9112e5408172554ac31af0742cc28aa78c0aeb6c80f5a74c60adf53d31a0c19e99e0a05476d0eeef6b82621f3004f73325d6a10ad60abeda728607b71c255e974958189095ab7f0756fb4b26cad5d46a78179bf11301ca5f29510ed65451a97e519514ed0c2ab4e703b4ffa344dbd98bee3a6ce4bbb4d855f0f95ae6c5bd99f23280eeb76d9bc10351c1573409adf00c2a94f500a5d72283357c0d6fbc478fc8c7dba32eae7e5b096af8082556b60441ce9cc76e878ddd561b7c6f860ce4582a9003817db6a004197eef24e1241b59d3e82e80b3a54d3849775990e17c1ce06c6513ce0227717e027066d9849374469d0c676b5009b5b60967919338c7029c6d6cc259ec24cea50067db4cb43c93772d838ff3adf15f5c45dda0cfa1c2fa0f5086b6a3c41a6e75fb4427b7a4b60136dade26982e6e498d00981d6c82e9e296d45f4136ef68134c17b7a4fe0c6076b209a68b5b52bf04303bdb04d3c52da91f00985d6c82e9e2a0dcbb0066579b60ba38e3fe1680d9cd26982e6e49ed049a46dd6d82e9e296d4b600660f4a98e1b6a412563f64136d7301ca9e9428d9a9a9721a439ed5094f2c7575f3df10504af6a204d83d2140976780060184bd2911c6ef9f8c027475ff641700af0f75c5b2a10997eee05af56be964308750c1ec0d60f6cd442d8d2f325c1a53b9103679da51c1dc03c0ec67134cc2260f19ccdd01ccfe36c1241c5a2383b904c01c60134cc2a13532980b00cc8136c1249c8e2083b90cc01c64134cc2e90832984b01ccc136c1241c5a23833901c01c62134cc2a1353298db0198436d8249381d4106737b0073984d3009c783c860160098c33301135b78fd7bd8a6321ec01c61134cc20a880ce664007324f582ebc4a344d3bce023361bbcb80f79393062d41d801c45097288879db825bfbe23dde9bef7d51c2d43ced6b8139fe3da810aee42309e3e9a12ae6e3b55ea7009fb4664685f05763b867aa45d6ea7aaf3e0a7b25cdf56b50520cccec4c419bead0aee9b74f194a39d01cab1992845a33b7ce11e20794e210ed7c54da9ef00b8db65ba14d5af1c9ee1b1cfc4d5717b0ed093f6964aa8d0ee052aa8719958e39efaa0888b9dcf1381a58ea79ebb5cce6d2ed65e33501d91d9621180378112de8094b379c636a6b28f4692409d0d32788e8d50092b2432a8d301d45c4aa8e99d524c68a764a7147f08327fdeb65cc415db5c72f160ddfec03a276ecb71a65894a49b58c860ee0dec32df26982e9e52bc0f805960134c174f292e05300b6d82e962ff7d2f00b3c826982e9e523c17c02cb609a68ba714ef0a604eb209a68b2349b300cced6d82e9e229c57300ccc936c174f194e27d01cc1d6c82e9e229c5fb01983b52c2ec2460b280abbde020d340369b222603477650a907c04dd996bdf0d83122178f927801a0dcc9de7975d20c4e36f93b130c71ec6c335cc2aa880cee0c0077aacd70091b4d64707b00b82536c37571b94d0700779acd70093ba264708700b8d36d864b38644206b71f803bc366b884837b6470c703b8336d864b380c4d067724803bcb66b82e2e729c06e0ceb6192ee1d41e19dc0200778ebd8b735dacce6ef7a268e7666259995c0eb9c6f7cad6e6e307b310b66bc916ea66034b9d67c70248dd573908db06645fe5b81e58ea2ed44385ecdbec0dfc8b1c6cf978255f455acb5f21035744056e3400b7abbda5a78ba35b5920bbcfdf96ebf2dddf5a3b1658e9023b4a4eddd27142b42554686f066817da743c3ae9c020d986c62b01ce529b70e63b89f30f00e7229b70163889f3358073379b70927ee0990ce75700e7629b70163989b32f68302db10967b193388b01ce327b0e54251cc023ebb9ef07502eb56fa708e18033d94e917600e9327b768ab8b8b6f447500ded9e89ed8a790ad00c6c5724eba5e700787b50c2ebeaa927903065d9b0db225ecd54f9af91e1233b77a403c0b72725be9e28bedfc3f12ddd00c6bdec59b1e7e2b737ee0028f7a6ced06cd8977d9dbdd607076db394a3dde460abb11dc0b74f26beef861f2500054ef3ea7915b389b68e2ea3c2ba0860ddd79e0ceee257375e0728f7b377cac2c5658db701b4cbed394ac8c5dd73c500e50a3ba62c7493bd8468c9267b2f0268cb33dd1bc76783822960d25920b269e07f02a42b6d1a7a23ddd840d688ba0fe0acb00967be93385f02382b6dc259e024cecf01ce2a9b70163a89b33b18c9acb6096791933827009cab6cc259ec24ce0a807375a6d71eeb1b4b73c42b191b6b221bb6fb0d94a43536c325ec8c92c1bd04c0dddf66b8840d7e32b81702b807d854ca926e9f212b656f04386b6dc299ef24ce4701ce3536e12c7012e74700e75a9b70163a89d3034daa7536e12c7212e70880b3ce269cc54ee29c07701e68cf47c94917cc92cd35ed0a60d6db0493b0cd4906731680d9400973840666aabb38e04433a1c5de4205b904406e740132a1259341de09405eef0264c225136490f7069037b8009970048b0cf26e00f2412e40266c929141de1740de4809b99f7fc13c07ab4a6b39b219319f168a7ef56e9eff4ab92f9670b9640e15d0a15e14e8267bb63610da26d9d68652609b0753a2ece85f94fbb167bbe7d7790b781f2bb03fc27df3749bbb81051e628f0512ce5091596015b0c043b7e5a2b38c8dea93f5b0aa81551e66df3e25c2ad5f64fb94fa00eb3cdc9e7d4a2e1edbfe5f609d4750ef15493cd0b789ff45dac3ff9a0a631eb0c8cd9418877aeaa94cebbd8d5e9835d02e9e3e7a2bb0d2233361a5587524634a8af13a2a8cc7018c47d9b3e1c1c541e86b01caa3a92d32da445fe4c1af24cfe457753cb31fe40b24c338840a635f80718b9d3b9b08333ad9cea69d00d66328b1b6f72f36340d5f6460d32cd9145d1b80ec58eab2511d0f9acf9be6bf9791a06100e571f6ec5872f1b37e2500e5f1993846a050a9b75d3e46e02400ef04bbbec04dd8e4213bf06f03c079a24d6b4248cfaf21ab70ee01384fb20967be93389f00384fb609678193383f05384fb10967a19338db83f1a1536dc259e424ceed00ced36cc259ec24ce3d00ced3ed9938236c24914d9ced0c509e61cfd4848bdfed2c0428cfa444c95accd11eb9bb4318ad419d7d963d1f3a2da0fc840999f53500985b6d82e9e23046238079b64d3009570791c1ac0330cfb10926e1474ac8601e08609e6b134c17cf575a0b609e67134c174f905d07609e6f134c1797b9d4029817d80493b08f4306730d8079a14d305dece5ac07302fb20926e1b25532981b01cc8bed58cd46588f93ad669b087ade975062ec950463a07a319f9524ac76b2a840ee09405e4a09929d551d7b12f734b066c8dda3cc3b810c7d99bde7cabaf875e18700dacb29d10ed3a0654a3472786bbd5d7c97ed2dfbbd7d20af05007c853dcb605c1cf29802505e99c9e5d5153cabaf15e5e71caf9e6779d5563364a9649316934135751525de010a5eb6fa8d895aeb5f6ffa9d417d10d8ecd5761c363dc38bff3e2661fbb4840aed9d00ed35762dec22c44956511d0d705e9b89e6beccfe35bfb32cbf232847afa304395a01b952d326fd7def085a06505f6fdfae4ac262806c57650b80f4067b962eb838abd411a0bc3113cbb6272a4033b06c9bac76cf05d5d14dd4f058a0ac760f84b0ab4a3074e2de1a909100decdf66cf123ec746ea142f90840790b25ca6ca5365fd5d4cd6c08d19477fdfcae5d409979ebb61f749ee8157ba45b53cfa502390880bccd169084164906f2afa000b8dddec167c2c50d64cdf73f01b477d83138a2fb121761b545f625aecb01da3bed197676713a793a4079974ddb0c48c799c8daa6d7009c77db8433df499c7f0438efb10927e9e245329c6f029cf7da84b3d0499c5f039cf7d984b3c8499c8341a3fe7e9b70163b89730780f30ff6ec7823dc284336e9510650fe911265674f5de3c494658df585bc47e4deeaa6cea08c7c2013c3c42ce06a6e8352f65ae1c5bdc67904c07bd0be1920c2690bb219a0ae202bff69db8f1cc952d1bd32f159609b0fd902d2c519f53f03900fdb029270c08d0ce42b00e49f6d0149d8722403f92200f9882d20092b1b3290df03908fda02d2c5af057c03403e660b48c25dea64200782e6cfe3b68074b14bf803b0c8276c01e9e267187281453e690b48c25d9664208703904fd9b3b6cdc54dfedf81ccfdb43d1b56498775c9609e00603e63134c174f4c3815c07cd626982e9e98700c80f99c4d305d3c31e15800f3797b56651266f22d54281f06285fa0443948a06cf4567b6c7d7098754384199e6cdd501e00fb174ab023bdd8e5aec1b72bd8e2eb44e3eaf2a87ce66f9aaf490d2de6115463ecff03985fb4f38b17840d29b22f5ecc07585fca045669bd8d7ca705fb5043a3aff64c6dbfc9dd032c16837ed3cbf62c2674b10d900f2cf4aff62e7925444b56755d00d0be427dec4ff47337f36376afbbff31a63e00e3df32598632a0cbfc87b53e91aa842d56173f00ba3b2843ff9ee9850af8eea15a2e8834c3175121fd37b0d457a9cf558a66f805fe7ff697fb59bd2700f81a7589c93cb30a06fbea7999ff7ba37f870ce3282a8c8301c6d733b180ab48c9e019d8e74bb6e1ef6400ef8d4c8c30c126fbcadfd94299bb01cc37ed685db24a463d6d86707ebd840aed2a507fbf65d3d2eb8994eb3ec8965edf042cf56d9b70e63b89f33180f31d9b70929e074f86f36380f35d9b70163a89b315283bdfb30967919338c7009cefdb84b3d8499cf301ce0f2871b27df4e57c08a3c6ef4ec2feb77b7def31a084fc3013a344c95b9a2c1ad10f26930e69907d34f95f00eb47993d2a3ada1377f9a8e88e00e03fecd9d2e7e2668105a05cfc9812254b33966dd90b33b83536f2a1b55a5ed71161233bd4a425b0c07fda63812eaed75c0e2cf0133b3ee440382a44f62187bf008bfc5726c627f3fcff6bc42839bbcec0f824d9f14f0701789f52c26befb1d661063fd740d6a06e0b90fd7b5bae57cfd061782751ad12aa04e5df67d49bead92c76308f2ddb842ef74fb2810d7e6eefa96d84fb7ac81a384f03b4ffb16735908b9f979d0a507e91c9d5960dc2022bfc87f9a12cd6c563c2af0398bfa4eec9c4f6aa5dee4bb707d8becae44aa05abee6b7b1e9140d3cd3bbb8a7e27d80f56bbbbe5be1e20796f60438ff4b89b3ab075701cde62390eeaf01ea05f07d43896f88a6a1840fe4aa6049b33a19dca700dc6f6d864b38564e06777bd03bface9e813617d70d4d0228bfb7ef142d42a464a768bd07b2fe0ff6ec35273c9183acc1340a58e78fd4c3207299ea02d106653bcddc5d9ada0f58e14ff6ecdfcd77b2b75e0560fe6c134c1733750d80f98b4d305dfc326a0580f9ab4d305dfc6c572580f93f9b60ba78b4493980f99b4d305d3cda642580c9d6195803d3c561b8e50066c426982e6e6b5e0160b6b00926e1b2173298fb03982d6d82e9e2d77b0e00305b51c21ce1c54e6204a7aaaff4d8f2e8d8556d8917511396a5642b3ede0090b3320919ce63fede67312f05905b53420e777c14614f7e0b15cae700ca369428cd568710f69ec8acf44980b6adbd6809db056468ff03d0b6a344cbe604639731443f861c7c65659a17ddc6e2dec2861e00647b4a903dbce882d80a2f76657b8616c69259e33800b10325441683e8bc3b3c01ce3d68ad00b48e94d0e452ec7ca58c74d9e20a01bc4e99ae5a523fdd80b0ff5e4285f61680b63325daf0a71bb8d81fba02e0ec62134ed2a13a329cf7039c5d6dc259e024cebf019cdd6cc259e824ce2f00ceee36e1243d729c0c674fb0daa3874d388b9dc4990f70f6b409e724277156039cbda8fbe089c6e663171dbab7e4700628357bdb02d2c5b59b3b00907d6c01e9e27907bb01907d6d01e9e2c711e70190fd6c01e9e2c711570190fd6d01e9e2c711170390036c01e9e2c7114f032007da02d2c58f23ae06200751821cedc5ce98aff4e227c3529f36236c69920d1b978326fb604ad4e96d6e216c2a916d6e6909900ea1449aa758ef7ad436f14f33c58fd167e85c10b233b31701fc4333b1402cd53e3de1ac3a598ffe3c50120fb30926e16a3b3298970198c36d82e9e258d3e900e6089b6012b602c8609e01608eb40926610f9f0ce69900e6289b601236a6c8609e05608eb60926614f9f0ce65600738c4d305d3c19fb6c0033db2698843d7e3298e70098636d8249380e4506f35c00733beac5876bf963764271add367228e02d0c66dcb0d04501c693543b6abe8278072bc3d7b31082b992d54289f012827500f2933cfec748f7962509995806cef5069d3d7a7cb3c57cffae80f40e6508264c7a4c46e0f28e33bdd4ab97cc243d0c846e3870374b9f66467c2e134b2ecfc32409967effe1f1737005e0dd04ecc849562936fb1f5b78b27294c0228f329510e12281b7d0bacf11a42d9282158321b5d08c016d80a9670c88d0cec2e006ca1ad605d9c1e9e09c016d90ad6c5ea6a4700b6d88eed5a657cda975569d5a24f4f5acacea0427b31403bc99e96808b87ad4c0328b7b7697d3ce9279bc806e6ee053827db8493f42820329ccf039c3bd884b3c0499c9f019c3bda84b3d0499c9dc13aa42936e12c7212e7388073279b70163b897305c7d9264b113e3b4e7830a7c3a21b1c6a12347572bc395e951814aef19fe478f379b3bdd15be1d7cd7bfbffc2a5c1befe3fddfd083fab6196b7d1abe37799bc4a2e7b8dff34382b248fade2dd9999c4106112d991445fcdcc4e706846f066f44b730b7822071fcd654fd9873ae43079f4eb35d9fcfb745062ec13dd97ebb2f92733d86c59059f3b2b8d19332ee586b749e8837d35279011fb749e46bbd4be67abf3374dab79fc18b70c353800279ba71a1622ee473d48279b7f7b325148f0a89d6ccdd13c6aa8c9fc273aca27e0134de5055ef01147f58311d9297d0c259b67e4a8afc53c63320b5ddfa44ffc3b3d63de99ef95f31cc1a6693621bea1edb1e7d5fedfb55aad931df09e1d7292289b9ff023fdc3c17b9d5f287b06efd8d77bc182e4681ab230eb389fec4877e07fbed056efb3670a92a37a744b2837eaaf5f4c49109420b8def2c3dbd9bcd3a8bea7d35fbec10ae908d78a957a8cf502ff2ee35ec953bf5ccc2fb134cd651f1e8f14fbbf82c1939ca661931cb1d07b8db892f793cb64a57262695359d11bd1d7c6b5cd569f248b515005b2f7abbd726e910dfc6eb298268f1f5e37754c902ab9ec238bbfebf897b07417c9cecdb40faf5897f2422528984a7dcf955c29f693f5ff007a6e9b04e2010300 serializedProgramBytesString: - serializedSignature: e9c35a633f338f66c087875a2c660ddaeb1bd1621c99938798b1d44e30e7feda5c4e9f2d7ffb79694bddc2882dbd89948effaa60676832e5c9bb6602b4e9950d + serializedSignature: 30e1db0038b44f8ca9ca9718dd0a9ad94f79123d191d224e5243001e85498ccbcaa9e7c698bb8fa90d39ae8381122a09ea7536182e2946da7739efa995d81f0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset b/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset index 83d4484..6c091ba 100644 --- a/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset +++ b/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59eb72db44143e722c5f9a04534a9a941668cba5665a2ab7650ad37f6d5a20d03699d8ce9f0ed3b889130cb6e3b11d26bc02afc01f5e83f7e11df809df39bb8a656925c56e3685b4d2582bede5ec39dfb9ecd975c6235cce0d3c36689d96e926d5699bf6a88bb765941ddceacbaf5fa33eca5d3c1b68bb41975346f275cd59c273055f031a62e43e6da16c497b959a785fc1d826beb87607bf267a39590caad3435aa5a7b4e82ca490d89041035de7b05c4e01cf07f42b5a9bc2144fe249d3221e55b40ca4ad03a6fd7ecfe80711ab83b62d8ce9531b345f08c5c21f3c56649222a7cbac2e0bbaae18f8e6b6aff073f1dbd4f5795dba81be19fd5ed0ef41baaea67b26a1ef589deb087adf429e06f5c8934e9f4da0667f64ba8299742ea33081a679da21a0ec818001e5bae8704877e8b611e50bce5c80ef657936d0a3254467a353fc199982996be36e064c6480fa6fc4c2d8485a68b9498f51f2a84dba05a53f0b51d9c0b46d9859936a78f684de26d88ef64c1389cd293c661d3495b57750e303dac3775b38accaf317e1b429dcafa06e28bed785f73d407920b34565efe3dd34674d4366e6d16cf471f5cab57c353d8434ccbd37c366f64623af42230c7d6e56bb61d693c8f15b44136f305441c695c544d1b8a5c2f958dd6df2f8d3598f2038b98c5109cdf6adf0be4b5f24ca624686d57d5124186978e9cbbf7eaffc3d7fcf1d17ed0e79b26c5d4a112d0958a65776ce4728248be0bad90a331a86df31c12f4b64f504e157fd5ad26f7205e464651a5780a42c35bc1ce0d746e7353c1b18ded6718e97b7a174e78c2aa2a74a4ea70a65c3429ac66e1cd81913d88593063b3dba24815d38946b04365f66048b3108a6f11087e08c01c14a5e6767111b10be8a21beb8770cf5ac493f9223fe6c553f75d4a924eb91b4b664651ed1dc936f9ecd4f909346b0969e48c2bd2fbc24eb73f650e611709ee4babc3fb1cbd99c4eade5cabb66139a1713b2cf4c9cc9b926a3987d350bd4742efb16f85c3cb2cb9612d797491d366772588e216f1be2c83fb822fe5a8cf7d7bc8938abe66c9cc461e2a578e20593ded9629dda09ea9ddbf6844a037d27d7fd3be0f57a1809b3e2cf89e29722c2a5b310a7fc625cb47ed714adef91bf45ae6257f33de66d609e269c782840b6a454f03dc7bd823735bc0527e69a20dfabe0eb2752bb9e70dbb84493ac1067e2245a3049f44908cbfb40ac2f59889260979ac2dd63095bbb78ff31c2ebc8edcc7ce6713b0e1bfd23e9d9c7d83548d792af01791c3f9d0a1dfdf88167ef003d46a8066e5f0852e987111c32e20e2376225635edbe344d0a85178fdf91c30b7faf63922e5da6f83d785e4be4d302d21c674f9da49cbbe5f4b11b653c0e98cef529ad299d0b8e3eb919b30d4d9e872b024fe5b414047855f05d2eba1dd8d3313c75d6606431cdfab910f0b770c7702ac7a6761f706d4b441fe056f952de0d11fffad86c6fbaed59d44b4a12970e2439eb0bbdedb0d77022f09fe3fc42d0eacb47b49c51283687d00a87e2f75ef32859e12879914128fa41a5c25672c9a6e733e8bcb056028b6ebc1eb9675f7a85f87899639be25854281d45c86922832b914141fabe4d48e735a43cf10eba3c3fa4cdd99835e05c5bc05100b80f6c02775e03b7a59d79184af882ccb3c55a83b2680bca5c00ca0f6d42794543a972ddae58a172dc7d945dfa4eff3772da00ce0400be6c13605ecbb6c60e4afd266ba0e56d81361300ed8a4dd04ab191b1fbbf05cf098077d52678ec33bdd0ca3cb007d8bc2dc0b201c03eb209d842ca727242b1ce5a42930f00f9b14d20170d8b49fca1915530cfd902b340a766df58e17d231fb01d6ea6ca09cb553926b0a82ddb592d7f17a39f48fed0c07c8ace68fbe67137e72e4d76f6914c337d6ff5290576a221bdb58f4d6fc7b15f3449fa327bc7b904ad787cae7daae5bf4663ff8de5dd4531ef3a34af883769159db78529bedc7f01149b60bc51280000 serializedProgramBytesString: - serializedSignature: 527e859afb8742d29852be4fbf09c0c602629fda4debcda87fd239deec5368cc164ca9e02fe8d0f87d7b0224d1623805838957221e37b7442b600fd36bdee002 + serializedSignature: 048dd0aa54bf81bdfbacda073c0994acd633a69945490afed7f817be0361c774f43edaa5bcc0727d056919aa900934bb18cfda3703d4d47970cf6b348636de02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset b/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset index 0efa5b7..9a493ab 100644 --- a/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset +++ b/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd52d35010de539a962288a880281778258e480238dccb8f8a83c000e58671a040c13a6dedb4c1c1199fc037f2317c0e1f42bfdd9c40484e1afe0a88249393e4fcecf9f6db3d7b366dca261c6a04c51a2dd3348d529e76e80b55f1348d7b05a7f7e6d72f511df73d9405b48dd050c2483e9ea94728e7f0d6201723f7691bf792b4af5011cf73185bc41bd7eee22aa2974a63509e66689116a85ff526885893410d5da7582fd58e728abea1b528a078125b9afa51aca0a5216d1580f6fbadd34751ab82b66d8ca9531932b744623b33a54427b9b5e93b23cde0b2f47b0a578efbf3b3a5449377905da01ad9dca89e9f82727f6432d92c3a93f2f081759ed6855a350830689c173e5d9aa071a3c603aa33807b5aca027a944468263ac5cfc8140cae8cb318305703f56fc5da6cb0125a46691e771eb5496330c07a48ca1aa62dc3e4455a455913799b801ded99a4129b363c6619323dcfaba0c627b486f7b2205c91f2ab202d0afa39d4b9b20eaa580953b81fc86c51ddeb7836cdb9aa293363343b605cbde7e6be9966a00da3b7c5376f2d72151661ea3319bd0cd336af11f52362895b0ebd20634960f7648c79a1f558dd38d9125797230c9e5ec7a88666fff6f89ea4574d753133c3e67e221a1c5938f77bebbb3b58ff651d576d826c76133598a05a336259deb0ea8b4868ae8265a51d061aa65f99e8cf72e5ca25d2eff52b49bfd31bc0db998e1b4075e0755560b818b62de26b788e58c4e1e1592135ba6526018ba33565a2b5fdb2694d8e23cd686d3fd4eb88563ecc0ce662184cc210c7609b81418721751860fdc161e542b018518cf0b44938fbc01d932bf5892b7d920d724897055cae76af21319c8b1e9c718e520449361e891587a4d384c4910cb9aa33b2597180926ce333b8b6d0690ff36fe09c97a49d9f82e658449fcf3a1508b7ad614409f8cde8b33895627a66c59c758c5c9211fcd6209bd9167c27cd7279ee0af0707ab20a15b7c4dd9373deae2639efee85a53f495a784ecde3772547f6b7549376c93ac5a77a59ad912f0b4cf302b8719ade65abea2f2d4ad9ec68eac519bd29194537cfd676d2efa6a44dc013b0201fc8a19de743203024ce135c9da6795e8a003f37b880cf3d76aed740b623f1be81930f5eea21e16f5af45971d27d3fba2eba25121d001ed7b2bc9df03ae1087aed90df0bfaf970acaf1c855b73987438dcf6fce791d061f6ee3309961f381ca6ec412b57372703bc756e6b02ddd0361a14b7414e78fef364feb963eb3f7b12e5ce1203d212033c2a1fb692ca2e4d254fbc8b2e1b87b24bd1707971c459ad228e02c4f55ea50f06c1b7d40773ada2b22d40655f2ba97caaa9f4f2d8aa78615d02f13eee557aaf7f5ebb6904a70204f7b792e0eed8455ed55dfebd08a96e4e96e47096c4ffd6f83f5fead4a347eb5285442f3129606c41ee476988cd215c4dd2e9f2f4e632937384010ae450211b94af55de63d2f43c39506713abd8fc0975a3f57f1c76d37ec990f3b0bc27bc884fa8bafce957973ed65f5227b614f01c0000 serializedProgramBytesString: - serializedSignature: bfa0e4d6666679f14b8e6749ff7c6ff3c32463bcea97334c452ca57762c7ee2c13e4a5f4eeef80cf0e6bc0f85b2191c0019b94d97a174cda8f69ef95b4362509 + serializedSignature: 25f39985422926a853cd5d02f264c32b6266079d83faa44ac472c5e0f33ef130e0c4da84d5059d590433d6a8f5f25ea2d540b8a9e35c4b8b7baf81d9143fc30e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset b/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset index 770e5f6..95b4c40 100644 --- a/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset +++ b/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c16c5f3f0f741426f2208026a5094202521a10b082434a5090151444a1202924024547befbdf7de7bc1865d51b1f7deb0f7eecf5ededbbddd3c739b9d2777cfdd3cd9e3ffc227b9dcdddedcce776767fb5e835ce6fc4bf4727ecd60535921ebc3a6b352b6942d71fe2a748e95ce7ff74c5d9fc29639c772e7f73ce75e2f965dc793fc5ff74447e7f778e7ac9a2d779e5cc14a9ce322717f1a2b73fe1eef3c5be69cf1ab0b9c9f322754a2a1f3d07456c426b349ac43a27d1d22668887aae5b504d72bd1c4f93d8aad71ee968948f197e48a5b1d9c5fd39c3bd5e25ea51369156e169b2dd4aa74ee9538cf2c63158eccf94262930da399f883b987aef2b89d3c663b3f4de5df9bc9bf9bc8bf61787e9d6bb7778ab0db83b04a6637e727cbf9f95d9eefe09e376827cf7774cf13ed3419cd808ceef298238f3de47127e7a791f3e72d3ee24f71afa78c7b9e16f7e63e993693c75e75844f25a3b93cf60e21a3859bb60d06f948db16e03d7d64da3661495be2c7eb4198ebe5b1a14cab5bb5eb59f2fa6ddaf546c8f5c6c8f526daf55c79bc01c4e506ed991be533b78373279e0dfb69326e92e1ee007186f2d4fdb5da7337cbeb77029de0733723cfdda23dd7587bee16e4b95bb5e79a68cfddaa3da7aef700e7fcfe5dae8e0dfe96d7f3dcf3867353d8879ffc922f8fb7cbf7dc0dcef9f13679fd1e70ced363bd7cff2ff27a813cdea1c9b923b59cac8e29e2d89f79fd525f8ded5acd56d64a9973dde7b2ce65493be7c73b65f87b3579776af2d679e535526933501e9f93e1ee93e703b478a9fb6bb5fb3dc07be17d95066fc9ebf783737e7c1579df20edbefe3e559e1468f7076be1de96f71fd0ce1f4c91362d359def92cf3c04ce1d768d7fa883dd903ad8a9fb51b153f23076ea3ec66e672d5c3aec94aeefb0a41f5436aa6cf25e29e76110565de7c72799d7f69f74653455369fa5c9bb5b867f049c43b9ef6af7df95c7f7401c15ebf7c1b5f7c0357e7c5eca79149cf3784d90e7cadfaa78dda7bd57a5938a97b287c7c039f437ea7debb5f755a5e0af64f700e7c0c7365169313420cbe10656bb806b23e57104b8a664df03ae411b68ea86c93d545e1b268feb40f87b4078750fdaeca880eca11e8a33d4a3d0a087927dbf418f0752e8f120087f3f08afee413d8ae4b1b126ff214d0fe583a01ea37deaa1643f6cd0e391147a3c0ac23f0cc2ab7b508f31f2d84493ff98a687b2f974f450b2d71bf4783c851e4f80f0eb4178750feaa1ea64ca17dd0dce9d3cd4b2a3166e03f396bf1b98371f2a39eb34391b91747f4ae3a5df7f5abbffb43c3ea3c5e3192d1ecfcafb4a6fbdeea9fba4a7c073f0fe13daf3ca57dd0dce1dfd5a8dd0c2bda0c5ef05791ca4c959e795d35aa5b96e572f6a1cf4fb2f69f75f92c797b578bcac717a05e1a4eeabb2f531100ff51cbcaf38e965e06bcc5b06bea6c97f9d25fdb6e97975ff49793e1609f786f69e37b4f7bca9e9a99e1bc79279e54d791ccf6af2566b55574fb76ebe9b3c6e645ebbd9288f1f306f9dfa0357b73673ddf7b739555e5765ef879a9c0feb90a3f2b9298e1399b76ebe2bf3e6918f98b77ef29194f9b7fbdce6ca56545a7cccbcb6b62bb80ee5adf3ca6b3b459eabfae51fcc5bdf9ba4c54bdd5fabddef01de0befab34f89379eb977fcae35fc8fb0669f7f5f7a9fae504edfe642ddcdfcc5bbf54e741eae69f306fddfc1397dd1627d6c16e8a264767a7ee47c54ec9c3d8a9fb18bbddb570e9b09b0a74e1c76296cce34a9fe9e09aca5b33584dbe2fe826af4d93c74f41f84fe5710f79fc4cc669033877d2a69deabf32c571a63caabaa38aebe7ccebc73f97c7bd0cef9f05ae8d94c7bdc13525fb0b704dbde7cba4ae790fcb6b7bcae35720fc1720bcba07d36bb63c36d2e47fade9f1b54f3d543d08eaa1647f63d0e3db147a7c07c27f03c2ab7b508f7de4b1b126ff7b4d8fef43e8a164ff60d0e3c7147afc04c2ff00c2ab7b508f39f2d84493ffb3a6c7cf21f450b27f31e8f1bf147afc0ac2ff02c2ab7b508f869adcdf98b77cff8d79fdd6efcc5bbeebcfabfbaa1e3157bb3fcfc0617e52978e4a5ebaf500f57ca93cfe23e3f3143877c2742c4d21ab441e952fff9779cbe77fa58c0b659c5fd5defd1ff396cf25e03a94b7ce2b6f2be5d7641993507dcecae79781eb406e623319ee69ed5cf9ee56f23a93d79f01e7fcbd6bbde158b93c2e90e19fd5ee2fd4dea3df5f24afabfe071fe56e4ddc3678e3d649950ffb6a2c17276da6f38bf2b856932d6d3691d064cbb4ea74a80c57a1c9ae4ccaee3613912dcbdd44034d7603295bf5092dd1642f4dcace6ea7c9c6d2bdcafb6e34fd9faf23fdd558c533e0bc21787f26d35fe5572dadc4b9a99db258beb311f3fa27653f8d598d5f49340661f9518daddc0ece1db9dbaa764896f68e66cce3c313cd34b9cdb5fb720c2b01c60d13ead842632ec7aababce9be776b55775169df4a4bfbfdc07518c7cd9937cfabf3075db9dbaa712a95f62db578b4940c54fd689997674d3ae8b6a9c74f3dd743bbbf56bbafeaa98bbdf715d39ae75b6be9af9edf4ebbafcbafd6ec43c957e9d08679ead5e21c72d3f559aedd57ef537524950e6d355b68abd9ca16ccdbae57f25768f795fc95de70625c19d6cb83e6d176c87d3d8fea7ab5d7f46aafe9b5a557af1ace5b7ae5d64a5f35fe29fb8fbb28ff8ef90155cf88c2872c9571e8c0cc3ea4234be6df8e202c3f6ec5bc3e642b576eb72e524696f68ece1abfce9adc2eda7d2927d109c4a1933c6ecdbc79776bf7dd5dbbb8efed2a6db5268f6eabd9f47ee03a8ce376cceb43d4b9f421dbabbaa3f221db68f1d8c68dc7f617ca70abbc3c511fa2c74f3dd743bbbf56bbaf7cc852ef7dc5b4e6f96c2dfdd5f3db69f775f9ca8774d0e4ab74e8cabc3ea4abc64dd767b9765ff7212a1db6d76c617bcd56ba31af0f51f25768f7751f22c3257660e17cc80ec87dcc8728bd76d4f4da51d3abbb57af1aceddbd726ba56f4790bebc1eb510d81bb50fa99471c861661fd28325f36f0f10961fd57c9fdbc1b9233767ae9491a5bda397c6af9726b7b776bfb73cf60471e8298f7d9837eff671dfbdc35cf7bd3ba8fe4c9547f3349bde0f5c87715463be4f6be7d287e4a83cab7c48ae168f5c371edd37ca70abbd3c511fa2c74f3dd743bbbf56bbafe253e9bdaf98d63cafc6ceefd29edf4ebbafcb573e244793afd2219f797d48bec64dd767b9765ff7212a1dfa69b6d04fb395fecceb4394fc15da7ddd87c87089012c9c0f1980dcc77c88d26ba0a6974a7fa5d720af5e359c0779e5d64adf1e207d793bef46606fe9fa10adef21319879fa1ec439cfef1b53c85ac33cf69f18c2bc3e63882ba3474737de3da678df9dd89979fb1ed680eb50de3a4d9e1abf547c876af65806ae43b9c39837ffab733f7dee98af55bac3b1dc86da7b77611eff2bc2aaebfc3842e336c29591abc6c5b33479a3343b1ba5c92dd4eecbfebac44810c7c69accd1da33a33599455edbadb19ba1499989222ff7c418f9cc0be0dcd1abe7086f7835f68d86af02f187cfedcfbcf954e547a5d3584da7b19a4e2afd1ff3ca6707c8f3719a7d1e288fcacf8df7da823857cff1a31a375907ce1d7d7a9de80d57d33fb39b0cff2238e747351e729b16bf095a3c5ff25e17e19a7a9f513a085da10f55baf500e7d0cef5e78b423e3f36e4f3c3423e3f3cd8f335ef7bae8ef08fd7f1be47d27c7e58c8e7c7867cbe28e4f323bdcfab3c5853c6293eb28ceba1e6b08729e3946f9ec492f940e5fdc952cedde0dcc99b7943b5709398c70724b471e5c414cdce4680ebfc3851de7f59933b5193ff92ab77dede5e3935efd1e4a8e7d92e9a9c57b4fbc380ee41e7aacfd238eecebce5d4ee92d9ef6edcfbaafaf65ef2fe542f3b252f315593b7ce2bafef42af1c3156944a07f5be622d4d8b5d79f90f6be16668693a43633d5db3b1bdc1757e9ca6a5a98a672eb80fce85de3cfcabe01ccadb43e3ba878cf73ddef035f19be9b53925a746ee9e5afcf702cfc1f8e9e15f75d3317fa3576f8f5ed006959cbad227958dc9f1f2041c7354ef83638eaa4e552cefedcdbc75aa59e03a3fced698ce7665f45363d7599abc39cceb9fe66872e76af7e7cae33c1047959ef393d7c47d758d1ff791721e05e73c5e674a198db4789568ef2dd1e255cabc7518355638437bdf7aed7d3a37c53f2bc928a1db9db263e9a30b26806779b86921ece0209926aacdabfa70cb98b70d5ee6c67f80b2cd83e5f505e0ddf2597618b027584f54f70f07cf9aee1f218f8720f78f94c74391fb47316f9d41f5ab961be27a34086392758c262b15cb63e5711bf09ee35cbe23528d25abe78f97c76dc1f3b23f36b1504b8f85323de4fcaf816d52c85772557ff26bdaf513e451f521bf2ecf4fd4e27e92f6dcc9acc67607a9756ba768614e4d8619acf2da695a98d393617813545c3b430b736632cc505557384b0b737632cc70352f2215ef9325cb7da5de6f80737eff1c79aefa1fde04e7fca8c6a99e01e74e9a0c5eed0dc7ce95e1d41a8af334f9159a7c39d69ca8d4e4576af255b82532dcdb5afc9678df5b135ef58dbfa38557d7dfd5c257c9ebef69e1d575b55621156b397732b14c63adc6bace97e7fb692c549f62b5c6a2da6531e4136fb81ad61f68ac95fce59a7cd5a65ca1c95fa1c957e156ca701bb5f8adf4beb726fc2a79fd432dbcbafe91167eb5bcfeb1165e5dffc407ebd3e533aa9dfe0638e7f72f90e76b3416aafd7e80c6e20097c5d06c6fb81ad66a8ece799afc0335f9aa4d729026ff204dbe0a77b00cf79916bf83bdefad09afca8bcfb5f0eabaaa83a462277d54e2308ddd61f2be1cc74a1caae976a83c1eaee976b8abdbb06fbce16ad87da9b153f28fd0e4cb323171a426ff484dbe0aa7cac0afb4f81de57d6f4df8a3e5f5afb5f0eaba2e5f958bdf6ae1d5f5efb4f0c7caebdf6be1d5f51fb4f0c7c9eb3f6ae1d5f59f7ca4e5d9f29913b4b454e5dd45f2fc788db52c4f12276aac4f74598f18e70d5793966a1edf799afc9334f9b21c4d9cacc93f5993afc29d22c3fda2c5ef14ef7b6bc29f2aafff4f0bafaeffaa853f4d5eff4d0bafaeffae853f5d5eff430bafaeffa9853f435eff4b0bafaeffad853f535eff470bafaeffab853f4b5eff4f0b2faff3e9569ef067cbeb092dbcbadec0876da97ad9395a1a9e23d390c795d79dae4d21eb62f9ccb92c59df93eb0d13e7816bdbc86be76bef3adf7dd7c84fbce16ac25f0d645cc2bcf55815f65219f622a9fb66e09c1f2f96d71b82733dcefa7baf01f72e43de7bb90c7badf65ec92b7161524642f944c024a1d6656e2ecf2f907254fbb23d781632bbd065366aae371cbba20e0e7a7cb88c53c1bbb98c4e485cdacaf00f7b6d87c979430d1ab9b652b8509377959606595a1ac8346da0c614ae04d7f9f152edb94bb570326d1a3401e7fc78b9bcaeb7412e07f185d7af006ca4ef4b5c09ae5de9ea5f78add453ad5b6867087b05b8c6dfa5f68fd85a5ebf8a79fb9aae72651775f3c6496fd33468eebebb68a8164eb6891ab490e7a9f27c7bef31715d32deec6ae6b57315f61a19f606cdaee4be0489eb99377fa97d1bc01c1f26b9f96a43cab62ebb4eca93fb3f346809ce9d778d5eeb0d279ed3dac609b5e7c333e0dcf06ce2e6dacfd6b4abaf6369b4abb31262feea3856c6e6b12a962b1c32ef0df1bb1d8e7ab2ee8d70c4dc5c514230be230e7fed72b6c679b4ccb41bcd74b1d7cd7256c0f28dbbd16c25e66eaab7178adff39c108b84d0560d6abde2de5aafe091ab70fe9781ad74aa9deb63c54e3c7c339d45ce9d3e6c8273e44fcd657dd92ce7bf57ca0ce7b5156c857356ecfcae12f2e63ad1ae1db22e95f8b63bfa33531d99eeae4095ce1505b4ca39af10319c267eaf14312d13b11fef5c5b2ef6285ac2cad928e7b85abcadb6eecb9cbf4def2c96c8cc71346f0e845d77b72052c954e468c3639f2bf2d2ff4f91fa4811314dbc95cc870d7385373cbe564afc7f86ae93e105fa7829a3af4096f05ccb67b9a2cc9f5a8b60701d6b6b68b66f97f700d62fa52e66323cb93b0b0d92297cd59e0f8cdbab79b39e595ed50a58aea87e74a943b55460b9bc1c310b39880a59590df3784475fc09137e51259b9641fc6eb845225cf00468240a3f6f028869eac5ce1fab9d9f0a27f048e772a9f07f856ca1136c89f07e15ac560ae571718d05e4da45685d11c5303730611635d7e27ab1726c43bad4a09bd46891049d2bea4e1d539823f62e51616a206b4d2ac3bc39b1dfc09df3065f96654e9766225dd2791b96329b9952a659a63340dd1e3f55ba34afd12b992efc9f99610bc4b6eb8a0346b0a18960f3fab16d1ef7f46c9b37317a6b0ccdfc5aa5b4c15431c0086699088a36ddf40c129cecc4705f594f4c8f616bdf0cdb08865bd5d2ce4f1c308a8d0c14f338c5cd4dd16aaa458bc70811dc1813dc36a4e02698e02d420a6e6a32a89699ce92fcde52218517b7c1cd89f7b0f4d4dd9ad99eda2379b2ee2860d6d4cc94361ce196c658e989d31e4f9ce698e40e6125b7c024770c2bb9a5c9a0c40cf7ccd7d2d32b23b9afe9e0bb8cecc45255b2839690ad4cf4b8b314138fe8e8d5ee3c527f8d729ee5b5e095a246bcc279ded4d9949a6867dfdebe8ba099cd4c5d60c16284116e6db27c8e7d6b2cd975e3ef841b7f1b93705e28f0e1805a0d0fa3f4c6b8f4cd4dc6215e99d91698dba8e17282672ede1fbd6d2dca87ee6236876c8635ae52c7014bfcb698dbeb1ad6ed6d8149de2eace47698e4edc34a6e6f92ccf34737537ed50577c1056f89e5b11d22c8631d301e3b86e5d11193dc3dace4ad4c395764e70ad29c3bddb9e6f6c98f16771789ae0cd8c5314dbad0129993ea7e62a2d8c97e85884deabc9ee3dbedf710f99ccfefa68e31e6193a99d29efbd69d3087a5277f369efc9d31c3ea19d6b0ba60d1ee658cb641788a686f6db25ae14297d493d52e11f2e731353c51282c61651d96a0ecd1bfe5f6f66db97d84e5e6a7b4dce8628d59ef369827cf0de9c9b73509e68e2bcf8fe01eb8e06cac88e81b4111d1d5249c37d3f259edeeafff9c7fb584b7c0856f87c5bcc010f3cd02c67c7bcc53f433788a44104fd10d63d2dfc0e45053b45330d901133ec020fcd480c277c4840f3408bf34a0f0ee261f272a738791fa38bf23fc63c5876eca3cdd5deabd4b85a7e0315243bc539de302110b7e5d9590a9df95da130eaae1033af245957434f33f4f815e0bbe9ebc997064663f3d44f869bbe28c79f31c93c1f376215f3550ab15c9bdf11cd9ddc0dfbf44dc9ae2bc81a7e67859ba046967f6c03cdc5083874b04f4703b99329c6889d0562aea4a765ef8ae100d49fef74a99bcc5e2ddc951bc3059892f95dcda50b289d2cd68b4c399aa5c6422f69839f6c4fcef2e06ffbb772298ffed851578230c055ea0aa716f4cf2c8b092fb60404699803408062417cb7c8586ccc70266be3c2ce645869817350c16f3be58cc474710f37c93db10fd0c8b48dd46aadab9b72488b6053286f96d818c154e825b3b5d5c31d750809554e34cd10f5004f53325b7e8f9c9e438279cc391de38e778dfc9b82b338f73fa8903963cfdb1ecbe9b21bbe76405cbee034cc279f809cc5065147d6be98de28aad091a32f75f1fe75fe3ac20239c034df1e435fc498678e6f1aa2ddfaba1814894292251faa4c85ba65a62f0dc554b9f21b83e834cfa7037bbbbc1cd3608e8660763199a0fded5aa7a4e10eea736806c768053d41ce41c5ddb2d7354e57f2f757e73e5398e6a595dcd16dd79cb9de27aa95381eecd9689f1d772e75eb6f3a36a325c625f217181c8b995e2392edb45cbefe73bf78738c702e7d83590b7198299f234938970532e0e67933b6398a79b30cf8d0473fa30b3d92ab650bad36c3925ae543ad76c3141b554f46ef1bbeef3554c7da6953bdcea80c93114735b330c6eab57b3606e6b98a96411fdf3991c9f1ee984e296be268d32650fdf65ca4c661e9b4efd76ac34196e4a164e6e4f5384f424998927c92ea624111df2991cd7d43d78b044d9cb77a2cc62e631cdbade8f25cb08133d31e2b07b06e9f999e06d26b7b76f72b305b9f6b5b44a39071aa136d264cc9c1adfc0a4a9169db1a65274366ed0a3300736c7e0c07e09e8c00ab198cf35c4bc71c0981761319f6788f9fdcd83c57c3456eacd37957acc14f514a5c6182cea2586a81fd92258d4c762c24b0dc237b60e267c9c4938afd1f16672d886f3784cf8820884ef8a092f8f40f86e26e1bc305b68f218bae0b1b8e00926c1dcb216f9119cc204276256b2afc14ad6b7096625934cc279f8c50ca9a48afd56d2afa44ec630559ab22b8f5ed04a2a2f8c6c6c0f4cc1502fc1502f0d877a770c759509f5fcc850c7a74d3015cb5afb19b2d69b5b04cb5ad34cc2b91b5b16811b2bc6845747207c3ae6239787f49133308b5c11d247ee81e15869c0611c9b4f8163266625ab4c0eb85d302bd9d3249cb77f56fb4192a2fdb31726784d48c1b330d6fb47607a7b9b84f37ae8017e629da20e3a1b4bc4030d897862fb6089b80f26fc2083f0e22d83099f83093fd820bc4b8760c2e762c20f3108ff22a0f07998a51c1a81a5ccc7841f1681f0124cf8e111082f3509e7e18ff063e3b370c16526c1dc6b1ec90c053eefc20e5ae02f978577791ab5aa6045f3024c97a34cbaf01bd99eb706795739f6aea34defe29df9739cff79ce4f49ad41307e876f5bb14c900d128b85582c8e31c5a22d8845a5acfccc13ecd38fc1222c06c79a62d00cc4608e53022f134313c1caed7d31f7739cc9b7750ae67e169b84f34c7c7c0499b8028bf9098698af0e18f34a2ce6274610f32558cc4f32c4fcd580315f8ac5fce408625e85d9e72926fbe4330766495f36dbf10db3a41f1a221b1deeb599e2d89b0d777e8f063eab4408aa70fe2a75ae5539d7160affb25a74629689aba5017dda7e58fc4f35c59f0fe7246334cab9512d3cabd26988d467b66160c6f5d97a03aa5284a896e3be6e53ccd5af9ab91db26bc49341745a66d2891bc8693537b456add8e8ae3173fff571ff056bd85663467686c1c81a0634b2e598f0330dc2b3020a5f81093fcb20bc5140e12b31f33adb645edd7c650fb75d9eeb1cfbc96b6e563980f597610738c72006b30a33987330833937b4c1acc6de791ef6cef343bf730d96d41744e009f73709e7e1f9ee7a61aa900760a42ec24889fdf5b220a9609c0ec4385d1201a7834cc279597729ab5dd60ded1facac3bd8249ccf01b9ccc48a571bf91e80723e7180b9198760f9fa0a53bee69311e73815fa256c8c73913bf7e9a0df2c484e3dd4f45e3ec478a541bf5cb16828bd99465731f71302e29fc17a76c5e37818c6e66a139bf62c59654d3615c68b429217ede9579d0fc7e2718d291eb0f2ee2da4d38fc111580cae35c5a09d91c424d91c4c3f164762b1b8ce148bd62016fc6de58e61a4ffeea3b0775f8fe713d57c99aa55a082bcf768ecbd3798dedb06bc97bfcdcd97e96b7d0cf6f61b4d6f6fe5d19a8fcc2f6723e5d67c2b03fa87634d6fe649cab7ba0cb33eec389360eeb56f66b5bdf685038279ede34dc2f972875bfcc43ac5e2b3130c8273c56ac715b5bc62fd2dc74d2e1384131ca25ca0cb3f8caeaf484848e76e9e82c13f1197233ede98795db0a91c27623678bbc106670e0c66832761c2ef30083f30a0f09331035f1bd2c04fc1627da721d697068cf5a958acef0a19ebd3b058df6d88f5fa80b13e1d8bf53d21637d0616eb7b0db1fe2260accfc462bd2e64accfc2627d9f21d62d06058bf5d958acef0f19eb734c82f998d303cc508fe70eeb41e1b006f97258e34487f942364574e0543bb572eee4dd5a463aee2ac098d7b926c578bde7211672b1d27926c9bce9f3b00919af6c3ec2d4f4f747595d4b4b8ae54842355b20ca944ae2c9efe76306f0186600eb850e037d19c004e767557d24ff05985a8f636a3d21d41ae24bad22595be6f0d51e041954ee424cb92731e53608e5faf9526eb453bf58e81c33a8d04598424f610a3d2d141ae04ba142a1ce32e73ca32678b14929de02e2bbe287dd00e5129370de5ee1dbe5d76af9f06defe6d474a3cf604bc58d4a535991a2cd7329f6cee74cef84ad6cf3bbf975eebc820d585e86c5e279532c9a7a349f28866c83697d39f6be174cef6b6bd45abd373d8dafc062f0a229063c77cc4bb3557ba5e94ddc645f3298ec39c327ef1cc464afc284bf6c103e73f03d238208bf1a63f48a8911dffcb35ca4c39c9a9ec2209caec1def6aae96d9b039bd0df9a9e455c6b7a3faf6bbec66ad735371605ab6b5e6712ce6b4efceb8ea16a4ed79b24f35e19fe7dadb0dddd3760c2df8c40f88d1893b7c232b9c9203957ec3ec487f06d5886ad7aaea35b8acd3f37e96f810affd0644e82afe0a78d2fd61372b329ddf930c0bb261502f4dddf82097e2fa4e05b31c1ef87147c1b96053e089b056ec7246f0c2bf90e4cf2876125afc5247f1456f29d981ffb38023f761716ed4fc246fb6e9364eec73ef56377efe082ef3109e6c5d7677e04a7187cbd1703fd7904a0d76138be0889e33e2c7f7f19327fdf8f71fe2a24e7074c8239e7af23e0fc2086e39b90381ec2047f1b52f0c318e7ef42727e04e3fc7d049c1fc570fc1012c76398e01f430a5e8f71fe2924e7c731ce3f47c0f9090cc72f21713c6912cc3d3fffd66b28cfbf01e3f16b043c9ec278fc1692c7d398e0df430a7e06c3f14704389ec584ff1981f0e74cc2792bf42f3f485234579fc76cefefb0b6f702c6e39f0878bc8899c8bf214de4254cf07f2105bf8ce1e083d06171bc82094f4420fc55ccf6f8b796c3d8de6b58ac378b20d6af63c21b4620fc0d4c785604c2dfc484378a40f85b06e1b962e363bee621f37d1a516c2995ba47a3b11f2b9d82137b1b33ff2621cdff1d2c9d9b4690ceef9a84f3b5b2cdfcc43ac55ad9f74c0694cd2f2ea81703a2339ce62652c6aeb01609de15c6377ba58825d601f6be2989794ab4f493c43cce88e00f4c82799da05522649d602326b97558c91f6292db8495fc112679f3b0923fc61c40db081cc02758b4b7081bed4fb168b78b20da9f61d16e1f36da9f9b24f36e9f2dfd649714dd3e5f9804f3d66c073f8253b466bfc440778c00f457188ead42e2f8da2498d7a03bf9119ca206fd0dc6b97348cedf629cbb44c0f93b0cc7d621717c8f09de26a4e01f30cedb86e4fc23c6393b02ce3f6138ba86c4f1332678bb90827fc1386f1f92f3ff30cedd22e0fc2b86638790387ec362bd6304b1fe1d13de3d02e17f9884bb9fca0ed742f8d3249837d67a846cd3fc85c578a79031fe1b13dc33a4e07f4c8279bda057d87ac1bf98e4de6125ff87195d9f088c8e771b19a39d1b36da094c725e58c90d30c97dc34adecc24999b537e48bb6b88092e0829380b63d12f2c8b4626c9dcecfa4760768d31e1032210de046332302c93a626c97c4dd8203fc998624d583393605e8d1e1cb21adddc249877e00c09d981d30283bc7358c82d31c943c34a6e85e5c2612173616bcc9c874760ce6d4cc279f1bd4bc8e27b730cc7889038da9a04f3caddc89095bb2db0188f0a19e37698e0c29082db63288a42a2d8128bf1e89031ee80d9f298086cb923267c6c04c2b7c21cc7b8b08ea313e6f7c787f4fb9d31bfbf6b48bfdf05f3fbbb85f4fb5b6390278485bc0d26796258c9db62796552c8bc928d99f3e408ccb92be6f7a784f4fbdb6138760f89637bccd94d0de9ecba61319e1632c63b60828b430ade1143313d248aee588c67848c710e66cb7b4460cb3d30e1332310be13e638f60ceb387a627e7faf907ebf17e6f76785f4fbbd31bfbf7748bfdf07833c3b2ce45c4cf23e6125e76179654ec8bcd21733e7b91198733ee6f7e785f4fb05188ef92171f4c39c5d494867d71f8b7169c8180fc0049785143c1043b120248a41588ccb43c6783096fd1686cd7e4330c98bc24ade19cb7ffb4690ff8662a41787243d0c135c1152f0700c4765043876c1842f8940f808cc44968635919158d15d15b2e81e8515ddfb852cba0bb1a27b59c8a2bb08b3bbea9076371a7376cb433abb319859ac086b1663b128af0c19e571583659154136198f095f1d81f05d31d86bc2c2de0d8bf6fe11447b8249381ff73ec04f4aa618f79e6812ccb77e3cd08fe0149f969884e13828021c93b1543c386c2a4ec1a27d4804d1de1d8bf6a161a33d158bf66111447b1a66238787b491628cc71161794cc7781c19018f1998f0a32210be07c6e4e8b04c6662d13e268268ef89093f3602e17b61c28f8b40f82c4cf8f11108df1b137e4204c26763a672625853d907937c5258c973b00ae5c9212b9473b10ae529212b94f34c82b39dd353fd084e31657c3e26f8b490824bb06adfe921ab7da558ddfa8c9075eb32ccdece0c6b6f0b30b3382ba4599463513e3b6c94176292cf092b799141726e57e734c1bf94509fdbda46bbb362ea352ae7fa49f907718afb9a286ec7292eaa178ae1b7584ccdeb3c3fbc1ec5792dc6ecf9fcb0f65c6192ccedf98290495c8945f9c2b0515e8249be28ace4a526c9bce57771c2b43f9f4178362ebc0a137e4904c2f73365a8ed7986aaae67b714e57e9fa933d9a57e2c763dce70992981b853ba2c64eeadc60cf6f2b006bbdc249927fb152159acc0a27c65d828afc4245f1556f22a2c835d1d41065b8d09bf2602e16b4cb9b71bcfbd2beb39f746bfad6dea3c7cad1fbb7d0227b93f9687af0b99870fc0ccf6fab0667ba049324ffc1b42b238088bf28d61a37c3026f9a6b0920fc1b2d9cd1164b3434dd96c079ecdaaea399b45b3c172eaac758b1f73da80d33b0ccb5ab786cc5a8763d6745b586b3ac2249927f8ed21591c8945f98eb0513e0a93bc36ace4a3b1ac75670459eb184cf85d11083f16137e7704c28fc384df1381f0e34d1e6747ee7196d5b3c7896e07f4d45ee75e3f39ed699ce00998d75917d2eb9c8865b4fbc266b4934c9279a2df1f92c5c958941f081be55330c90f86957c2a96bd1e8a207b9d86097f3802e1a763c21f8940f81998f04723107e2626fcb108849f85095f1f81f0b331e18f4720fc1cccc89f086be4e762d17e3282689f87457b43d8689f8f497e2aace40b30204f4700e4422cdacf848df64526c97cf4f0593f9e3bc577642fc6783c17018f4b30e1cf4720fc524cf80b1108bf0c13fe6204c22fc784bf1481f02b4cc2f9571d5ef6632929bebe752566dcaf8435eeab30c9af86957cb549329f3af99a1f1829a64e5e83097e3da4e06bb18cfe46c88c7e1d16e33743c6f87acc9adf8ac09a6fc070bc1d12c78d98cdbd13d6e66ec224bf1b56f2cd98e4f7c24abec524990fe9bf9f307c23e644713ad569494d77da5abc95e7b6082bc5dfe3455b91b7d816b079b24538be26e4e89a6f18f32ff9f2bbee977f96392d33f5a55bfe95e542d1fe5b2ee4269f29728e158ed435ceb1d4691dba5fe12d935f2386ed3cf8396bef1d377e058e86735268c1db97fccb4fd5e0edc5a205ac647aa5f26f452d72e4049918712b46fd031375fefd30b31e231d4d97092a2ec312e6768beb71849a637792b28268721ba6c946932683344de05e90e175314b0ba2cded98361f9ab41989a68babc15256e5fc9e20acb4dab121f73be2a9f4f1a727ef57592afa39b8bc20fadd81e9f79149bf710cdbc5b3f6e76cd24bbde0d28368bb16d3f66393b6c302d8a6fb556ebf29092545e13deec4f4fac44f9e83fe317c9e334b0ba2cd5d98369f9ab4d9c5579e1be9102d1596e50e0f86cf73c93b4174bb1bd3ed33936e436a4ad7694e79b75bcd77f9a60b3d2aa43e6e3f2b8fdf78e72ff7716e41a9bc61741ee41e4ca3cf4d1a0dd752cbfb5e9862dc13cc73ac670d9be4dc2d77fec6d2ce2b233acdeec534fbc2a4d90e9a667a4e525fd09b203c58b9f3f7c2886c6a1d16cf2f4df1dccd577e192bfac5e7c9da9b2aa9263b7f8f66fb3982b8b8fa2cb7eec374fecaa433befb34cc13de745a22eb93a9fc5b9018df8fc5f86b538c87062869bdf12e67b5378dc74b56d316f341b47a00d3ea1b935685294a1e578b317266e33c838fc2ebf1e69239aa947b10d3f15b938efdd194e32d96f94e20a52b9f7456ee845826c6c76a97b151d7121ec2f4f8cea44751083f519f9ee1614ccbef4d5ae6f96e498dadb38617852f7f048bfd0fa6d8e707a8a1068d7fba1ee1514c831f4d1a4c0be0995d8b4b963fee33b86ff3e61f3f61a2b2c1c730063ff949c554f5f1a0a998aecf5b8f69f0b31f5f51dbafe369e7cfc37bef44954e8f635afe62d272942f8f38cd093c5fc4567dcdba3edb1b4f601afecf4f8b379525066bf1a64abf74cab22731bd7e35e9b5b36f2f1f4c2b3cb5d2d16903a6d36fe9f735d595e33259323f85e9f7bb1f9f12a43cc06b51f4ede1a7312dfff0d31aa3a811fbd73addd2e2194ce73f31cb0d56e68f172d9e0a31ab6c114bd59ea149d36731fdfe32e957c668c74496b329a2c5502ec73c66887e9245ceeff942bb74ad24bc077b0ee3f4b789d374624ef8d8516a42e1393c8f71f8c7c461663dfb006aeff00246e35f138d313eeb92e3457eb7ab3ef922a6e97f264d47fb2ac1278a19acbc1ea93c20de139aa95ae54b989eac818f5e1fbdce552834ad9d7ab027c7cff5686b632f633a264c3aeab5b1da3a26fb49783c79386e5d25067f5decfc5d25aefbd32ebd51965730fd1a98f41b5a877e6eb9947cc07f2d2cda547b15d36a339356b322b64c2cff050d1f2d93d730260d4d4c06a2b5b3e4ccfa69cecf0a47236ebddedee76a8797eb9fb8c051c28b2e318c454d93be577cc331802eaf63ba64997429494b17b78f05d61c0a458895d2ae83484c3e99ccd5b88425625649d2bf279f0ec2e80d8c512313a32128a3ba461adc3e0eb81f01ae5bedbd0b8268f426a6516393463b06d648a5b87e97df2b0e14d3b7b0983631c574ac0ffb4cb563861bfb6a991e3cceaa0d503bc7a51e254dc7afbc8de9dad4a4ebce91e85a9e86ae41747a07d3a99949a75191ea54e23cc3fdcd02e7ff18515fd84fbc86d7124c75dbf43ce8bb9886cd4d1a4e8ad442d3d7300a7b7d0fd3bc8549f3d191a6ed4219b24a86e4add66ae169542d70f7c852f87d4ccf96263d778f3485c3ea19453a7f80e9dfcaa4ff181ffae3db83d4af07de8869da3a5849ef5f536afffb21a6511bacd515954699f1be1f61fa6d6ed26f6284b659bfbef7634cefb6588f4154e95a21c265c2ef7e82e9b88549c7c911a66d381da348df4f31dddb99741fef43f7ba3675a95fcffb19a66f7b93bec322d397daff7e8ee9b5a549afa2c8f52a3584e63326791bb8f68cc37473ea1798961d4c5a4e89dc5ad3d7320adbfd12d3be63babed8b4334cfde6cfaf301db74ab7cf0bd7913a4f7e8de9d2c9a4cbe0487429656562a4618d539aa8fea8a872df37983e9dd36d87d56d7f41f589c206bfc5f4ec62d2b35f64e956c1ccb35fd34badef302db636693122b2d4aa5b8b28d2e87b4cbb6d4cdae1737b83a5115fd530d1b9bf3ab254fa01d363db74db4d7e52c99f1e51a4d38f987ed974e9b44a1ca34da79f303dbad2a5935f3da248a79f31fdb64bd7b7637b40d56ffde2174ccfedd32d9353eb495dc7f81fa64f37933e0322d327faf2ea574c931dd2edc1f76781992bb37ec334dc913eadaa9869dd5aba69f53ba64977fab4aa5b9328d2ea0f4cc39c74db217ed32afa3ac69f982e3dd26d37fa4dadccd533fec274dc29dd7a86bff45a26e7064595567f637af44cb79ee12fadfce811453afd83e9d7cba4dfa0c8d209d6a5fa46965aff62daf44eb7d7cd5f6af9d7268a34fb0fd3b24fe6d2ccb4422abd34e3531d8ddae4662ecd526b13459a25302df33297660591a559034c9bbe994bb3d4da4491669b615ae69bb4dc8bd1cdc277e7558559ad80cf220d42a42146a400eb89836f2d14baba7aa91963c56c69ca744b3d8f3e3debcdc2b4e8878db1616f4d777eb95763bf369caebe8d307dfba73bc6567baea7caa12b45bb99eff2455f77698ce935c0a4573eaad74491520b9d9ce9ea32daf12e5581629f6eca34c1341888cdb0f16389fe56ce66d6069b629a0e0ad6d6d6d3aa50f415f0d9a679016b5ee96ad20cd3643036df3ffddc5429e69ad48e7bf4fd70cd31ad8698b45a929656eeda06baf9e0c167834741ae05466ee7745bf3b83da4b32a200a1d5b623a0ef55362e27b53f9597ba6dbbaff7ce0a717b7b1f33f9168eefc395ad4bf780fc91441889f55b3dceece2db1bb895bb7eb535367ebe3a9df25aff318543afe97bfb9b8a676c6bf99905ac2b006eec202f1af7b8227c37269da89051a51f7c90a2139e9e1f9ee6563854594899a5f89733e81b93324d4b722ead2c2544fed036aaa50bbba75525f8be07b7e9688fa3d4fe5f98e2d35961a29590ee91c4e7a53d374384fd5d632551be4f2bda0133dd3b4a6ba63b10b7fdb66661bea508b2c6c2198e2ee0a98c4dc9dad127cc3eb3900db1291697966e122c74ba756e75b618ddef4d6de4280f2ea758a9bce928bbc4ce2b612a6e66e5bb88cb91b861625186b9cd5208fa7c6084a64ad05b2394edd84ff1e251e2cf5f8f738e0ba754012d7484a5c5d3cb8744b9beebca554768b8e132ebd94b91fcba976948903c829dd922047d909b26f2c406ee89c04594809b29d07a45b81851f469a2790960b7871005705b27251e63c1faff1f22894cb323a2eb8dab449e21a4d89aba5c03599f1c9aef3c4b02acca4714035a528896a0c25aa2d9c13d5bbad573e16c976c4fe8ccfea8803b60da02a3296125b236161fcf179a2fb350e70baf54fc21967677959100b902db29320c753826c2b404260e66e8d3840db7b4412daae94d05a192b196e6b77654c60fd02dcff6ed4150be5fee3ebf68f046e7f0225aee6c2b6468b3e9315e2f5716aa8f37e378569227dfd4b65c1a931acaa2e6fc85135ced284eb6346e9f7a705e38bf7fcf10cec8eb0b9abb6ca448f88a727906f336f5dcc27c19ebc9c14192bc7674f598e0f5f9613a0ba9b538715e7f86894e584ea3a08f37441a8a7f39da7f51a6e4ea0d6bb4ec7d45997e3bb7e9353478b2ea7ce423f3930611e50c8e3031393ff8f8f19e4f13183291c02ffda1affe79615bb539615dbca94ab7002f145a6f399fb3199190c4e7dc087e3f2f41875a91523efd7c155b9618a5b534fc992ed47dd744a9773417d652a25dc6d245c77fc6d8900ec770faa396c001ddab154681700b4d328d17634a04d3598dab776e3363a9ceda9707e06aa8cc536e1cc8f25cead80754eb70967412c71ee0a70ceb00967bf58e25c0c70ee6113cefeb1c4097b2566da8473402c71de0870ee99099ce52850187d5eb21356945a50e1dc0794ec7bd984333f96384f01386751e2ec504766f7b68ef263d93eba1c64f5bd6d82596b3e470c605e0f60cea684b9651d30bd3eb33f1dca4e54283f06997c1f5b5016c412e59ec02ae7d882323f9628fb0294732951b697280732bee3875a63375e74ec96c955f055a2bb983f103f9095207bcfcbc40409bc4a847d3a96b0006a43857508c03a3f53b3e4b81596cb354c19b0c95954f0f607f04a28e1b501f0166d32597a16c0575a9fc50c14479a8d1b53a17c15a02ccbc4049ebe321b2fcb9415cea442b71740b780121d3f59200748e3d752e904309567621e7a891cb4d53ffea43425cda8b3a93016028c0b2931660969eebae8c5312c1cb604a016656a4ae2a6e1d1860374fbd66fb91af7c9004b41f36d717da2f46e0e428892acb27c114059918902a4afa725ac6e67287393d5f42680cc5d99098bc4ca616fa599d022c950e600944bec98e953fb9b77a4681fa542bb2fc8ec4ba9277d2ff4cc901c293a176aad928d415f4c13608f55f5012d8e1d588d01b4fdead71fc6bdb2733140b98c12251fe8f5eeef92dca7860c5b1f2a6c5b036cd599e899f6d38d05fba549474e76a5c23a1a1421cb6dc44a3a4c4a86f57b60ad2b28b1f662deb9e33c020b3c1b5ed6bd0d96e94305a4be750315f6238035afb469be19e90429b2f9660ce05c65134ed20952643877023857db84b32096388b01ce3536e1ec174b9cd500e7fe36e1ec1f4b9c27039c0750e2e4ed5935e0b51773172f91e1ea4285ab3da8301d68cf7cc7beb16c629e066cef209b60c671f2e8e900e6c136c124ec7c238379068079884d3009978390c13c13c03cd42698fd6208f32c00f3309b6012767f90c13c1bc03cdc2698843549329817039847d80473600c615e02601e6913cc41318479298079944d3007c710e66500e6d1b62c0721ad6592cd6a7b9d25511e630bca8258a29c0aacf2585b50e6c712e57fc02a8fb3736d0d61c59d6c6ac23280f5787bd6371016416453b5b60099fd04eaa909dea931856ca9a44186ad1515b686c0024fa4c4d687851fecc5be8b483ae0fb3415fa9380c59e64cf24ec3856e68f03284fce4465deef6e18849e946c2f8c22e0124eb10926a16592c11c05609e6a134cc2ae3932987007e4d36c824958f72483d907c03cdd2698845d73643087029867d804338e9b31f50730cfb40926e1103019cc1d00ccb36c824958652783d90dc03cdb26988443c064307b0298e7d80493b0838e0ce68e00e6b99980892d72d167c0116673b2f96fdb0398e7d90493b0002283792e8079be1ddb42106670b26d21ce01182fc8c414d73ce131537d8f638eecc623ecf724b3ca5e00e7859438b762de7ecf452cb939133e7219bf11a2bd4017dc45b601252c84c8807e0a2cf462ea49d8de018dea180ea565015c976462a9befbad1a751c23edd0fb2d9ef10ceec446ec2bc92c711a407ba93d1b4a10f660928d52ee0e505e46ff7d7a778b936a96fc1653863637e94105f06400f0f2cc0ef356635f0b8c4175a705c076851d1b99f05173fd934584dd18649f2cea0d2a3e57dab4133fe9c200b28e8ca9c052afb20927e9278bc8701e07705e4d89b3b3ef8cefdda88c126a8208ea7c90e5afb1112a650f2615d47900eab53642a51cfda182fa3ec8fed7d908957214880aea7b00eaf594509b392715ce6dbe3f2bfca066fcea9f6d01b21bec99e84a383a4ed6846c08fce48df53938e14549ba3e8d0ce6e1c02e6fb20926e12418329847009837db0493707a1619cc4300cc5b6c8219c76eb7c300cc5b6d824958512783b91f80799b4d30099b926430570298b7db04338edb352f0230efb009661c3f18530560aeb50926e13200329847029877da04338e4bfd8e0230efcac417f306b04df38b794b01c8bb33f56937253543f0c826648d00f0eeb167f95e1c373639167469dc9b890cdd7f13cdd08b814daecbc4327d35098b77ecae020ba137ada958d3817dde4789b5a5c4ea2e8eae00de7291131d32705954e018b0c7fb333ded6086c3a3d08976a9a80aa9e32827389fd7b1922d92d3624887cbc8361dbd0ed8e40399f8fa99d92609a70a36a342d70058e583367e3780748f18b2ef06ec082cf2211bb19276b791617d0958ebc3f539fb32fecbf7ba02948fd83b0b8e102dd92cb87701da476dda819db4f38d6cbcfc2380f3319b70e6c712670b5034adb70967412c718e00381fb70967bf58e22c07389fb00967ff58e23c18e07cd2269c036289f34a8073834d13b249e77590d541678292fd299b70e6c712e78900e7d3b6ecf14a3a7d8bac97f35b80f2195b50e6c712e52ec0673e6be776b9849365c8d6f84e0116fa1c25d67c167eb3d222e7378f007fc972716549e6362d7d822a090e0496fd7c262c1b6e4331c509ce058e679bda7614bd8165bf60cffcf838cea8fb03a07c3113536df8126bef4ae14d6740793e80f9923d931ce2f8f9b055c073be5c9f2833b654701615ca1b00ca572851f6d0ea010b02d500369d6f531f0a80bf4a09bc0d28f5b99079425086bc2859e97e1df0a2afd93b0d82b0778a6c1ac435c0325fb7676f9a38aeebd81958e91b99a838c1aafde89ad9787012597cf74cca0630dfb463a8b958f84f6ebb0b84b84a5a3b7d940aedfe20cbbf95c99de64a7c4c6f8ce3c79d7200d0b76d034ad80425033a09007dc736a0719c80db08007dd736a071dcadb30300fa1e25507e52e968cf1f8f5fc5bd1d28c5dfcff4f6297e7af1098b1bb25efc8701d40f6c841ac7a191f500ea461ba112163b6450ef01503fb4112a61d14306f57e00f5231ba112ee634306f50700f5631ba1128ee29341fd0540fdc446a871fce4ed1700eaa7364225dcdf860cea3700ea67364225dcb3810cea04d046fabc7ebb96e33ef67915b0cf2f6c9a924bba010659b3340b58e69736e1cc8f25cec100e75736e12c8825ce7d00ceaf6dc2d92f96380f0038bfb10967ff58e23c1fe0fc3613a39cfe66da91cebe271b322e0530bfb309661cc7df870298dfdb04338eb3408701983fd804338efb2a0e00307fb409661cf7551c0460fe64e33619a44b6ec8b6c92801587fb6112be9a23032ac3fb324d65f28b16e6bc06a9ec734563e92b1efc84ca182db15d8ecff6c864b589d2283db06c0fdd566b884851819dc3f815bf8cd66b884d52d32b86f01b8bfdb0c97b0c94a06371fb8853fec9898cb673ceb7b40118e4291ed013517a0fd937a9bcce4f6ad45ce71bec3a29c4d701e29a70347b688a115c8f07fd9d4c547bac5065917df3f00e7df36e124ede423c3b935c8d6ffd884b320963827039cffda84b35f2c7156029cffd984b37f2c711e0570b2cd2cc2392096386f0238139438b737e0f45bdb84bd5484437aef50419e032037880364c2d95064904701c89bc5013261b70a19e4bb591272c3384026ec5e21837c13809c1507c8845ddb64903f07901bc5013261173719e4750072e3384026ecd52283dc0c147c4de20099b09e4c06f92b60c94de30099702c970c722f60c9cde2009970251619e4ce0072734ac8c136a425740a648bd4df044ea1852d28493b1dc950ce0456d9d21694a4dde1743bfb0094ad285136774ee63377ff8952e761779bae1246b891420f2a68db82acdc9a125afa1b22c771d9ef6a80b54d264a74b52f0a0fcc1faf627cb0daff1673844d59b2d1d99120c36f1e07c871fc9c614f00b96d1c20c771b3c44e00f21671804cd8bd4806b92980dcce96aa16e93a57b2aad6ff40f1d6de1694a46b5cc9508e0756b96526509630f362f68c4dcf24db7dba145865074a946d254a6e75de0de633b42132d94cc1e90061c7faccd8501ca935922d277a0ea0dc8a12659e56a6a7f34d9471ceef72c796a7384279e433b633fa8354f82b805fed4489bf9173b252cc8859212e90a1caa642b539b0d4ce99f09bb53fcc1177bfb91b40d8851261bb3a4a71a52969a69d4d857124c0b875fd163fae2877671fc2262559a6ae02fe6f1b4a94b95af113ec531c9be6c7b8d600f8dbd6a71d676c411b59a5fe5a80323b138513fff841a5289ce6898f2064ac7022ebf8381678d5ae9408b30dd658970380c327a4999d6c08e50a60a1dbd5ef100a1498a1d980640bdc0f0556bb3d25d6f6126b3fe727b9786d3cdb543e1557024076a304d933544da0507c926b99739ec1e6e7d354d08f074e6187faecd6f376a410ce8e22eb485900ec77474a946a939bbc5acdd34dc7198c0730bb53c26ce29c2c9259be484e2323c345b64ca819c09553bfd938ee0dd22b01ca1ed415f995cecd6ae7366c684e643333335987cc1a3b02843b5122545b24a892bcccf811386c202e8e1f32ba1ea0ed99894a7cd02a3ce99c3cb24afc40500dea652356d209b86458bf03d6da3b138b81f126e7746d3a0361d1d4820ae75880b38f4d3849375224c3b904e0ccb569a93ae94e7f64a57e02f8d03c9b7092ee474986b30fc0d9d7269c05b1c4b907c0996f13ce7eb1c4b902e02cb00967ff58e23c05e0ec4789b33babdd7ef74ea7e52da74ae73fff9bf780ae1022939fd72e16d43230e3693815ec9d40b9df9f12367fb577882e7e8372db0058036c99424b5a7d276bbbbf06500eb40565412c514e01fe72902d28495b4164287f075639d8ce957571fca2de2a8075883d339409778e221b58db1c64f69d2951b666c981b53251a7acccd4401ad9bca45d801d0eb567aa22e112986c2a94a7023b1c46897273969ce951ed997794115b249b817426b0c5e199286ad4b81047565e737b535bc15104ec72174aac5d0d599c4762b9b0d0256c57d158ac4ad9554c0898aca3783360b723ec992413c70fbe4d062847da348441bac095cc32f7053847d9849374912b19ceb300cec24c4c5ca87b06b2db1de7fdb603e1fe0c642b8fba8042aac8ce1176428b251b616f0bb08ecec4ece302b669ce3e9e07b2fe189b3c695fcaec4ee64927029c636dc249fa6957329c07019ce328716ee19ccc332e7a291602ab9cc7e609e1f16b7e6e05208ea784d899e9d3127931e30ad9d41a9f9b810268d74c14400aeaa294e343f12b80de01d6b99b2d20e33845f6060072822d2009f7ad2303d91164ed89b680242cbdc94036062027d9029270508d0ce4700072b22d20e3b8076d0f00728a2d200937502503390b80dcdd9e615ec2cc4d5693fc1b94db53a997fc5538b74bd862a79dba82b635433665700b806b5a265a33413bd4e2d89df614805a6c2354c2f91b64509f0050a7db0895b0724e06f53e0075868d50092bea64506f0550f7b0112a61c70619d45b00d49936428de3ae333703a87bda089570150619d4c700d4bd6c844ad8422283fa28803acb46a8846d2532a80f01a87bdb08358eabd51f0450675342f5bf392aa16d926d8e7a21c0b84f26ba44f0a1dfb80f651c0850ceb167f23661e6cea6427908e8a89b4b89927f75ab44eecbc5a76c55d4dc8a5f975c1b607ff332b9910f2f4656b1192cb95d792a7b24ccda64f67801b0c7f99468f99c946a5625666d2c727e57b051021b9fb8153f6c5d80459650efcee5dd5c6fba23b9544e7e99c0dc397015312c545a0284a594083b69999a7bc355b296e8cdce19eae2984985741ac8cc6576cc1b2e164079ed72811057495b6e3f4a85f6048076813d6b2f080737c84af38520e397db38059b74013559b3717b60a10b6dc44aba5b0219d61781b52ea25ef59b9cf23a413cb898c57b07ce0e00debe366dcf433a9b9d0ce72700e7629b7092ce6627c3d91278cc0a9b7016c412e71880b3d2269cfd62897321c0b9c4269cfd6389f3708073a94d3807c412e7550067954d0bab48372d255b58350794ecfbd9849374d352329ca7019ccb6cd997ab6f2c67167f095056db82b2209628f7063e73b92d28f36389726780724526f6e272bf12cc412ad94b623b9c9600597aa59d5bed110ea5916db53700605d9589c52cfe0a9df865ee7b01c8d5b6808ce3bc8d3b01c835b6808ce312d44700c8fd6d0119c725a80f009007d802328e4b5037009007da02328e4b501f07200fb20524619b9b0ce4b300e4c1b6808c63dbe61900f2105b40124e342003f9320079a82d2009574e92817c01803c8c126423c6c7c04b84ee7c5e5bfcfac53b035487dbb3109fb0ae48d64df13640794426fac4f3c46f757423339ab9fbafab3d2fd54ec3f19b1c380ce03cd28e652584a533d9b2928b00c6a3ec590b41d8aacea642b91a74e21e4d89726b8972395be8dce6a36dfe27ab12f6fb904d563d0fd8e83194607b33efd4ea054ea00a216c190a39f98de971ceef722749a638e2c40412cfd384e01fa402bf0858f4b194e0d5a719788d7253fa34c3a9c0728fb3679a35612f3a59f569304079bcbd8b0108d192f9d765209b9f4089b65728ff3ac1f9599579efba9e0afb7e00fb8994d83bd459f5f23a87387ecdaa00c03cc92698715cd2d21fc03cd92698842d2c3298dd01cc536c8249d82b4f06330fc03cd5269871fc6a503700f3349b60c6719fcd1d00ccd36d8219c7bed26d01cc336c8249d82f4506733b00f34c9b60c6f1c30ced00ccb36c8219c736fd9600e6d936aef1259d4d4cb6c6772cc07a8e8d58492bf264587f6249ace7dad10355c86a7fc68eb0264af619bb4260b1e7d9b49a8db42e4a366aff2fb0d4f36dc2991f4b9cdb00ebbcc0269c05b1c4b93bc079a14d38fbc512e71280f3229b70f68f25ce1301ce8b6dc2392096386f06382fb1659120693b9e6cdae21ba054bfd4169405b144390358e565b6a0cc8f25cad600e5e5d45b47aae98cde2d2433344b84acf5930f32f615762e60251c2b225bc07a00c07aa52d999c74749d2c93ff08505e650bcafc58a21c07fce5d59958c5c1516d8a9f96df15d8e4359900d9771305390e80bc9612642ed3b723e79b50782772fd5f9b04b61cb883eb32d1a9ace0cf1708cb6a3ed598baf1498896ace9791e407b7d261cc4e04dd44114030771831d4b6d085b4a644b6dce07186fccc46cfafe6cd39a4d7f360078933db3e9e33829b10ca0bcd9a60dfa486785906dd03706e0bcc5269c05b1c4792dc079ab4d38f36389b302e0bc8d1227d7804f46a896d51f5e912f929313e2577f6c0eb0dd6e4ba707a97f24ab41be0250de610b4a52df48867237d0aa596b0b4a52bf4886f237609577dab3b9451cd765b402567957269a88799eb6b6ba9da1160edd2a3660917767a237a8ae2d04c6ca07e0b810696fd0142ab40301da7b323171db5fe391748631999d5e0160de6b13cc38faceab01cc7536c18ce39ab6cb00ccfb6c8219c7356d970398f7db04338e6bda2e01301fb009661cd7b45d0a603e6813cc38ae693b1ac07cc82698715cd3760c80f9b04d30e3b8abc73500e623f6ec4e475865cf26b34bd0427f9412656766da7e72aa10b654b4d8379d4d28f704f6f91825d4d6002aefde28176df68c747690ada7ec07e0ada7b7c8d135bd4585624cdcb5bdc502e328b14def622992cf2ae21fa12f8d619f666b00f5f14c4c32c8dbc426191c0f003e61e3e269d20a3b5d6607c5cf933662255d134486f56b60ad1b6c1a29279de74e36523e17e07cca269ca4d577329c67009c4f53e2ecc16ab785ea9a490c3f455f28fe5a09a8910e72dc4605fc0400fc994c0cc37917176c2ac3703300c667eddde983b07b846cad5b73500f78cea6e5d5a4136bc8e6287d082cf5799b7092f68492e16c02acf3059b7092ce5522c33904e07cd1269cfd6289b30ce07cc9269cfd6389f32080f3659b700e8825ce0b01ce57ec6ce113b6a1c85af8bf8212fe559b9aa4a45ba391354967039cafd9849374860819ce9300ced733b1c6121bedf45a66fcfaed7b00906fd802328e93bab70320dfb405641c37f6190440be650bc8387e243c17807cdb169071fc48783500f98e2d20e3f891f03d00c8776d0119c78f84af0020dfb305641c3f12be1c807cdfce2dd0088b1eb22dd02601ac1f646232a2df2e0ec296385907c70700e6469b60127e628c0ce64600f3439b60c6b1ebed4600f3239b6012b6c4c960de06607e6c134cc202880ce6ed00e62736c1246c9193c1bc03c0fcd42698846d2032986b01cccf6c8219c75ddeef02303fb70926615b880ce69300e61736c1246ca193c17c1ec0fcd29e3d3ee2b8b4fa2f80f2ab4c2c76e11bee2aa9199a5248b6f9e3de00ded799989989f51415d70025b441328c17008cdfd8b32090b0cccea642793498aff16d26fa2ebd5bf6f0086f1adbe3f60536f91d25c84eccbb85339f09bc4af6517aad13f65b12766890adab9c086cf3fb4c4fc09ee1f02874a25d2a3ca83a8e7282f3cf8eac647cf1c00a46bce178172ab45703b43f6422db0fda44b3fd1a90ed7fcc44518495e8de9a651c77f3180d50fe4489726ba66f7be63fb313f6659265f68301d89f6d051b472fda1d80fdc58e1542c5c2937207b14088aba475068f52a13d0c1450ffcbc40af602b669ad603f1dd8e6aff6144c71dc7fa61ca0fc8d12654be7c4fb51bbe47615d5319c78d00880fbdda6b515a48b00c87a311b009ff8874d3849d7a593e1cc0538ffb40967412c71ce0638ffb20967bf58e25c0970fe6d13cefeb1c4790ec0f90f254e7eb24856cde387a92928b1ffb571f91ee98a72b2e57bed81f5fd672356d27d0fc8b03e2dacb57196267c4c2de185c283711f5622e2efb654fab0b1a2725d26909438e71344b7c57236d70132cbf91f2c2d663bff4dd713622c73345bcdaac4552eaf54c8ae74eef29855b3bc9db839386a346a2e4d2327c1ff2a910d021ecb8a9a74ce49f0aaf54af1ec0a79a59973a5c2b9c277b09be1b9d304dc511f7acc11c82a6bce7898058e74de2bbb1773f717c9496409accbe4be7839428f79e02b9c9cc56206f7d0c949b415315bc6f8178792fbec14396f9ea985dcc2230dde2b16c4ab1c09f3406c55fc78922744c39d335ce23c3191f19d23f9dd79e258ecfccc17e99ddbd3099618e0fc72bba2fad47442f591bba954ca3375bd6e993c8d534be3d16d9430e7f18ac8acb32e8ddc0cc59f5f2052b04c481d5fa7a675eb875b7a8b14a992db8ba7c5a6ac7f039eee32d9859976109978ba93f2a5d294273b814b45a4f8bfacff078595aae408b50300 serializedProgramBytesString: - serializedSignature: 857bbd365d0ee283b0a5c67b1b1b062581a4d05953a09f5251a95a758e8e70ab0d08830d9a5688e043f3a6b2f5284b1dfd057795cb88b55e74634ccba6051904 + serializedSignature: b65bf0413d69ff8b5dcbe24ba17456b22f721d72328dac4185bb14a54f11b7db0ee022427b7a0914cb490ebc4964b7750f7ab9f3e9c2414a352e15e98806ef0b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset index c1cc708..c541d13 100644 --- a/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset +++ b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a5f6f1b45109f737cb6e338b4a5405a28100aa8416d739756e28107a4366921a24da23ac94b851227be44063bb662178a105f80cfc017e18d473e1452f8cddc5eb377b79b8b939c4b426de5cefb6f767ebf99d99dddb6e0113ece1d3cd6e919cdd32cad5193bab4875ff37877f00d4b51fd0aede3bd8b67036d77683a63247f6e39d7f05c44a94f038c7c41db78b7a4bd4e017e2f626c8012d7eee02f402fa788416bb440cbb44453cebb1922d665505fd5398ccba9e0f9907e416b204af1249e344de151474b5fda3a503aeaf79cbe17581db46d63cc3eb521734b2456fee6b182297a5189ebb5b2a3feb87e5c2b339a3f12fd5cad0f69fd786c5595c7b47a7e1754fb44a25c53f2fe52f565831e25bdefc1c1c13fae232c7f0bdc0dea91c7c29c2f8670876864b623889e0505f4964c3b00e53d083058634d6c3da0fb74cf688deb4e4dd37b5e9e0df46889509e2c31c59fa92958b936be81e64a7dd47f239ec8ced442cb2c3dc19b476dd21c9ce37942ca3aa66dc31d035ac5b327f236a176ba67162476bbe4986790194645073511a13d94dba2615d9e3f89a68168bf88ba81c4e81ea2f421de2f65b634f67dfc36cdb9aa2833eb680e0e5b7d18829199168086b5f7c4a7df58e4755884a92f4daa302c7ab2aafc9eb2c41b0ec345c6954d279431172ed1b1ba7be471d1a9a7181c1e631aa1d9bf97a1d90f2a468e4263e6860d7e57301cdad88d83ba4f1e6f12ce8d0c504751caf2660ceb7a96f2ae5bf459c524f58e897ad9e25647483db775454a037d87279f69bd9d203fcdbe5f52dbf78ce44dc3aa60a3b060a0d07755f6927289f184525cb2081e33d9a632eab008fbb5a4dff0961997a424ce81c3cbe40a0a0d0c61b5a665df99a65fc9a7df2c76ab5a1c3f4b3d9bd58a36ab4d9cd26aaec96a92286ee66ab5284bac231df80e6d0df40f64cbe17a9dee0732c36166191f71b43d6bc759e6c4609362b0cfb49cf7b49ad94c59b299f2ad539ab26c12cc0178c9e4d5572d5ebd07ea0602a9213ed94ceb50b5eb50b1e970d9a4c3d7afe88e53b7447c94fb598cf8a38a9659dac077575a3690fb75e1642c48c7c03d4cf26ca61b06d9b80dd91513b2af2cc8d6247cda724069a92061ad17f1eb9071aed11d5adf2e936df19d601844551ba2b74d88beb420b2711bb75753bcaba77a2dc9ad4190c2a2af8ec32099b021b96af33adbaca1d68fc5f33a1892e65bef7d7c2b9d1459cd86ec1d13329ff8aa644f1d7f1fc96c2d39332de06f0b9d22844fe4f666183f5bc708fb6a50c6d771d80e8f648bd8c7c81519c1a53e79e26c3e1dff4a81e7ee401ff6ed5540dc121fcfbe60e00b22db05c34e6a4b3be959330b45781ae2f13b7221119d5f4ce8b231d9cfd56585289205a625182e1ad2f7d8aad1fd58c193b0b87d426fcad682f3b6d298d98786cfe94201d19ae7f0febf21c31be832c8969f7558ba2b02a263d819dca9b1533d00314dc9a1faf8f287433c21fcf19979d9c992f8743c5c9215e825d4eb0ab9014024e28333bdff9ce6d774ff9e49f9c8e1f26a5e167d5e5eafffcf573e9ff9799f49a8440b85cf0bc507794673552cb5a122e5053af1d6e927e739cd25ca782cbecbc701719218977f2d7043ca6ee449d984a2aca3266e4896982b696e5ea41534d23e7c1da4cd9d43d24a1a691fe5495a4d91d652ff60c827a4edbc7d6d322fda5c8db68f47b1a6c58f3a395256cd8bb2b246d9f42828ebc64e50e77145238db24ff2a4aca228e30c6717549d4fba8a1a5d3747e1613bb1bb89f318946374610e133e2ff69f52f8df2954e870a67e4561e1ede62905b2f534c5640d2d6bf7f8c657bb583bde31f66899d92935df71bf3a6a246cd03e331b9cc531c184f4344786da1156f1d8d8171affe749379d92a4720d960f8507b48cce4d518a3feebf8d048bf718260000 serializedProgramBytesString: - serializedSignature: 65b061db76297496860e26123537bafd62412ca01b4d60944576e1716c79238ff80256b83bc706ae9ec0b9a53987cf7bd48d4892034fbab232f4db312f085508 + serializedSignature: d016c13f6537a01f18fbfdcce603fcc4744d855c08c5cc3b5ca9326abe08c763aabbeea9d1cbfb06a567c53cc20b8abb677f224052500cb9974dc53461c0590e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset b/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset index f13e666..ac4a0a3 100644 --- a/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset +++ b/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec7d079c1445f376efed91832051e2a1840309470645c9490191242a48ba038e709c7747120366cc593083398b39e79c31bde68c39e7acdff44cd76e4d6fd7eeccf6f432c3f7871fccf6f4ccd3554f5757e79ebc1eccfa13eb6afd378d4d62c35977369515b365acccfa35dcba2eb5fe3a21b83f915558d705d6ff73acb8aeac20c39bfc4fa75873ebffb156a89255596f2e67f3ac6ba91d3f999558bfc75aef9658217e77bef5afc47a2a966fbd34958d60fbb009ac59ac49068869f64b95e25e8ceb15ab69fd3f8cadb6624b6ca178223deca866d67f93ad984a3b6ea925343c77209b69abb5d48a9b67bd53c1965898736dc49ab32f63f60fe65cfa886b5f71ed6dfdab257ec7c5ef9ae2377e9edfe7dacd48f36c3ff42c60f6b7fe55b3fefd2ec2039c70cd11223cd009c71a4b18b511c66ee2babbb80e12d73dac7fd5ade4fff0207fbab806ce35f69ac0fb13852d9d63231c19f3de10cfef29ae43c57530927598b80e11f7acf7d61c23ee0d17d75102ff4d91de5f28ccaf6f89fb7fa330bfbe2deeff83c21c6f6432ad73852e0cf86d8064033d5f97f47cddd1336fa3786eb4f4fc3be2f97f51985fdf15f7ff13cf8f45f7f9f53d279e9b4d22cc9f1b9394f790b3256ef712d7bd15dc826da8b81d27d2f89f483386c2fc7743713f4f84c78bf8f7117e4371ef03f16c1c3d03f7117ff9f96efef29748b2c07b229ff3ab49f9fca1c4eb87e2fa8678be3a0a5bf8f1e71c9de3af3ad77cc8e309d2fb603f7fa1307f6ea242d78f90ed9c8eee21f92d6fe6c85343ba3f0885797c4d215f2b11bfaf3b2dcb7b25d2da70b2b837093d23c9c6a6487cd792f8feda9d9781e631e4413e0a5bbfabcf9670e0bd8fc5f3b551985fb7a2b4419f4f92f7ec78b8c7af9f0a9c3a28ccd31d40a4fb9994ee67e2b969e23a55c4d795e2f793f24e8e9f2eeed7f396e7dcb4edf8fd9df0d089525eb675f3cd0e10d7d62cd53f09ee13fe09b8ffdbfd5ca22e3ad0ad43227ea65b07d6c8c1a95120c250e7d447321c24ae4dc47556d266d7d614f7b2ad67663b3835c086c09fd561deea6091c7563326fdf3e930845d59ad83ec31ea3a3cd65c98e6d97ee85948679ea33f031e7b8bfcfd3cf98cfd3be6e0db79575fba5f4ddcdf41ba5f9db85f83b85fd37d3fe12bbe40b27ce17e27f62573fb842f1d396b174b185f31b71faa26e1417c0de9bdafc57db0dfead27b5f13ef7d23bd57437aef1be2bd6fa5f76a4aef7deb7e0fee277cc017cce5036a7515f1c54eb8f6e91e6c295ddc7c91cef7229d8628ccafdf89fb3ba230cf8f9f9df4ebb417380b44fc0f12ce0fe971ea8c4923632973b7634b246e7f946ce5478179ba90ed2964e73cfe27e6f68f25e83ec66be4c6ab2bea0f6853e6d561ee36d922b75c109fb005881f84d2c5f1220ff29a31575bc50ef3eb8e447a8bddf129e9415b698114bfd4fd5c5e7311df580a837f56e50df87bc88b9fc53b4d51d8e2ae7e4106eeca327007f1417107781477104f71b7ccfd5c56dc81ae3bb1a4dfce976cf23781d30c3d0bf779187c743e0a5bbf77009baf26e1fdc2dc6d985fdcb8792ddcf176985f5b221981eb56c97b763cdce3d7ba02a7390a73b90e1518d525b9fe90e4fa43920bec018791bf49a4d7424a6f23cd3f60834dd961e463eb836f2cf7c725ab48e58a55a27bcbc5b50add837aeb57740fdb806817f5dd2ce20e1671bf279fb7df45b661c7619b5de18f7b971e0b147aac54e801f5e89f0a3dfe4aa3c7df488f3fd1f31087f55825ae3524fc7f243dfe51e8b1daa31e500fffabd0e33f5a0fde0c49e8f12f7a1ee2b01e87886b4d377e5eccad871dce560f819d9797aa471e9409951ef9c9e7f3f2d0f31087f5106dd3842f6a88c2d6b38dc648cf41fb318ec2b81c024e23374e63a9cd95d003da9db589f89aeef83ce0a49624472d498eda22bea55bfe943a6a272407bc87e35bb9df4ff8aa8628ccf52b979eab27c90775ed6209a7911ba709f45f65bbaa2ff124c7ef20f124daeb790d2439201f8027180b90798278a85b774272c07b381e7892eac0bc46cc5d073692f01bb3a4df56bd0ff1adc5fd35c4734da4749a48e93495f4847628afd36aa167f8bdc358a26c3585b67ab66df32304761bc96eda886b6be66a53db614bb7a6a2fddbf42181b356c4b79570da66c0d99a46c62399bb6d7e3873979102e66e9f143898cdba3aef3583fe1cc4b773db1ae0d9f7315e23375e73a15ba27dd99fb9db7b47497289f8840f83f841285d1c0f793080b9db97a2ace50d24d25bec8e4f490fda976ba5f8a3ddcfe5edc6dced4b08fb689be7edcc5c6d733b6c71b7d37d19b83b86a5e70ee283e20ef028ee209ee2ee58f7735971779cdbfed83a96ac3f853eec04740fecef449628f703c518243b5ea4bb4bf279fb378f13637379ed854c6d50d8ca9b16b3d3c87892b842bb14ca4a07e6f6e31d44fc298af44f453a40bbf434744f60e77544f7209d4e495dfb89710226c69af30a515a1dd1f31087f30bc62eaa4bf89d253d3a7bd403da41580f819dd745a1c7ae69f4e88ad2ea829e8738acc719e25a43c2ef26e9d14d430f68637457e8d1238d1e4528adeee87988c37a9c29ae3525fc9e921e3d35f48036582f851e304faad2a30f4aab177a1ee2b01ef9126e5fe6aedf615e16eaf77ecc5dbfcbef433cb423ce72c7b3b3153c9c93d4a58d97ba3e5d1cc823fc4adeee429e5a286c3dd3e6ec3458e78a2bf8f241cc5d3f0f121862feab6dbe3bed3c310f9c2fe1d9f7315e23375e5b9893863a661873fbfcf5e83ec61d2af0da4a61f0ddd096dc53e0fd89c23cddadeee7d879e2ba41e0d495e2cf97d291e32f10f7a16ef552ef0ad912be5dc85600f5c38552de5c94b4195e45f36bbbad1236d8ec60097bb0c086fedcc512f62549ec2eeb086ca8778748d8431cec76c0c946097b5312bbe308099bcaf74bdd6993f95f9021ff874bf93f5cc8ba2df21fcaab94570cfa73723fe52291e608e6f24f09fb813507f01b9ee5d751cc5d7e4739b81d218d6a521a6398db878f9170c74af1629d41de68248358b390b797c4f95e4edabb88f1b35d664b793f4ecafbcbd07d2c23cc81b795c24d1cdc0e1f4879bfb724c7de8e1c1dd689e72e77f399c8871a19e483f706b9e313ef41fc62243f8a074e13ef8f97f21fde5f22c5cbf85748f601f8900f1398bb5d3dc1cd5b8a3e574abc427ad0fe827c9828d9c244c956f665ae7e7d02ff2a291ef0af763f973789b9dae5becbe824225e2ea3b25e9325bd264b7a4d71eb95e0798a1b37257f47a2fce5be1bfc3be507a09d11840fd92464803508b20f99c692e5771a7a965ff7636e1fb29f83db05ca6535298dfd25fef697700f90e2a18f331dc9305d5cc57a8244d93dd049bbd33827dd4e60535046674a367d19ba8f659ccddc3e04c2c2877481f94af021332439663872747e4e3c778d9b4fd287c8f2c17b83dcf189f7201e7cc826773c709a78ff2029ffe1fd2552bc8c0f3e64aa840ff9308bb97dc82c376f29fa5ce98e4ff121900f73245b9823d9ca5ce6f621807f95142ffb10f15cde3ca6e743e611f1940f01bd8a25bd8a25bd607e127cc874e97e3df7f389fc9d86f297b7a336207b33ed432e1132cc676a1fb28025cbef02f42cbf2e646e1fb2d0c1ed0e7dfb6a521a8b24fe1649b88ba57868939622194ac575097397dd254edabb8af1cf5d611d0a94d132c9a62f43f7b18c0733b70f81b0f021dd619c1b7cc852498ea58203182fbfd6cd27e94364f9e0bd41eef8c47b100f3ee412773c709a787f9994fff0fe12295ec6071f325fc2877c28676e1f52eee62d459f2bddf1293e04f2a142b2850ac9562a99db8700fe5552bcec43c47379554ccf875411f1940f01bd964b7a2d97f45ae1d62bc1f30a376e4afec25a05e143babc83ec2d5b1f228f3dac64eeb18795ce333d1aa4c1ba8eb9fdc92ae6f619ab04c61847ee1e6bdd69e7ad66eeb187ebd07d8cd748c2fb99b9cbd721923dae47f731ee1ae62eff10f632e64ef95ad01dcd1925b885740f632eff9b7728bacfaf30be9e8fc2d6efbe55cced6b016fad64676b25dc23a5f823c5f50824630d09f368e99da325cca3dcb69bb09b4392987947a17bfc7a8c78a71d0a5b7af52c773f0f73dfe4f31b91fcf8bdeb99bb9c4279049d8e95743a56d209f27f27373ebb41848f93ecf346e6f673c7bb6d21ef78f41ebfae93ec779da34faffbdccf25c6674e10cfef8cc2fc7aa2b8bf8324df89929cbbb8efdbcfd572bf033ad8ba621f0aba0d42616ce7f2fb4769be7face6fb6b34df3fd4dffb89f4ea6578be6586f46a67f9fe1acdf78fd57cff28cdf78f70bf0f653051c7013fa28e2b2a64497f8bd3f153c7816f3e9925cb01b4354e11380d51d82a9bfd9648cf9dcc5c3e20ef64b73c79a74a765685eef3eb4922bebd847b9284bf8ba377bf93dd388974241c78df5e2f84713a48f10723ddfdae553f55e2f134e6aea74e7338eb5fe8c8de7fb678fe14117fba9b3bc0cb3b5dc26b24e16d70e3309c7f2a7921bd33a53c3dd3c11bf0bdf4dcd9529ec2fc0a707d966463a7a1fbfc7a8694a720e778148fc20c6ca4a3c403e09d23f17a8e90fb73f7f309f9ce75db1ce02470d74bf29f82dec3f2c9cf7774f27120b4f94e53e8856d107032e54f3a1b83b1a40d0803d23b8fa5b6a9c41870def9ccdda63a0fdde75768abe7a3b0f57b77b17e35d1a6023c18ebad8dc218f762295eccc3e45d826484fa7a63f25ede25e81ebf5e28709aa3b025d76e8f098cea925c9ba4743749725dcadc6d18987f39514aaf8594def7120ef05f2dc911c425ecee3ce6f2d1030f45eff2e78ed7b003211fbb49036333c24a8701cf43f9b85923cd5b10969734614ddcad1a69de86b0bca429d637b0db35d2bc0361794913d6c8dda991e65d08cb4b9ab00ee36e8d34ef41585ed2146b2fd8bd1a69de87b0bca429d679b0fb35d27c00617949b3485c1fd448f32184e5254d588ff2b0469a8f202c2f698a3528ec518d341f43585ed22c10d7c735d26c27ae4f6860887e277b520383ef53e175eb000fcf423b8dcf09e1f618cc275e26eec3f81bb40bae40f2c1bdcde81ee05e29e16e46f7f9f51ae66e23f0b0f57bf83a0907debb99b9ebe29bc5f51694368c8b20ff9e770bbac7af3730771be00627dd61e50e77c36713e9df2ea57fbb78ee6911be43c47742617ebd4ddc2f44bcc27d7ebd4ac4774661cced4dccdd4ebf49f054e09637817b85946e6bf7fd447be20ae66ec76e96e23733577b63e8d5120eac8bacef4e9f7590f0c5b8087bc61dcf9e658936cf85274b985da4b43a89fb79d27d18bb015bdb1985797ca1fbbd449e02e771e6e6bca364f330867f35511654767f2d61f7303e4ed8fd5eab241c78ef4ec9eeee0cd6ee472e74f260af896efc8c767d9ddbae13f90ee37f77b9ed9a7594f482f8d652bacf31f7783cdc7f5e84ef91e4116d86bcbbc5fd5d5198bff7027397a3ae286ce93f1afccd8be20afbbfef48dae720d8bfdf09c98ef306e66e602e04ca108c913643611c2f8f73c9ef433cac91dc42e4d1bd1227f78aeb7d521ebd84eef3ebfd229ea1307f6e4c527738e724611fc0ebcb22fc80c4eb03c29ee11c8557245eef4a62ef0163d1a0cfab22fca0a4cf83e2fa10b279f0a78f209b7fc8497b0cc80abef0e1649a63608fc478290ee7ebc3e2faa8943f8fa0fbaafc97f5784cd243b44df2505bc3fe6dc93c16fad860af4f24651e0bfde697a538f8cdaf4f8ab4bab96dc9becfaf4f49b6f894646b4fab6d31f13ec4832dbe46d8e23392cec2efe73debb6c514ae9e93de136b45f29e4779fe3f840571fcfa0273cf2dbde0c18e33d47723368af8d7c5f50de7fe20e81789fadff6dfb5d06f6efb7026d09bc2ce717f4cf50e8fbb07950b5867f9963b2f12b2421dd34c8a87faf03a29fe5a741ffba59d51189709a82b9aa2308fbf2f29e39e620d0683b39cc0ff83cf8aa33096fd2609fb2611ff00c2867542e9daafef4a3abf2870dba0b09517e3a06df181b8c2594ee8fca0f1b057f043717d87a56f8343daa0d31629ed2d4edae361cdd7c752da9f207c389fe6d3a43cdc44ed7b5b3dc8530da533c5e3f3ed8938ccef47924dbcc4dced9697848e570b4ce017ece065b71d005edecb125e2337de04f075a0cb8719f2a29384ff0a73b79744fd93f72a4b6d2fbd96bc97f72abac7af701e571d14e6f2dde5c6cd281ff0f73a7a0e3882b39ae2e819b8cfaf70fe563e0a5bbff781318b4ed27b94ee6f29747f1be9fe16bac7afef48babf23d2153e14d2877413e500cebb123e74c273cc1f57e9ecf11389cf77256ede75649c28cee99b08651ab88633dde26ebcbcf724bc46121ef856b0c7ad1974007ef1d95d9f4a3c7dc0dcfee203919638ff65dfc6d27be3d3bfb7af58bf0e6da2846e70d6556d14e6579c0f20ef47c97b791fa27bfcfa3173f71d3e16e9c25a10e0782bc1b1f063799f20fb40f2e66592f75385bc9f21793f45f7f8f573c97e3f77e49d54e5c6cd9897c0fb172cb5ecc2994a71f40cdce757382b291f85addf53600d9f6c137046521b14b69e9f2ccad2e442e9bdf119de83fab950928fe2f81b05c7df228ebf41f7f815ce1e6a8ec25c3fc85be009ce40927982391038db48b6891f32c8fba342de9f90bc3fa27bfc0a67e9d441612eafe8ff42be807c897cf982b97cdaa4756e3932da503a9f066d69c8cb5f99db07fdeac83815e6df616c00ceb189bb71f27e9370f251985f7f41fcfc22b037b8b1135870de496d1486f7acfb897599704e0b2a8fda3cc0192af9286cfd9ed6d8c98369d0de013efe24f8f853c26b24e11de34e977d9e410799a3bf248ec4192b79e8fc95846dfe83b8ff1bdde3d77f99bb2cfdebc8b75f7b7ff241fa296328705ff497f8e3b8af6587f973ff31f718ca7f285dd4b7d4cddf78cc9dbf7698eb2beabfe9d05f127cc7f3d4f91bcf93f01ab9f1a6435f1fea6eecc73de42f83b25f3bcd3be9f486f32bbecc906e3a0c58f3f7950686f0dd0cce1dfd0e61093fcbbe6789fec76ce8337debf0b8ffc9cefdfd37a649eb47771edb7b0e055e9b8969de0319a12df1934246f03169643ca0c8b97fc08834697511f909f386c22f26d637f99519f6e1fea69019ce7d4a27f35621f3ef69d2fad379662eb46745598ee70b5d764461ebdf81a07f3374bf16facdaf71742f2ede13fd9a783537477158ab21c6e4e3d5457c0f14e6f1cd111e8f2f72e3f32d40f67330960ae749c96334140f621d7c625dbecfbc8ac5c455f88c9890270ee71d817ce0f3505ec6619d629abc9cb1d9b93fe3315a96185c61ac6f73126ff78d22ae9a5b3e764bf29941a25f10139cc740aedbd033a27d1283f614aca9f3cb179ce30be7eb0a1f18afe9e62b06f68ef982b4d3f035f303e7fecc9f695962a2fe8ac1bc8b8a2f381f15d64da9f8827333c18fabf8da51932f480bce53427cc4608d7b1a3e0efadeb93f2b9f4e2b06f509cc7ff9955194d118ec45c232423d9346c659a2ff3feb6a3aad18ac25823938bf328a353a31581f8465847a398d8cb345ff7ff6383aad98e82bc19e16df7e1fda09df39d7387f0eb7135a4bf170f6594f14e6b2822f847361dba2307f5eac878815a07478b85d9293c4bb3b277538f436428e3a921c751c39e60087705e00eaf72979e8e7f1b9741c7616328873d7a03f1117e7aef1ad8a76bd07fd5e215b6c970c697646cf715d7b6bca574f92af9e906fa3900fe651803b389731837c71383fae0f0af32b9cffd61785f915ce8ddb11852d39e64d94de87f3dffaa130f53ebfee9094d7fecd31cf7663c6daa3788ed11f85bde8ec85e74612cfe2ccf362d1ef2e16ed899898478e75f06807b0a620dd9a182ff23596e46b2ce413e3dfc55b24f93a79940fd636a43bb3c64fdf0acedd6b84c2969c25625d8fdcc789c3397cb55198cb057a8b3380137d455177c40a59c2df94c09cd814292e0b7d625d1ccc29623cde1e57b0e49fdfc0b93f3fdddc85ac1b9c1b0c6798ee8aee4b7e3426fa9c2a3f9a781ece9ef2705e49ac3ba18798479cff751a0c590f384b17f4e881eecb7a403951e901cfc3d9535ef4e8a5d663c146e7fe82dbd260c87a48e721c77aa3fbb21e90be4a0f781ecea0f2a2477fb51e0bc5f8dfc243d360c87ab494f410be2536505cc1f7b662aeb672bc65aa9ef0cd11959e091cf4ad8904c66ee8199e465d291eceb3f2c2cd1e6a6e4a8f71ee976e4883217303e76a0237e29b43b1c1e22afada71383793a1f7646edaa6e106700ad0f38031043d83b981f8a13eb819aee666d146e7fea234f61f833641fba48c297cb593f812fdf7d84837461cce9b64e83d99af9dd3f00538a8fd94c018859ec17c41fc681f7c8d55f3b5788b737ff1d634183237ed256ec4379662e21b4bb131e239a8e3197a4fe6a6431a6e00a7237a1e30c6a1673037100fe70c79e1469c25c4501ec4f651f3b514be55217f8f06b88176436d14e6cfef9bd46fe9f4cc32d9b2f0f7519d1d13df3f8a4d42cf20dd13f170f68f17dda730d7dae498382f871588ebbbc9f4136ba1df43f7842d329857b5b0c6419f5fecc98f7746f907ed17bc6742b44fe2684f437c57748f5fa18eaf83c2567e94fdecc68dc1d922f5a4fbe2fb44f11eccdd6e823abb3b73ad838ac3385b97a45ecb60fce400290e7ee338386fb20d0a5bf22e137dba98b081d8fe12dfc0b1e0350e6d820214e6f1aaf1b9d66e59e2bd24197a0919b6a4b10b68b7b651e886bfad047d7568dff666eef66d6f27ad83c1cee0fb4c90ffd046e88dc23cfea1a45e838788770f94de853a74000af3f847d0bbe0436648ef42ddd3078579fc63c9778740df16ca36f007e742d646619e067c4f50aed7205eaef3c1defbb09432c0505949e94300678d50d8e2b882ea43f471cb9bf029fd50de42fe103e25112ffb14e87beea9c01a859e516149f556e2fe4ce2bef886561cce48ee84c2fc8abee9171f9cca23e0c4459b2cd157ece7f05729da98b159d2f3d219d10979e61072cecd20e780a44cb1d9280d88e35738b7b92d0a13e53d364f5c613ecdef98de7ce6de9702ed941291f610e6f61f431cbeaad29c7f02ef266c762873cf290e1518639cb4abd68ae7453b200e6d1d092f3e4cc26b24e17d2e9e17e7c4c4164aef8f60eeb608ccc7789ce78895bae54ce00e17b8d0ff5e84eeabd26f9b39fd0487d026e2f7c4fc4a2ccd38786ca9135efa9087bc5f26e57d3b715f9c0f151f29e5fd4887e71575696c7817e6ede2a3987b5c7394c098213dbf38c3f362ee2626e6da62074bb2823f6128ec276fc5f903b1caec7113bab4437956e521cf96fbc8b395529e1588fbe29b3771680bb741614bf89569b063627f4bec1037560cceeeb1d25b056d1671264d4c7c5b223e56e2676c1a7e562099819fc33cf073b80f7e60ac00ec692f890f7176eb2ad1d7891d81f449332e96c005bbde5bc21567b1ae167ac4d67ac0ad869e3fd2e3f3e9e6d08183a3250ee03cd73628cc65057f091c1c958103c0050ec64bb8e31ddc43a08caef5805b0d3d7f8cc7e7c764e680ed2864117db7d8b1c82eb9ace22c5998c74984453d0ddff18cc3d9b10d51d8c25db350c29b88648635a2e29c80d871ccd5064ac49f8f3054f17ece6086b9837d9372d8bfb9ac62fe7b0dcc7f0fa19f3d345fe24bb4a5e270066d2f290cf3a7c017b4111ba230c7dd20e14dd1e06b3011ef872fe1c7e2539372c4dab9af717496acbc6e0b9e49acdb826fdb7642617e853367774561fe9ed8071387efcc7645618bafc33e27649a89e49da69629d1cf9d25c9046d5b383b55f47162c7a3fbc009f874cb6e0ebf5c925dec1388cf96649fedc80ecfa7c83ec787ecf324d9453b373e57927d1dba9f4676f00747807d9f809ee7d7fd99bb1e137df298680fc7e1acdf5e5258f617909f0d5198a7bb41c29b41db7f4207c2fe633b13f13eec3f06f5f989887fc89b93503ad2785cda32257c41bc98b9fb58c50e076b611e4e9cbb139f8f3810efc6f0d93a5847883f1dbdab8a1767efc44e25e2e12c24a91f6ec7832c504e4a243d4a1c3d8e14b67524f0aee264562a6eecac347a9f9341ef7333e8bd3e83de607f67abe353becd0db6b84021ebf9284e95d605196411df8148f1f3107f11f36cc770d6657ca17807faca30875eeacec3848d2e4eea653f63e5eb51df4befc2d9bdbb3bf97d34f88e4b507c2d84c7e3368a2b9c8b54578adf2461cbf1706e11e4c3e592dc4b58a24cee0ee35a629f5e5c9ccb9b3f48ba5f86e45c22c9799924c71249cea544bc2ce795929ccb909c30d628ce8588974b72c27d74265b7c9924e715921ccb2439cb897859ceab25392b92720e82b6b5d8971faf94e484fb5548ce0a49ceab24392a24392b897849cec4f81d9c9dbb87747f054b2d9720c3354c5dae36499872bc2c03b4eb574a32c0fd556964b836830c2b3dca006325ab2519e0fe216964b82e830cab3dca50209e5f23c900f70f4d23837c16ab2cc31a8f32b413cf1f26c900f70fa765b0f771a793e1308f3240dbe5084906b8bf360d0f376490e1088f32c0f8f591e2fe9ed2fda3d2c8706306198ef428038c7b1f2dc900f78f4923c34d196438daa30cb086fc584906b87f5c1a19366790e1588f32c0ba7238ef77b0747f5d1a196ece20c3f11e658079ae132419e0fe896964b825830c27789401e66860de0fce246d8ac256dbe19c0fc473f21c0d9c515a1b85f9f514243bcc17a1efcdc54f41f7f815ce0dad83c2285dc04d996381fbd0ff8336722714e6d73350daa29d1d3f1ddd83b5aa50b79e958c4b99938534a1bf778e94a6680fc7a1bd5a88c2fc0a677dee81d2c2797bab3bef12f19ba4f7e5f84bd572c2191af1f5929ca2dd1ddf20c929dadbf1f3dc72a6d8e06d196cf03c229e92538c77c5cf97e48436fb0528bf443b3d0e6761ee49c8787b06192ff427630ce6612f926414678bc62f46328af344e3e25b0f29edf84de8d94b1c7b3ff56b22bd4ba5f4c499a0f1cb10c665e2ba91b9dafebc28d95897a0f85a4806cc179ccb54578adf2461cbf1145fb0ffe772497e1897b902c922f61fc4af24f8ba1a3d7ba5c3d7e9ad88f4ae91d2bb465caf4518e2fc9238b47b055fa7c35ac74b507c2d2403e60bceeaa92bc56f92b0e578992f181bb88ed0fd0624c37542f7add2bbd74b7afc2ee9713dc2b841d2e36e49ce1b243dae27e2293d6e64a9fe1f9d031bbf11dde357a8d7eba030f2ffb17bddf99ce0059df31a7b80a96d509cf31407bfda0985f915fc58210af32b3a0b2d2ece3d8bc1f99c16bf17c3bc9e38b7228ece628ddf2cf10be78bd595e237210c553cc52f94d32128ccaf608f943f7c88a5f7877712f1941c70de5a6f14e6d7bb33c8f1700639eef62907f03b1485f9f5de0c723c92418e7b7dca01f9380c85f9f5fe0c723c9a418efb7dca0165a10f0af32b9c81369890e3b10c723ce8530eb0b70128ccaf0f6790e3f10c7250f623b76fd38dbfa9e6099f1071b04e16da4e6027c35198c73fc512fe6013acd910679bb1112ced9ca4f2de44295dc88f1128ccaf8f26b163e22cb4f8e3c97b763cbf3e21de077c58d782ce838d3f899ee5d7a7c43bf9286cfdde3051c286f79e66ee3e80903d26ce538b4b67b7c5e1cc4ea817e00cb791286ca5b7fe1df7f37198c71a85c2a037c619edc6d950e8962b8ece7e8b8b3930b64ffabc025d13f3c7702e9ed847b43edfad53263ce53df18dcb389c3bd71085b91ef739696dd82aa53529435a800b6799c9b6b085a5d6d52fa17bf01c3ad72afe1ac2e45738972b1f85addfe737976480f7e01cac31288cd38733a746a2b08577def748669c1f70565a4d375e1cce031beb4e3ff1de6bee7c3c6f80a4d71649bf36927ee56efd32e545426ee0f4150957e8793eecfff398c7f197247961dcac7d9abcf692af70f6563e0a5bbf2f04bfeb375fe16cb291286ce15db05592ff4d24d39b19f2fa55775a7138dfac835b362acf2f68e0c6c9589ed2d529b06ffcb92c30203ff0b96ae043df66aeb21b87f3114127385bad25c280fbfc2a9d6b1617e7905dbcd9fd7c020fce35ab29c9f1be24c77be83ebf7e20a5f38148679d8403f27d289e6f26c503ee47ee78fb79b8cfaf1f33f778d5c722bdd9447a5b33a4f70911ff9614df9a787fab3b1eee2b79b56cefa242377ee2b9b7dccf5db891b69b189caf0b6ba63e656e9ff2a9c3c925b0274cd4793138773313ae98378b7f26e18a3d2597c03ac1177ce2427fff7309f773812beaf7d88b3e71af14385f48b85f38b81b854f4cec69f48a2bf6f5c7bf9470bf14b8b00ebbab4f5c28f75f49b8e26cb78db00e6c8b4f5cb0a5af25dcaf1ddc4d20e74b1e715ff6f69cf25d7156631c9d071713755c1cedf78f8b73e0e2700e9cec1bbf47cf7e8f9ee55738f32d1f85addf97b597b0e1bd1f99bbdd2ace1a8a417df21373b75be10c21a8cb7e66eebaec6727bd4bff763f1f47e7a3c57f413cf02b9ca9d61985791a301e0f67b2f544619c869039fe3b4a03c67d327cf3017848d8099c0f217cce26380f748a373cf7bd6a31fb3c9a31ac84cd61e5ac877d400ed7729a55bf0e67ddd95456cc96b132ebd770ebbad4faeb84e03ebcd995156478c73ec78bffc7ff74b293ad62abad574b9c3349265b814aeb5689f53cc7186bbd53c57ab35e36f6522b6e9e855361f9b9523697ed649f4d03a90fb7ff9f633d516a83ee959f92c4dd294970e196587f4bacd7aaac17b99095d6fdd1d69d32eb5f85756f9e151e675df95bb3594f76a0f5d78d32cd4a76095b6e85a658ff97db78b32db1539fcca4d24cebaefcce240bb3cc966ea97507082db7c24b6c0927dbffafb0252db1a51f6bddabb2ee716d16b061d675959d5aaaee15d66f559a5304656a1967faba1fb38f22826c1a6169c3a5ef61dbe2ffe5c8b6c8114e7df5bdf29d6298dfc3f6c227a6e4c4ff71e83819be1162acc0e869531673ddebc57af0a0bdb14d57c7540dd5f6edf0ddcfeacca4d345cd0ccfee96b606c91cde7dc19bdf8e39fb869fabb955ebcd7a54e7aab5caa05a3a62395ea17d72951f15aa55cb2fe282caf4c754f4dbc7a04dce21fdce73a5f673fe33a0ba5df9b933c03e7e6c8af56395f56f895dfa4aad2ab4c47a65bcf55099f56f812d6e4a0e1571b81a36c9a955682641299af35434db3dcc29dbc4ca0fcce0e1d444d74c689124ba87dd2e6a9ec61ca9b4ec06539e6835418179637c9ffebb170ddc544d9d2fb5ed7cc926352a67e2aa9ca99deb0290d9e3a7cb973a09bd92f9c2ffa839ac4bd87626192806f3550cd6d936b6cd65cfceb6f9b449378943357ff5d3da603a092806aba918b4c719a7e690c17d2c0917897662761ceee099c30636873ba568e745068ac5ea0a168b388b0d5562d592c4b28fc35203d7a08077d404ae490137d204aea532a87ab92e923c6e998dc22b5cffe6c4776aec2abb35b53d3521ca646611286baaadca1b4e6153a55472e634a133a70e85dc4c17b92e85dc5c17b99ecaa0ecd30c73df4acfae8ee4bea699e73ab2054bd7c8f65b43d657b167cf97cc30ca5eeae011fc1a66bdbbd0e261853d22b0dc7a5f35d8949ed1969ebd7d2b9bcd02a61a02f32711c5f00e2acbe7b4b7a6b25d36fe16b4f1375081f314db7871d3ad68e0862abbb0535b6cd42ea65af79c41bd91766ca93d1294c45c6687cb501d9cee0d6e0be3ad6bb125219725bdd5b4658a3e844d043fd0c9ac64dc02ab33f1a706d1c568671bab79612853de9172e23b2b9c78cc8f136f4421efa25b3d34a64a487bcd12d28402eea009dc94e2a2a32e17cd28e44ebaf9d75ce52e6c73c9ed588d33fcc171fc57c37cd6b76d8a3f2e18aa2e8b9d19350c935e06aa6ced44e54d17ddbc69415540bb065001b55465bc5d9a4b8d663cd4be93d908b6b725a2caf555bac6d6f0ef91166a859d29c99a1c90d21b099f9e6dade0cce64d6928dd6c43e9c698419929a36a45657df700b2be3505de2300f03614785100e06d29f09e01801750e0bd02006f4781f70e007c670abc4f00e0bb50feadafc2bff9aad5da53c8fd74913ba890791f991fb097b18aaf4f0377a480076802775201f366fb402fc0ed68e0420a78374de0ce0ae01e76a38def48cf650582ddaeda310fb334acb453865f0e4af2cd899624732c994bb2a85a765731a9ac52f8da9042fb84d06da10555d9745199086f03f2ad8aa90d2b4551ec4c9bc9ae5421df53b79077a59007eb2277a39087e82277a79087ea22f7a09087e9221751c8c375917b5286372200c3eb45818f0c00bcb70a9cbb77be9b42b7c6eda302e763c7a3130f27c1ffb3fea480d7a5c1fb52928f51485ecba7e4fd285319ab30155f7da1fe14277b293859ab123b0d270328f0bd15e0a7fb041f48818f53806ff409be9b02bc873dc07124cbed28b07ad9e1684b339e1a9e834baddc60ddd924eb3adf9682dfe752645eae98be6a1e9fe0078d0cdae3342399f7c593e6b5e0874ed6b68796d40d07be01aa30643253cd89dd5506cfe73bf98eb79435357c98761673e64078fa6576d4442b059e9b63c5e0674a99a8419789419487db57e1e1623e3ddc1eaa02670fcf956dd302c7c786f9a2cd4afbf70a91bd53ecb4934b8b748a129f94f3378032d936da5e1e8c3608e92973dc93f2bf5314fef7d0983fff3b98b275bec82263ef2a8d110fa16ad2698a9ad457a36b2825f27eaae2e90c7f41ff828f8ae2856e05f6f45aa5752db363f9ef4aeb175fdf3dc7462fb6eeae40ef97a31e4a775f8c0ca31899aecbc870ca42f65758c8e73e2d64840a9ccf361ce0c542d2cc368c5479227b38dfec00aef719ac6027f90e54f1a5f43b33180cdc9a9395f236a354d9cd6d6f264b6d8914f196083f6b29cf967b962d77f73472ab2a75ff92a758d93eb4958da6cac66c45d9d890e7af6c8ca15cd11c4def3996029eabf2717c906b94bd40a02cadbf2ab0eda5c0dec15221ec66372bbcc6ea221fe64bbebd2856e729587dc327ab7b53ca17ab94e76e75b8adfc125b79eec8abaceb7cdb888a2575d339f302bb8a4e8d9d6b6ff8596cdd59693b9c25289595b6812ef659158ca30a590955c8e6270ad9828cce618a2511afe42aadb7b8744b0d17b1f12a6d787b959f80a13b963081b2b45285a5b5cff76769fb5075db22cdba6da20a98d76d8bbd00cfa081f7a5e858a2a0e3749f744c5280f7b0a78773b9a06da83dddc80b9eff99f4a52a7a95756c19532f664b9f3a556b4e56650b676e9997fc2ea3b3648a2a4bec79f55c2e6f90ab6b7f9952ee39530e66eaa50d99d2a7b2652ae5672b283fcb0f3516e3183e3ce034aac6aa52d558dc35ceb2fe1659ff965ab756d921a796e2cd233f35c97e54cacb552937484979ace5f3b34f7d3a95fa0a55eaf550eab3ec111b5e0b39b95ce12bddfd292fb852e105cbabfbf38207a8c0799ef143a2e5ea4c397a9da63a3b90b2c8d594451e929545cea072668d2a677674d905ee20676f1b3329090e5549d0d8651bdc53553172779a0f290ea22ce53085a58ca8e1cf5266a9c079f3e1702f5e3f4df3613625f5110aa94ff629f51c15382f9b6b99e638c45c0af9485de479142147a908a9e98f90620afc680578556d7fe0252a70ee4d8e517813fec78f3799af02e7cdcc63bd18609a66e602aaf01ee705384d795ca800ee612fe5cbe5ae2ebc6335bb5d5dc7ab7850b669f85147aa5d5d5e64a0da35a594c59ea0b0d8e975fc59ec2215387ffe44965a45f5b017fa65b767cd3e5c5c1c10c0ba5b7f6aa4567169f6732da64ad6c98a9295e7b3642da1c04f5180c77d822fa54a173ffe3ca56ae48305aa713318b7291086e48c5557d943171552e3aac01e20a962ddaceb7ceb7f67808057a705d63f98afe0883d6dc4f976315a6abfc7b19de1021edfcb8adfcdbaf6b6aeed7c15fd32caae4e53d85511b7abd3f50c641945f3192a9a67074273f664f2b1a485c2b739d3127cf46a89c0e56763148b298902f17eb98dbbc096824f5bf8cb8e72ca879ca9f021331af8f32107abc0b99738cb4bfd91a63f5c41019fad095ca902e665f81c2fc007d3c0550ae01ef60ae67d53bca6b91acfcba924ea9aee5c95feca9a8e7f40a030d62445abb4077710ac2d576507678d7f8da0966c9d2affbb9ece921594e99fa730fdf60dfd99fe4a4af2f31592d7f029f92a4af20b14927fed53f2d52a702ee1852a7fc954a2a7f1378750a25fa410fdb61dfd89be8602bf5801dea0a93ff04355e0bc2dc04fd2d76dc21f46816f0c00fc700a7c5300e047a8c079e7e3522f1e334de7632d65879779014e638247525672b9c24a7ef6692547a9c0f9f35730a279c30fa6d468de1c4dd17495aab8f27914bfcd1b5e1985b125790c45f5d514d5d7e8517d2c45f5b52aaae7064675745a93c75145eb3a45d1aad9c25fd13a9e7263d707e0c6d651e03704007e02e5236fd4f49127aa8079fedca4e9234fa23272b3ca47faccc89355e0bcf57eb317a9d3b4de4fa1806fd1043e95b28e5b03b08ed354e0bca9789b17a9d334134fa732f1764526ded7d25f269e4181dfa1003fa6953ff03329f03b15e0e35afb033f8b02bf4b01debc8d3ff0b3294bb93b004b398702bf2700f07329f07b03005faf02e7fe871f279c5275f25d127eabce2a510dc28a4e3fed137f95dc064a97fb55baf0880257aa7ed23a8f4aeb01555a78fa6c5ecadac0ec27f1cea7a4785025857b1ad16946389376d94b700125c1432a096a333c8db89f6d19553e6bc00b292ff1b0ca0515f8f312175165ed9100cadac594e48f2a24bfdaa7e49750923f1680e41b29c91f57489edfce9fe49b28c99f0840f24b29fb7c52659f7cc3e081c297cdb47cc381c20fed269aefcebde9f6b51bdbd3fa7f24f259f36c20befc904f8b975bf716dafe65953d1c5862df2df6e9d32ea3e47f4a253fdf1a93940876f1162474da4de833533138eef86cb92bb2d47ea2524c84399d1a47bf4ae60c6daeb6dff4a3d3e52a9db8813c9d8890fa87f637a96a30e74f77e78fbf2ee21594913dab30b27c9f46762505fe9c02bc9a4ff0ab28f0e715e0d57d825fad02e744bfa032aff69e8a87d3c3ed615dfb887b4e5159c3fa8a67fbf95cce7c0d65302f5206b345db60aea5d27c894af365ed34afa3b2fa95003ce1f52a70fe3cff8086ce0cca0d1453af514cd99f9daa8699f2c7d38d144faf07c0d34d14f81b01806fa6c0df0c00fc6615383f72897f9e88dc5a2727d08d4ee0162a81b7034ae0568a9e7702a0e7360afcdd00c06f5781f3b555fc13525a6babeea090dfd745be9342fe4017f92e0af9435de4bb29e48f7491efa1903fd645be9742deaa8b7c1f85fc892ef2fd14f2a7bac80f50c89fe9223f48217fae8bfc1085fc852ef2c32a64de51e79f29d33d45e4110afcab00c01fa5c0bf0e00fc310afc9b00c01f5781f38a807f724cb722788202ff2e00f02729f0ef03007f4a05ce3bf93f241e4e82f719eaaf93ffb40a9c3796f927d1945b11f842f755f63604bee37b893d6ae87c0aca4fd7e1194aa99f144a6d1dee4fa96755e0fcb436fe6d399dd3da9ea3d8fa45c5166f81f1513c3e92985c943f99394752f3b10758e2e387b9e729197e55c9c09bf530b2e74d16fe7485fda41fa95e5048d5c33e1332f787baf3f388fc2fd8e2df046c24d197472cd9e2df06a48f74a7d2a7166dbda8ca515e16fe5094856346f92b0b5b28f03f15e06b47fb037f4905ceade42f952dcafbad9727b6d6bab7175722abdc4d8c8855b23db2d86ffdb24a3e6e957f2b323b960afd3b0dfd0ac5eb3f0a5edff1c9ebab14afffaa7875f6b12e632bd938b138811fe5b3da1753af51eafca75067cc5efed4f91fa50e5f0e97a24e67c94cf839fece2a0b3f66c20b201ff4dd438c85f921e3758a8c584c3199ef938c3728f03c05f8e93ec1dfa4c0e30af0c77c82bf4581e72bc037eced0ffc6d0abc9a8a739fe0efa8c0f98eb3ea31bd1d67efaa807903a2464cbfe1f71e055e3300f0f729f05a01807f4065666d4566168ff397991f5299594733333fa228a91b00251f5394d453d9b74f4ab65294d4d7a4e4138a921d02a0e4530abc4100e09fa9c079ffa5614c7368e0734aec1d0310fb0b2a271b69e6e497141f8d75f9f88a426ea28bfc35c574d30098fe862a90cd1405b26a7f7f05f25b8a93e6ba9c7c4771b253009c7caf02e70da5165eac2f4d8bea070ab8a5aa05d8d00e265b7abc6537c70aadce7a59d08f5466b752b58b7c66f64f5496b40e204b7ea6246fa390bcf901fe24ff85ca96b65eb285f77bf9daa4aaacb3e5574ab9028572ab7c2af71b952ded02c896df29c9775648fe9c4fc9ffa0b2651755b6ec20654b89e8376597257f528ab5572856f3407f8afd45b9c50eba6ef16f4aec8e0ab1bff629f63f547e7452e5c71e647e94d9c341cb1367de3a4b7b56da83200bc57e0267f94e89bde0cf5dc4f8334e1f77a13df05a6cf771f912ce32b1a7810f8ff9c9eb7f29d20a15a4b59fe18fb4ffa8e2d73980e2c7070e9433de5d62c1cc78c75409706a7655f5757d5293a702e7f9d455654f4d53ec09be2b84cb78760712c62935bb29d4fcdca79af92a70fb63460a0b88f9b4806a94e43d1492d79de94ff2ea14789102bcc827780d8a969e01148c9a94e4bd14924ff129792d4af2de01485e9b02ef1300781d8a96be0a5a9ef2494b5daa38f75315e716698a73155b65af53d52dd6f52875fbab1a8d07f953b73e9551031419e5f700911d28c9072a241fe453f20654adb15b40b546434afadd15d2cff629fd8e14f82005f8313ec11b5199ba4700a5af3125f99e0ac9dff0297913aaf40d5695be0652e9e3f326cb5879d6cde5a6946a4314aa15cef2a75a332a5386069029cd29c98729243fd4a7e43b519932dc4bc7926f79592e96c867972d2d28e546a8ba673e956b4965cbc800b2a51525f92885e405b3fd49de9aca96d15eca0a1cec9c6da6b4a1541ba350addca76a6d29d5c6aa54b3c7185821ea3df1be58675fea1450eaeca550a7cf1c7feab45381f39efede9ae3c03b533c8dd31ce2db4505ccfbf6e375fbf6ed55c87cd1d984986ad1d9dac17e169d75a0c0f751822b244f03de91029f180078270a7cdf00c00b15e03deccfb0f223de72ff9589f1cc19f898c49ce11467f8a422e06f4d4c529501e50aa0c9313e4ac23f91675a626ad55067aa204fa10609f93e38befb6db9a3ab24979fb2de85727d5315aeef7755714fe3fa76a5c0a7a91a26f3fd8177a558db4fc51a47806f6bfae1a71b95ca74aa32c2abf2b249b13b45dafe0ad21ef2495a0f0afc0005f88805fec08b28ae0e547155cdce11681efa61a82795ce0c553a7552f2249b347b51c4cd5410b7ce2771bd29f0835423600bfd81f7a1d89a459513eed3794fca0f3f7da954667b2927d9a4d88f6abbcf09a0edde9fca91b98a1c99e833470650e0f314e03ffb041f486544b12a236aa1ec2e14c353fedacebb51e995a8d26bc2928b98e78bc3102c4763fd731c65f6c724ec4ec9315f2507fe0281ae210e5235b00aac60ec0096bbcf68273f2deddc9f6a2f56963f210d4fa56f3c2df0dc785a68379edad84f662f0dd530da832a28a58a82b2a4d45f41d993025fa4006fb0c81ff860ca1a17abac91f7adc659dccfb167111daeb21b2e1e42a5bb245329586ea79a7df91b4aa5bc941a2752953f6061aa6525e37ca53f8ceab496e9765a875386b24c55f5fb3494111478b9027cc8627fe023a93c3998b242e7bb1305763e703f989d158ea2d2ada006a7c0169c5972fe4ef696389a4abdd28f253a4c000f7ed21f43f5e6ab02e8cd8fa5ec65b9c25eeef2692f7b51e02b14e03396f803df9bca9695998c11aacbec8c711c95ee2aaa770de600e9666f8ae3a9b457fb37c529421a3fe94fa09ce221ba4e711fca54d6284ce5739fa63291023f54013e68a93ff07da9f1d8c334c7632751997d783aafd73320af37994afd88cced5fc7c0865a0ff0f6205fdbe427e529546ead55e4d6169fb93595023f5201deaacc1ff8348ab3a3549c39df9e74365e8eb5daaf7e38da8f4ae9e84c4e08a798dd86cee91485c728283c79993f0af7a7143b56a5583f96e953a57076df1cdbfbce65cef1bdd466b102f181cf82c45631678b5857715c921f9a0ea0683a4e415371b93f9a0ea4c08f57806ff4093e83025fa7007fc727f84c2a834fa02c377573320c83fafe761995f689aab49b2b4a8d5a86eccad12c8ae69354a3d995fe689e4da97ab24a55e773432576e998673f5f9c5232e0bcd0425126fc0debcca1e43945258f73fae628e67c6c97975d47a6a1f6af0abb242fb7ef55fa92622e25c5a92a295abb2a356fd264670af32853384d559c7d9a423135b079ba6260d316d2c7c06609057e4600a3a6f3295ace54d0f29c4f5a1650e06729c05fadf207be9032b4b35586d6d50a4e493986b7121548e74cf915f62ba5f633ce7a6ff7311b05a2dae3075866d3b529a528394741c994e5fe2859445172ae8a925d6d8fe42c809f2796c0f3d32ccb6dc5e733676d64491a2a1c12f5bcd6628a90f5aaa68e4f429650456783a2e8d4f459749652929fa790fc429f929751929f1f40a15f46497e8142f2a77c4a5e4e815fa800dfbcc21ff8c194855fa4b2f06e59147ae72c876e76d383a7e09ce6a05bec2b28522e56905273a53f522a29522e5191d28928f694e2d81d38774ba4a2ef87882a8a888d0a2286f824623905be49013ed127f80aaa445e1a40895c49497e99aaa1ea53f25514f8e50af0c255fec05753c67785caf85a11c6e76e075789d390b237b3432895af54a8fcb54f3ed7502a5fe565382a8dd487522676750026761845c9350a4a66fbb482c329f06b15e0e53ec18fa0f8be4e65623c985ce2e587feb5543ad753e9f0f1b789f65caf9f748ea4d2b941954ebe9dce72bb28f849e5282a951b35adf468ca4a6f0ac04a8fa1a4de4c7133417c34c28f0ac752a9dc4c8d521c88c625a6b0e96c1cdb8d51df7ae7a77bfb91e6384a9a5b54d2d4658c4cd94faac753a9deaa4ab596ab5475cbc225afa3d2bb8d4a2f59bab249ef042abddba95130551e27cf75f793f689aab479127778297b69262c4ea294ba53b3509f4c39f0bb5415e611fe1cf8292a703e5375772222095ec4b7dcde6345d4b6794849671f3a9d532976eea546e4f8203d6c082fb3a3a6a2cfccf1454e7cdc6981bda4c7b9e787d4d32879ee53c9030bad7a59ff927b3cc626fa1dd94f349d4ec971bf4a0ef8220e9fe6727ff9227b09cea02478801e9b742448323181394bcfb297e24c4a8a072997901c9b9caaf8d8a19fb4cfa2cac04354197838ab3270b62a9d9656f011453a3dda594131348d5795392bd89cc6f98162dd997ca0e6a3161e9f5fb3ff283e55b08e96f11c2a1f1e4b572e8a022f17e752723c9eae5c1405582ed653123c91ae5c14055c2e3650523c99a95cf0d4168831f9ecd23e8f2a174f51e5e2e9accac5f9948ecfa4cbeb3e01e6f5059404cfa6cbeb3e01e7f5859414cf65aa0be6d90ded2abbcce97c9fed224a82e7337b6167d9c37097247ed2be984afb0555da7c1fc20aed29d14ba8345f54a5c9f7ec77b3fefa49612395c216550a7821c962eb86ce12ee4d54ca2fa952c6cb0657246e679ffaa554ea2fab52afa7b0a4ec1acb9751e9be42f1cd2d8757af2313e74d0c17f7fccdae5e4e35d35f5534d3d71eedaf997e05a5d66b540f2d552d3fca5c4929f33fd5b8e431fe94b98a52e675aa539daa8cd309f4a3d2d5944a6f2854dae253a56b2895dea4549a634f7294dad5073e6ede8f4ad752a9bea54ad55e076d379457649de275548a6f53154499a80a708ac906a29fb4afa7d27e872a032bd09881ff0f0adc40a5f7ae2abd860976f1f4acf33988ecf4bd914aff3dca85ceb173d6597338d2ee343b4bbefc7deef0262addf7a98a180e0bc93ecdcd549a1f5076e59c0537cfb6ace4c970d9ec38ba994afb43aad955a948714ae2143ae70c3a3f12dc4249f01195d370e48433f8c1cfc1cb6641f3ad54ba1f53250a7badee76e9f293de6d547a5ba966b63bbd603eb1723b25c52754b9764ba1fb49813ba8f43f55a5df3425fde0b6abdf4949f2994a9296299224bf40e0e489b3db8e97fde1a26bc6bdff125f32dd45c9f4396d23c14b713725c517b4efc5cc40f9f49b23f750e97e4935da65db8486523607d1dc4b3591be523491469ce9af89741fa5dad79ae3e3f753935edf0430e9f50025f5b79421c062d9715a59f12095ee7794939017eba6a69fddeacc872849be5749d22ac5244b50a300264b9d75a47c5bae5364fd6f93789892ea076f05858f14c3a881ff03621fa152ff91ea65a6a63e89c1e1dd7e527e944af927aa71965a79f96d203d46a5f933d53873a7596c575573b2aaac1fa7d2fec59bbe5559348b9ea0dce0af0a3738e55c7f6ef0496afef137cdf9c7a754c0dcf07ff702dc8e067e5a05cc5787ff11e35f457103b752f9d7f534f8332a701efc33c60fc17783df3fba74e67f038a3e4949a01a9dc0b39401fd956e20cae9c72db1b72d3a3d47bf6ddde7a85ae9ef006aa5e729a5fe512915b78223ed46a21f055ea0d2f8579546353b8d6c869a5ea4d2f94f950e47c8661bf1162a157e12ab529becfcf34b543a312a9d6417ce4f3a2f53e9e4a9d2e1117c9674b1bd476ca54f1ffc0a5546e379a965f4ed1bd7ec33768fb376f253465fa594c957290383e4ea32ea6fd0f63555cadc0954cbd3dcd2fb3faafc57cfd32fffaf5362d7d015fb0d0ab9a62ef29b0ae41e3bf39251cab6c5c97953ec364999f5f67cb1b729d833f36ae579a87617d07cbda5ca09ce576d4de0b729e03a9ac0efa87278179ec38bb6490e8f1633b2fb58bd8f45ccd955106c1ed7f5c2d82c9ab17729c757cf0b701abff61e055c5f13f87dcaaded10805bfb80026f1000f8872a706e9d0d3533f123aae1bda317e0340def8fa9ae42232fc069ba0a5b5505b53d2fa8f3b749413557401bab988a494cd9676f35c9e3676f7561f4c1a53a525267727da2ca629e134dbd6431979900fe94aac79be9d6e39f5156d95cd32a3fa74aff4e0194fe2f28f01601807f4991dd5297ecaf28dfd24ad3b77cad02e623fcadbd00a75940f80d05dc4613f85b0ab8ad26f07754ee15e8e6def714723b5de41f28e49d75917fa49077d145fe892a82ed0328823f536277d015fb17aa0876d42c82bfaa80f9c861272fc00d68e0df28a20b0320fa778a8ece9a74fc4195ef2e9ae5fb4f8ae75d3579fe8be2b96b003cff4dd1d14d938e7f28e0ee9ac0ff523cf7d0e4f93f8ae7a20078e6e37f4a3a7a6ad211a3807b6902e7a98039cfbd35798eab80ed2f8d05c0733e45475f4d3aaaa980b9e7efa7ebf9ab537cf40f808f1a141f0334f9a849010fd404ae45d1b15b0074d4a6c0770f00bc8e0a9c0f720cd21c0da94bd9de1ebab6578fe263cf00f8a84f99c8604d13d981021ea209dc80a26368007434a4c0870500be23657bc3356daf1125f58800a46e4c818f0c00bc09053e2a00f0a614f8e800c09ba9c0f918e218cd31c4e694958cd5b4929d283af60a808e162a70be257f6f2f52cfa0815baa80f9b0d838cd61b15614f0784de0d6544d3041b726684321efa38bdc96429ea88b5c4021efab8bdc8eb2e74901d8f3ce94d89375c5de85127b4a0062b7a7c49eaa2b760715b2fdf943cdce7e47aa0fb39f661fa61345f4f400882ea4e8d85f938ece54bbe900cd7653178ae7033579de95e27946003c77a5e898a94947370af8204de0ee14cfb33479ee41f13c3b009e8b283ae668d2d193029eab09dc8be2799e26cfbd299e8b03e0b90f454789261d7d29a9e70720753f0a7c4100e0fda906ef42cd06ef00aa895eaad9441f4849bc4853e2dd28e0c59ac0bb53ed8225baed824114f2525de43d28a32b0bc0e8f6a4c45ea62bf6600ab95c177908857cb02ef250caee2a34ed6e18055ca9093c9ce2a24a978b1194d92d0fc0ec4652e02b02001f4571b2529793d12a64bed06395976c4cb3d0630cd58c5eadd98c1e4b8d471ca2391eb11745f21a5d92f7a6900fd5451e4795c2c3344be178ca9c0f0fc09c2750d5f7119ad5f73e141d6b35e9984835ee8ed46cdced4b497c94a6c49328e0a335812753541ca349c5144ae26335259e4ad9f27101d8f2340afcf800c0f7a31cc73a5dc7319df2fb2768fafdfd29bf7fa2a6df3f80f2fb2769fafd0329924fd6257906857c8a2ef24caaac9caa59560ea2ccf9b400cc7916e5f74fd7f4fbb3293aced0a4630ee5ecced47476732989cfd294781e057cb626703145c5399a549450129fab29f17cca96d70760cb0b28f00d01802fa41cc779ba8ea394f2fbe76bfafd4594dfbf40d3ef2fa6fcfe859a7e7f0945f245ba242fa5902fd6452ea3caca259a65651965ce1b0330e772caef6fd2f4fb0753745caa494705e5ec2ed374769594c4976b4a5c45015fa109bc9ca2e24a4d2a5650125fa529f14aaaf85dad5bfc5651c8d7e822afa6cadfb50194bf4328a6afd3647a0d057cbd26f0a1141d370440c76114f88d01801f4e99c84dba26720455756fd6acbad75255f7cd9a55f79154d57d8b66d57d146577b76adaddd194b3bb4dd3d91d4399c5edba66712c25f21d9a221f4715933b032826c753e0770500be8e22fb6e5db24fa0c4be2700b14f5481f379ef7bbde4649a79ef9354c0fcab03f779012ea3814fa6e8b83f003a4ea172f101dd5c3c9512fbc100c43e8d12fb215db14fa7c47e3800b1cfa06ce4114d1b3993e2e3515d3ecea2f8782c003ecea6c01f0f00fc1c8a93277439399712fbc900c45e4f813f1500f8060afce900c0cfa3c09f0900fc7c0afcd900c02fa04ce5395d53b990427e5e17f922aa41f9826683f262aa41f9a26683f21215707b2bb8c50b709a25e31b29e09734813751cdbe97359b7d97526deb5734dbd697a980f9618eaf7a01ae4f035f4e95bfd702287f5750e0ff0b00fc4a0afcf500c0afa2c0df0800fc6a2a33dfd4cccc6b28aff496ae57ba96e2e3ed00f8b88e027f2700f0eb29f0770300bf8122fc3d5dc26fa4c47e3f00b16fa2c4fe4057eccd94d81f0620f6cdd420ce479a8338b75015cdc79a15cdad14f0564de0db289e3f0980e7db299e3fd5e4f90e153017e4332fc007d3c07752127fae29f15d14cf5f04c0f3dd2af03656f04b2ba2510a780af4ef34f43d14d35f69327d2f05fcb526f07d14d3df04c0f4fd54bbec5bcd76d9039427fd4ed7933e4811fdbd26d10f5122ffa02bf2c35416fe1840163e42f58b7ed2ec173d4a49fd7300523f46e5e22f9ab9f838958bbfeae6e2139457fa4ddb2b3d4951fd7b00543f4581ff1100f8d314f89f01803f4319c95f9a46f22c25f5df0148fd1c25f53f9a523f4f99f6bfbaa6fd02550dfca7590dbc4889cce29a226fa19063bac82f51c879bac82f5366178feb9bdd2b54532f3faed7d47b956aab57f3029ca6adfe1a055c5d13f87f540ed6d0cdc1d7a91cac19400ebe4181d70a00fc4d8a93daba9cbc4565631dcd6c7c9b02aeab09fc0ec5453d5d2edea590ebeb22bf4719c70e0118c7fb94ef68a0e93b3ea0f868a8cbc7879471eca8691c1f51c08d34813fa6b868accbc556ca369a04601b9f50e04d0300ff9422bb9926d99f51c0cd35813fa7727127dd5cfc8222ba4500447f4981b70c00fc2b8a9356ba9c7c4d21b7d645fe863290369a06f22d05dc5613f83b8a8b025d2ebea78ca35d00c6f10305be7300e03f5264efa249f64f14707b4de09fa95ceca09b8bbf50c81d75917fa5903be922ff4619476100c6f13bd5aae9acd9aaf983e2a38b2e1f7f527cec1a001f7f517c74d5e4e36faab074d32c2cff50c0dd3581ffa572b0876e0efe478d1216c5754709f998897260a9a71736d20c2cc554c09c8d5eba6ce4a990b93df70ec09ee394d87d74c5cea790fbea22575321f32fc3f7b322da7a21a4330d5e9d02ef1f00780d15381ffa1be0c5fad28c11d6a480076a02d75201737fb79ba6bfab4d99c7eebae65187421ea48b5c9742de4317b91e85bca72e727dca9e070760cf3b50620fd115bb01853c5417b921853c4c1779470a79b82e72230a79842e72630a79a42e72130a79942e7253ca278dd6f449cda8c6c118cdc641734ae2b19a12ef4401efa509dc8202de5b13b825053c4e13b81555058ed7ac025b53edaf0901b4bfda5074eca349475b8a8e899a7414a8800bace0be5e8017c648e07614159334a9d899a262b22615bb502e6e8aae8b6b4f713155938b0e1417d334b9e848b533f60ba09dd189a263ba261d85540eeeaf9b839d29910fd014b90be58e0e0cc01dedaa02e783053334070bba52c0333581bb513978906e0e76a7889e1500d13da8a6c66ccda64611c5c71c5d3e7a52ae63aea6ebe845893c4f57e4de1472b12e721faa78976816efbe94c8f37545ee47212fd045ee4f59c6424dcb184001976a020fa48adf22cde2b71b25f1624d8977a7ead72501d4af8328f0a50180ef41159532cda2b22765d0cb740d7ab00ab9b1152cf722f2201a780825f2c1ba220fa5902b74918751f5606500f5e0700abc2a00f01154615cae5918475264afd0257b1485bc5217793445c62a4d32c65022afd615792c25f2219a22ef4589bc4657e4bd29e4437591c751c887e9228fa7900fd7459e4065e0119a19b80f25f25a5d912752221fa929f2be94c847e98a3c8912f9684d912753221fa32bf2144ae46335459e4a011fa7093c8d6ac51cafd98ad94f05cc27bbd7c57527bba753addc13345bb9fb532c9fa8c9f20114f0499ac00752a67cb2ae29cfa0443e4553e49994c59daa697107516daed3026873cda26cee744d9b9b4de5e019ba39388722fa4c4da2e752449f1500d1f328a2cfd624ba9822fa1c5da24b28e4737591e7ab90f9f933ebbd9091e6fc990514f0064de0850ae01e1dac606cb6f5df64b69a558afbddd9240bbdcc0a955aa1122b3c9c2db37e955be12556b8c27a9affbfc20acfb37e555a4f4cb69eaeb09e2a630bd830ebba8acde64ed0fa3bcd421b6e3f3182ed6dc5cdb19ee798cefd8916e21c2b6d8e37d44ea12b2b1071ee37665a7f799c5b522e5985f5fb3c153b31899da2ea56f07cebc9c2587bfbc96024ab46305e4a59df05bad6b788aa022ed4ac0216539ee9224dcfb48402be5813782945c5259a549451be746300be741945c7264d3aca293a2ed5a4e3601570232b789915d15a418792926e7402151425976b52524951728526255594855c1980852ca7a4be4a53ea1594d4570720f54a4aea6b34a55e45497d6d0052afa6a4be4e53ea4328a9af0f40ea3594d437684a7d2825f58d01487d1825f54d9a521f4e49bd3900a98fa0a4be5953eab594d4b70420f59194d4b76a4a7d14d5b2b94db765733425f2ed9a221f43897c87aec8c75222dfa929f27194c877e98a7c3c25f2dd9a22af5301f379bd7be2faf37a275052dfab29f58994d4f70520f549542edeaf9b8b27532da607345b4ca7a880798fe9412fc069d6ce9c4a013fa4097c1a45f2c3ba249fae42e633b38f781139cdccec1914f0a39ac06752e3348f698ed39c45d9dbe39af6763655093e114025780e45c7939a749c4bb9a3a734ddd17a4ae2a73525de40f1fc4c003c9f47d1f1ac261de753743ca749c70594d3785ed7695c4871f182261717515cbca8c9c5c52ae0b656708b17e0c9f422eb4b28925fd225792345f2cb9a246fa2fcdc2b9a7eee522af75ed5ccbdcba8dc7b4d33f72ea724fe9fa6c457a846a33b5ac1d8126672347aaa75afd48a5dcd46dab1a5d6ff1c73a89546b1155a66bdbbccfa5d6163f111dfcc6f8cb7fe155b212e4dfa51ead73d8f52bf618f521759bf4c4b4c8d5e5f4915dc37750bee5554c17d4bb3e05e4d15dcb7350bee3554317847b3185cab02e6c5e05d2fc0dc4808e0eba8dc7b4f37f7aea772ef7dcddcbb81cabd0f3473ef46aad7f1a166afe3260af8234de0cd54ee7dac9b7b3753246fd524f916aa6df949006dcb5ba9f2f7a966f9bb8d92fab300a4be9d2a299f6b96943b28f3f842d73ceea444fe5253e4bb2891bfd215f96e4ae4af3545be8712f91b5d91efa544fe5653e4fb2891bfd315f97e4ae4ef35457e801a7bfb2180b1b70729a97fd494fa214aea9f0290fa614aea9f35a57e4405cc4f1dffc50b70ba53c729e05f35811fa3807fd3047e5c05cc83bf5b112d1519a8ccc46a74024f5035cb1f01d42c4f52e07f0600fe14e544fed275224f538d8fbf351b1fcf50ed837f34db07cf525cfcabcbc5739401fe1790013eaf4a802f2463f97a0bc95ea03889e56b72f22265d679f9fa66bd85028f0700fe920abc35e7da0bd9eb69e09729b2abe992fd0a855c5d17f9551532ff80680d2f64a4f980e86b5416d60c200bff47f9905a5ea44ee3435ea788aead4bf41b14721d5de43729a6eb06c0f45b1478bd00c0dfa6c0eb0700fe0e05be4300e0ef52b9d9403737dfa3c46e1880d8ef53e03b0600fe01c549235d4e3ea4c46e1c80d81f51e04d0200ff98e2a4a92e275b29b19b0520f6271478f300c03fa538d9499793cf28e416bac89f53c82d7591bfa0905be9227f4921b7d645fe8a426ea38bfc3585dc5617f91baa0d5f901f4c1bfe5baafbdbce4b9b244df7f73baa30ee1c4061fc9e02df2500f01fa8dc6caf9b9b3f52bdd30e5ec84ed33bfd896a5976d46c59fe4c71d149978b5fa8267ca16613fe57ca363a07601bbf517c74d1e5e377aa33bdab6667fa0f6aacafabf57427093876b21de43b90a6b2627b7edb990b5f6aff1e6bcf92f3b9f0f9d62bce5cf8d8c49323d90aeb0e7f629275e5b1a5f69d0ad69dcdb2fe4eb6638b2dc4e5f6cc35c74dbe33c2bac27ea86236ca7a6b0e5b6aa7e0bc9b9ced76e6de4bed9967778c235f6f4bc35969b4e073d6cbaddf9528f529f6dc3f60ba51a7596f955a387e0642ffa458efa6627d28a366e1f76173d9229bcd2ac1e232566efd3f96f1f5094bec1509fc2d1e931941d68caf5c5866cfd1cfb19ef5a3df5f947edd55faed4eea375ae472aa9e0bac1097b8cab684324be6f9f61a87a569749d92f2ac1f9dfea674eaa1d2a93fa953aa146e8dcaadd80a6177a674f987d2a548a5cb6ea42eb01266991d2adb86b9f32fa5514f954683b2d66881c222699d54f6eb47abff28ad7aa9b4eae2c34f803e6542c2745ed48fc47c705729716f95c47b3246a6eac8394ad8c21c857fa23d7d3aaf96ad66314ab33e2acd7a655dfee7b185f6cab262db169727fc80ba26f3a3411ea5415f9506637c9491a1961e1576edece832cfaebf2bd2c84d979974e87eb48d53daf65369db41b2445923c89d71b64c0bacdf0b03ca957c4acefe545b409d26aeffc7d92da34acbd616dab6962e1fe8fc09a62d508dd26f804abf61becbcd683b6786274a4d3636a757f754a7341ca8d2b0af466b678e7dcf69374fb65bc4f303cca91a941ebba9f4d843b2442cb55c7a260bf9bd59613aef9d4d6bbb26a5d7ee2abd067b2a61432d198aed3c2cb53d957e09cbce7bd4a2741ba4d26d449a3cc3da8db47afdcbedd71c2b956575e790d7bccbde326b535aee41d5bd5e2d737446cba4f5f3a3411d4a833d551a4cf5d192831e1f8f4dcd352fbdbe5cf60ceb523c0c56f150c2cc8e3754b189f63afd05623c619addf72ab5fe9f6b6b174c8b331b9f558fe26908652fdb665c263d43fa3cd4a77818aae2a11fe9bbb36ba166c2f2a3c90e9426c3549a0cf0e1c3fceba246f3a34d034a9be15eb4c156a2af8d1acd8f360d296d4650e321aa7398a6daad8125a255e0ec049a65fbe64af17aa9a27d6ac6cfee486934d24b3fdc9d2eae67a6da230615d6b313acd80576bf5cdd02726304a759234ab3512acdf6f6d49a1b6d8fb8cd115e127a4dfb58bf932da16dd9876a4ce93c5aa5f3f034a52da8519564390b6a7ca509a5e3187fbd283e5330d77a08741d67d7ef236d79557e25e89abb29a5c7582f2d723ff6b92d2db219a5e55e2a2d8b3cd7cb7edbe3d9f59a9a53d2efad927eb2efd6b8aaff14b696f84e1407e3bcf4a9d2d5e07ef3305b8fd182d260bc979296ea15bdf57d69ff98aeed9b7d3eb5a4b49c408d9f65f62793ad87e7326776661e5983e76a0ca315a5e13e5ec69dd259a2bf71a7a0fb2ead29bd2652b3a0de7ca43fade8dcca46a736944efb663f5a9da9c4e5b25e6b4be937c94bebd2ccfc95e999ad024ae7c92a9da76f639d4db3d18e62638a8a8d511e6b156a7c6e5bd62c3b539a4e55693ad253591ecff8a90ebc4681f527740f3157f5cb2e949ed3bcf49e64ef3bdcd63435f7708fc8cbfd60fd727b4ac7fdbcf8e5541d93fd8db1f6bc58956d5d7c745096768af5bbdcbeef4dbbec46683a50fa4da7d677a4d3cfa941932f789fdf0836d73a525aedafd2eac0802d932a7f7e9f0f96934e142707a8383980991bf976fa313a3304c1cc1d15528c1ce8a5a736dcd6d5d10b7aa953ac7bde468783f1c09d290d6664537ac7daf311256c952569eafc3765bdc16bd585d26aa64aabee19b4e236e8e452a5c2aee8f1b66ccad8ae94e407e95b544fd62f0b8be26ff9d1a02ba5c12ceffd109ea6ff7e88a31f753fa8b659374abfd92afd7a6a97795a87ecca46774afe392af90b19bdea074e5dc3eb60e02cb654efeb785efb5c311fd2f6a0a49debadcd9f4cd5ff280b7e3b5d4c309a16519acef33666a6d634d37ab3ec74ccbef4f4a4b42cf6d2e257f76cbcf4e0723952d18bd2b124bb39216feb9ab2eba366db17ef4de9389f1a8dc1f3b2bdad50a9dd5258a658555a9998b785abf36ef21dfc051eb7ffe133ba101b74afbc0fa5f30295ce638cebecb48247b0e5b61ff3e2c5fc68db97d276a197f51da9fe68acddc22fb3da85a589fa24bd370a2adffa519a947aa9b1d59a4cb05e989023f9fb53f22f52c93fda63cde06de632d7f5c3004ad7c5542d988b32066d9da0cad6404acb25d41cad9f1975d3f3e8bb51d22f55493f41ca23e07e82cdec4a7b447ab1abbe7338dfc78a2bb373829ea355adcbe64fabd2a3bedde647f3dd29cdcb549afbd9f5c3fb0026eae94194c4cb541277907c47eee4dc8392b35c2567fb0ced425352ee494979b04aca8e9294aab55ba6241d4c495ae125df53eb0c53720ea1e4ac54c9b95fceda91bcb4c248223f1ddb595debb4b2e6d9234295d67b7cdc3db8ba6f28c545958a8bb1396d534fb2f52956b4d9b2d77718a5ef72aa6f9f1b7dc7d91a9507a8e9704ad3152a4de9554dd41e58d86995ca02f78c13997bdfb27a8ec8f4aebf1114072ba91e63501c6c3b9d47523aaff2327ae5774789fecc7cf6163e8ad274b5feb8753fd6c7579b36f9961f0d46531a1ce27ddc9aa7e97fdcdad18fba1f540e8da1f45be3a517ac5e4948cfd37a9bc3f223ff584afe4355f2ef9cb12c41cf2ee90b543e422d610deb6f2c56c7fa39d2d693afba9f68f7a41c8fd3a3931565f7dbe04bd230b309df28592a42709fa7bdd49291e7ed9444cb23f95d690ae1304bf9ea79ccf9d389ef84b70d8d8b1e9b2f71e0bcb9c4464e8e7af3bd10a36d2f5762b7e0e659e171d695bf257fa99bd242359bcbefaab4cbac137c29859ff432cfee1ff2f233d7cafd1a4223c0b298e61314db9da687f35ced2f7235af073f113cb66b96d694598a23786a71b50d354b6116b7f455b23b001344cf3cc63f040d0dabe1d6cd72ebd772bb39328939dbd74aec5045e694711956a5dccd0680929b116e2a72522ab89d6c737386dd2b98338dd2a084b11ad5f28a788eac35495b43441b9fad2ab75b2315b677196ae5a7b3f6210a94b5df2349d991a6299b850a68995d1b70b7cc21c78a865e1428abaa91a4ec289394b5b1299bc58a445bb8dc12c219119e680b33df2692ff2a167dde6576050b1e350a64de569924f3689364b6729129db2126778cdd782b66ce47ca2a2d65a240e4da2e49228f315f9081c87dacd792bdf6e46eb1285036604692b2634d5256075517e38495f1c1a9d591a0e9ec21499a8e0b6711ed1909227f6f9724f2f86dd53c490ea94481b2cd839294addb565e2d39ba1a05cafaec9fa4ec04939435259b2749eaf0272ea3405ef1ca2479279a246f0789bc325b8405a2bf1b950ed790a649ba4eca5df14cda179f0ce04573aa5548c74582b229a549ca4e365d9b4225b0bf5d0cabec7595c919b36455c0d51829d6af45a5f5f6fdf42491a7e46a8c44eeaf968ae1e34318ef844581b6df51eff5d45cd1962cb07cb692ef222a618b13e3a851a06de1dc246da799a4adbaede9f8eb73ec165b14c869353449cee926c969e22a8a3cf915f658c772dbaaaa44f303d6834581ba858393d49d6192bae69ea8732fce8d02813fef9924f04c9304eee86a82383b21932bfc9214468134b63649da5926496b80ac6e28c387b046ab5f70db7e49c2ce3649586344d8187b6d8c7b67784942cfca4810b701cd2f9c932be2284bf3ac6908887b756a92b8734d12578fb907273950b4c6719fda3d49d57ad3e3b8b35c8bd4e6d8f567342ceaeaf9499a36e4a2b3de33f233040b6726293b2f9c43dfbd2341e4a08e4922cfcfddb89a6c7b6511e9a49f7c4092ae0b4cd2b513f3d22b9037b14581c27750c7eac26d3134e9f41060b57214282b5f94a4ec229394b560991ab9aae50cd168f0ae45fdd18b4df747d5e36bd1ebc43f352749da25b92baceeea215aadb941b392946d34dd85a7288b9277db705092b04da69b20c9cd39519d27b80dcd135c6a92aefa2c755c8dafa1e4a07c914c14c8ba6f4992accb4c0f80abe7dc79515c19c1d5459b9727a9bb7cdbb5d3a23467b0717192b22b72353494242c4aa368138724a9bad2245578b653d5781dcbe0ecb528d0f606a2ed2a93b4d566f2889ad3748d02491fa0dd0657e7aaa59f3a423bdca6ac3222dda32968acf61ad3ee3e391f005b32a2b8d0e57ab4d0e55a9394356599bae5d16b5ed445ddf1ebcccf0d8cb4c7299c1d5451dad3c23743024dd76fabde64a49c3fea7edf607a8436fd8c40541721541d95a4f0c6dcf53071cbbf2a32a317031626c9bac9749b3f49166fca466d51f2e5b593546d36495533175523ec0eb873e6bb7376db5254349db3bfa240dff54724e9bb39976dff2815c7f20549926e315d5fd26dff296c7a4496bd0f421b796ecd55bb3f695b519cc12c2f4e5276dbb69a14719a14515988fc06dafb74fbb618198bce20e296799caa1ad52470f994a3eccfeaf0c72f7daa089f4e19c95631d8c2c8275038363a65841fe5183ac9efc847a78414a6e91f167a3c1ba1d0c3cc52a18fdd2a8519da7a851e36a9156a6ddad579bbb7d6dbbdacb7bd0eab1566582259e8a9922ef4b82b37fd73c991ac425f4b850b7d0fee1466bd4aa330abbd06853e37771466b976a930c3ac46619addfa853e86f90b5376f214fa5aa35ce869ed7ca1c771ce42aded80851eb747a77f6e326222f332bdf458b8f4795b6e5ae8692143fa54932b44d2a38165177a5ea4e3b6acf4dbe5680b8692e1ad0dec4e33fde94f85e44c4d619a55d1a96f411faf30e3a08c9c13d49e5ffa39f702bc4ccf25d9cbb420a150fb609e429ff3f885bef7da1766313851e8798b536196a392c983f970032e79a05e113f98efcefcffbfcfcc2be267e6ddc549f843f45e9cfeccddb918f51b60fde3f6c47f97dbde9a3f20a5d62a25b54956469731f8ba105461aa746bb97a362dbca8924defe63b96ec08de6392387005a5b68865d643de4fad9dc5fa99a37686296ae7c793d4de6b92dae60a6a31a0fbb0556ebb297b2182a3b389293a774174de17263a074692cea188cefbc34467cf48d2d9262f49e70361a2b35724e91c8ee87c304c74f68e249d2b119d0f8589ce3e91a4f34244e7c361a2b36f24e97c09d1f94898e8ec17493abf43743e1a263afb4792ce3aa8a1f498493af120bdb7a153fe7485fd64f43a9e4fb224ad8fe7c24a1790768ac5e7cd79839dcdbaa6e85c1a4bd2f94498e81c10493aa7233a9f0c139d7d2349671d44e75361a2b34f24e9fc15f9cea7c34467ff48d2b907b2ce67c24467bf48d2d906d1f96c98e8ec19493a57a0c2fe5c98e8ec1d493a5f47743e1f263a7b4592ceb3109d2f98a413a6692932dd5fd2eb95fa3192e0c83cd81499b7a2aee68b612233e5b3111120f31a44e6963091591441322f4764be6492cca619c874d7e77d2338f0d1040dcfbd1c162a7b4792cab31195af8485ca5e91a4723ca2f2d5b050d9379254be87a87c2d2c54f689249537222aff17162afb4792ca43510dfe7a58a8ec17492abb232adf080b95032249e5db88ca374d5209eb88e73167e1abfc39794774e753e5067b3bd54c11f90a1a747b2b2c441aece91823f21944e4db26896cc7f01a72b88eb2018ad9305b9c2ab44416af5acfc1c46f2b53047fc89204bf930b4bed6ffd2bb137047151ddb3e7515eba7d0922f25d9344c2c2047a24130f710c651536a5abcd7ad206a6682d43b4be679256bcb58b5be102b1312b0736696c9ce87a44defb26c9c3bbca4ab79b227d2aa2ef835c14e925d6434b44655269efbc7018a1db9906eb7463b45e81ba911f9aa435b9c39217e515f65eafe5a2be8eb25d96a146d147b99834a35a97188ed3dccbaadd8dd159c3149d8f233a3f0e139d4591a4f34644e7d630d1d9339274de85e8fc645b0e6fc874468fcaf710959f9aa412b662f7146dc98a5c553965a6a83b0535853ecb4533bc9f648b3920afbe29f29e45e47d9e8b76242ec2ea5dbd395c9fc167588dd0ba2b1aadfc228cb4f68c24ad1fa2e6f997b928ea03725fd48d35cdef4755cc5726c96b9ca1f1039a1aada9d79ba27125f2985fe7a2a62eda6e6aea0a44dd3726a9838556de9adf4697f61b6b31ee868af3b76122338a3d99dd1199df8589cc3e1124b32f22f3fb30916970dedb18990311993f84894c83ed476364f64464fe1826320d6e773646661f44e64f6122d3e0c4833132bb21327f0e1399511c4c2b4264fe122632074490ccc188cc5fc344e6c00892390491f99b49327762a9474450e72847f970885b5992d0dfb7ed148403c50f31313af7ddd91495d5d098e51fb91ad8586e3f94a3818d853143d40d42c5facf6d6985ee41de28ee1fbb030df1fe958bea0616b60032355669904c6363952fa122fdb7493277b1c9f47208fe2cb6d8a67d987d06f06291045fcc5a623d9df221ef081cfbd41d5541ffe4625c9d4fdd2697a942748e7ca8b1a6d15a44e3bf2669ac8768dc1e0e66fe0911f79f49e20a14958f7aae917fff807febc07d82bad1f99e37e286e8bd16f950be99c038bd5021cd65cec27e4ce158db5eb7a715975d10bd3193f4e22ff36c0fc5fe6b54ecf34c1227af00ae126bd07987712c1ba1b4c7e86e8ffa06d963dc24adb02e9d5743950cbee79023ab34d6189a807a42f926e9839e90b7d1a2280e09ef8e0a78359354c25811d5a94c3d77dde8b0b031dbfc1915edea6123d4a0851a23f40744688db0116a727d9b29427f4384d6cc4563a8f776d218fa0ff9ca5a2689f3fe719a293699bc6a9a6fc32d355b0d2d3045ed9ba846af6d925afe11ab850c7f5472a8ddce3458908d6d0dad89ecb1ceb6202d8afb696b20d2ea6edbb663d4e772daa3425b2f979d435e994c43bb19e9c989289e14f813aa9febe7a27eeeb59dd4cfbfa1a2bd8349e2e07b8bbc57bd54243ec71eac88faf8f8184461835c14692f9bedf0110e468fb35b678ad6a3d17c63c330d26af4ec4a63b47643b4ee980b4fd9773bf1948d50cdddc82471febf0569709784b11e7511aab11b87894ea31f8f3146e71844679330d169f4c47e6374ee8cbc64d330d169f488796374ee8de86c16263a8d7e00c1189dc7203a9b87894ea31bf68cd17913a273a730d169f44b51c6e87c07d1d9224c741afd168f313a7f4574b60c139d46bf14658cce1d5043a9d5b61ccbc4eb837a9a1c7433d623aa8f7a44ad4d52092b82bd2dae367a6493b111ccf3915db6091399060bb93132d72332db86894c832346c6c83c0791591026320d6ec13746e69988cc766122d3e046676364ce4364ee1c2632a3f8e5b25988cc5dc2446614e723a72332db8789cc28ee3c1b88c8ec1026320d6e743646e6a588cc8e6122d3e0167c63645e84c8ec948bc9b43edbc9645a2dd4752c34491c7c410296c12c4ad30b8fe22e9df7900576cec57006559cddc319061b40c6a86c8806daba8485cade91a4f20444e5ae61a1d2e881b5c6a8ec8ba8ec1a162afb4692ca671195ddc242a5d1fd10c6a8bc1651d93d2c54f68f24952b500dde232c54f68b24957f22ab2c0a0b95032349e5f7c82a7b8685ca0191a4f20944652f9354b660a9478b0d65d3d844c60f15e3828fb40f7fa8b2217270b898b149dc2f5992d2de2629ad650556d83dee12eb21d02b7a36588008eb939bcdf34552b1cec170453b53f43d85862bfae6629ca7ff7632ced31211d72f178bf8fd7fe0d2e02ca2b10d7997a3e2dc7f5bd6ce186e56240ffe1c87da8c034c525997c91b428733f856a331da8c7d9e281f59e0c05c78c47edb89476c863ce26eb958ce0723dfcea72cb7b75329ff871ad7bb6f5b4fe840395b930d4e6619db9afc10a272502e6606e9ba7aaad4833646665d5364ee8ffce31e6122d3a0651a23735f44e69e6122d3e0723e63648e46640e0e1399061be2c6c81c8ec81c1226320d2e813646e60444e6d03091697009b43132f742640e0b13990697f31923730022737898c834d8643746667f44e6883091697009b43132f744648e0c139906676a8c91391091392a1764527bc3e4ad76513c83b21f22737498c88ce209a9c3109963727d188eb7af819ba4d5d467abff4183bf63c348abd1dd0fc6687d1bd1ba572e0efdc433de136d31f8a42d1f5dafb4219d23bca708867230f36d6c90ee61e408f6cec5446e5162e87839cbd9596dc646df3723fac699a4cffba7d60d3694d69ba2f1693489313e17a706722bdcbe4e0dfc1e59e2846dd93c92a770a3f8c9f58dc81ef709139951fce4fa2644e6c4309119c54fae5f8cc8dc374c6446f193eb972032278589cc287e72fd4244e6e4309119c54fae5f84c89c122632a3f87d9df3119953c34466143fb97e0122735a98c88ce227d72f4564ee172632a3b8f2f23244e6f45cac84c3a34463c5e05ba93db451ca0eb1ee17e76264c8d810f11c96a473ff5c7cf329f96589327b7fc42a46efdc89e2f1761bd028e6016123348a6715ec82083dd024a1fc233feea5d695e6e832b6c8bf1a2ad0334cd2d55eb2bf4a863f0d3ccd6266b8a540b15d15c1759815c7298671f60a66f8d88756a668ee8396bdceccf517cabc936b7024c918b57b206a0f32496d3b05b5eae9b5f1b6680b2dae4a8497adb0ff19f5a89363a6469710c1b3c24eb0c1368031822f4304cfced54c66f23a4ab405c6b82ab3b1a87d60bcbd6aac35703caadee684e783c4511c17dd0f513937173bcca1a5b0d48a586517f5caedacad7a1b6aabce334fe9382bc8214632be317599ed2f17db540fb362e659bf1d40ee104a2ca0627394763345694b64a5c526296dc8f007dc715b362753c6c69a53edd08049496eb7aa5626064ca237305217d9ddfc707c8278b805b2d44a75991d2ab3ab2483d31e334c51bb1879c90526a9adcd7d86f563aec5c002fb65674957f40a7113648d0b7331eae97d976514d7bf2f403eb1344c740e88249d13119d8bc24467df48d2590dd1b9384c74f689249ddf20dfb9244c74f68f249dbd91752e0d139dfd2249677344675998e834fa710f637416a3c2be2c4c74f68e249d5b109de561a2b35724e93c1dd179702e26e7b2e954babf566e70f96c3b53347f8bc6df2bc2db7737b896c958dffd79446da5496a7710d4f69608cec1509c31f226a2e25f6592bc969eedd2bd71d0e0823063db065f43a349cbc348aac1626e8cd45711a92bc248aac1850dc648bd1591ba328ca49afc32af29526f41a4ae0a23a906a7868d91ba1191ba3a8ca41a6c951a23f51244ea216124d5608fca18a9ad10a96bc248aac1c58dc6486d89483d348ca446f1788b4fd040df616124d5e47141a648dd8a483d3c175f042cb2d7312d632bedc5371caccc7a6d75ae5689185bb9f43e4b1279442e88a4d6d539a2f7b44fee3658cc7f3745e4cb88c8b56121d260d13646e40b88c8234d12d91a156dd8e835c65e5937dee26489cd49b9bda20974ae6451def2753722f6a85c8ce97b5b42cbf781447147fc43a80a3a3a4c741afd08a8313ab7203a8f09139d4591a4f31a44e7b161a2d3e8b62f6374de8ae83ccef466c4e4d2c571d6830b22b86cb131aa6a8e37495723969c2d7212e7c226b7bb44b9695e826c6e5d783edb14c513bf06a2818d13c2e40d7b45f22c86e791659e18263a8b2249e76644e74961a2b36724e9bc07d179722ebf9955c99c9341b6afbd6d2fa2951fa7985f5433d9d2bf9c95db8f55592f243f49bbcdf6b819eb917745cda453c379a074145786fc846afbd3c273ee52cf48369dce43367a7a98c88ce261a9e72332cf081399513c2c753d22f3cc309119c54301362032cf0a1399511c2d3a1a91797698c88ce261a9c72232cf091399513c2c751922f3dc309119c5c352572332d78789cc281e967a0122734398c88ce210c8a588ccf372b118812f36e09fd171b6b86c3f63f09b1091e7e7ea033ac9f99fa89f41330bd177412e760d71fa003547e4ad37455e1522efc2f07cacde60bfdbd877b01e40639817e5c21ff6dd4efde145c8262fcec588258cadf3b1c995f66e4a8791ed6b8cfd2c346279492eecb327db3e97b37e8aec73631847d47b45720bcb29c87f6e0a23ad4647308dd1fa292af6979aa4b59ea095273cdf2615b04b4d4e9c553355cc192ae6976dcba651ce36a71e6c8c4a54b42f3749655b05957e4e8b37d80f37d6ffb919917b4598c9353862648cdc1b10b95786995c83639bc6c85d8cc8bd2acce41a6cee1b23770e22f7ea30936b70bec818b9cb10b9d78499dc287efe640922f7da30936b700ede18b9672172af0b33b906fb5ac6c8ad40e45e1f6672a3f8e99eab11b93784995c832bf08c91bb09917b632ebfd7e18cb93ac702babbbdf8a84083d55899294a5f4594de14deaf7845b18570331ad3da9c8bad5f456cfbdbfaf51e4b92787378ed338a43323351d1bfc524b5f559ba3157839f98ac6d8aba3c6495b7e662898eb70d897d23b9dee9086487b78589cc28ae773a1291797b98c88ce28e8f3588cc3bc2446614777c1c86c8bc334c644671c7c74a44e65d6122338a3b3e562332ef0e139951dcf15189c8bc274c644671c7c77244e6bd6122338a3b3e962232ef0b139951dcf1518ec8bc3fd7eba02832dd837106bde73a53b416a331a307c248abd1c93a63b4ee80687d705b7e33dbfd091f835ed4d8077cfab024950fe5621f481febdf0aebe6128b899c6d653076d0c55d88be87c3fb611e839669ecdb322d50217f2417a7dd50be7398f5ea32c6f788f04f41f3cf9f983caddb149d8d510dff6898e81c18493af744743e16263a8daeca33f7717254d81f0f139dbd2249e76044e71361a2b37724e95c82e87c324c74f689249de7203a9f0a139d46fbeec6e87c11d1f97498e8ec17493abf42743e13263afb4792ce7cd4507ad6249d1d6c3a27da09c35a8e4a1bc4d9073ad17a8d0f7ac040ddf676e662114b12fd5c98be6c3cd0e4949cb18191d25892cee7c344e78048d23905d1f94298e8343a616c8cceea88ce17c344679f48d2f923f29d5bc24467ff48d2d91f59e74b61a2b35f24e96c81e87c394c741add3063ae664785fd9530d1d93b9274be82e87c354c741a3d91c4189d67203a5fdb962740b80bbac1258ac6361bb4433df9ff8585cade91a4723da2f2f5b050d92b92542e4354be11162a8dae413646e52788ca37c342659f4852f930a2f2adb050d93f9254ae45239e6f8785ca7e91a47238a2f29db05039209254be8fa87cd72495ed15547a5da9e45e9a6870baa39d299a1f417ef4bd5c9e239aba5398b2df289e237a17a2f5fd5cd04a7732f1c978d85e0d6e4868608ad6635892d60f72e15fc15a4bd376360d167c6316fa1af2af1f86e95b8746573019db90f0201af3fc284c741a5dc1648cce17119d1f8789cea248d27915a2736b98e88ce6f7666e41747e6292ce962c79b4ca02eb06a7939f13ce0147da75397f75b8bd52c4f9cc83d3b0aa8a60857413aadb3fcd459309933ad17a9c038e150dff527bc787f315d9e25cd06a6c99cd5c44eb67e1f9787914b7c3ee881af59f9ba4924fd65432e7709f79d68d49b600e3ade87273b4d537455b4764815fe462e32bffa6c2427b1162b1bd1cb1623b3a90ea1c44e697b9fa900f2ed451fe0ad20844de5726c9eba7f085ce695e932d21f6b6849ec64a6d8b5ca61855aab45779565a21b83aef26df81b5a1dcb667996c420d32951567a0eee7d7e1f9ca5cbf481e143417b547bf091399513c28682122f3db309119c58382662332bf0b1399513c28680e22f3fb309119c583826622327f08139951ec191d84c8fc314c6446f1a0a0fd10993f8589cc280ed5ed8fc8fc394c6446f1a8d44588cc5fc24466148f4a3d1891f96b78be2a6bb02e37f655d98ea833f95b2e0645fae77e50c4981dde87ecf07793e4edccd26f789d2238d9665b5d8dd9674f96a4f88ff07c25d1605137f695c47bd118fc9fb928ea03b7a3f1cf275151ff2b57f396b32c21e6d92cf0af704f46d31ad3c4245bb427d83e4385fbef5c9c48c749ad4c78cda89f48370cd9e43f26e96bc7dc4bba96d9be905aeb395abce6f69806bb93b34c11fc2122f8dff0543e069becc62a9f1ea89df95f78bf0613c5cf9c7e86ac9455df8647a4babb96511cd91c8b2aa498492aa1978e17d28cb46b792ef270db1ecbecbbd15d95d41b91996792cc9d3278cfd473137b99f4a1c6eafb37900f8d878d50838372c6087d1d119a1f3642a37802d83d88d06a6123d4600bd4dca1d388d0ea6123d4e0749b31429f4284d6081ba1069b4cc608bd0f115a336c841a5caa608cd01710a1b5c246a8c18534c6087d16115a3b6c841a5ce6658cd05710a175c246a8c14588c6087d19115ad724a1de3f2d31c51e15e5bdfcf936dc52b33dfa05a6a87d1b0d8ed4cb85adc218e93cd487c7c049158c126aac573f1fcd22d50f1ba1065ba4c6083d1911ba43d8088de201022310a10dc2466814f7bb4f458436344928dfbc559218051d673db84054480b2258ab376249da7634491b4c197b993d727f68cf18a9c68eb1f817d5e78dc2486a14cf06c94305bc71184935580d1923f55764a94dc248aac1aac818a97f22529b86915483dd4f63a47647c5bf591849353848628cd45e88d4e66124d5e0509e31523b2252770a23a906079c8d91da0591da228ca41a9c5a3646ea8988d4962649f5ff49d3282e7de88b46485b8589ce8191a4731ca2b37598e8ec19493a07a1c2de264c7446739dd30c4467db30d1d93b92749e86e82c08139d7d2249e7e388ce7661a2b36f24e9fc18d1b97398e834ba35d6189d3154b3ef12263afb4792ce1d119ded73b1209ca213c3cd32bbdcd6d8eafa175051ef102632a3b807be06b2cc8e6122338aa7805d8a2cb35398c88ce22960f723320bc34466144f013b0491d9394c6446f114b03588cc2e6122338a7be5aa1099bb8689cc289e02b60291d9354c6446f114b0831199ddc24466144f01ab4464763749662b1f64ba5731196c24ad3345eb26446b8f30d26af43bb0c668ed89682d32496b5b05ad7e8ec3305849193b0e630222b76798c9fd7fe5dd077c5545f607f041441141a9222822020236484f144b80d011a4a9804248421209241042b1a0a2228abd606fab62c1be96b5f7babaabee5a5757575d7b5f5d716dff3b73dfe5fe5e0a04767ff3cec97ffdb069efddbcf7cddc7b67ce9c3943ec4ed1707301375d322ef12646c3ed0cb81992713556c9790b72f23225e31287ac34dc2a68b959927189c1151aee74c0cd96b1ee6eb0a9bda505b5dd4e63d15e0eb4394cda3606d78c0c093ece0c2c4a13ab476870b46a4e762fa1082e970d5765c2cd50ec536d1dbc0526aa244a83a3550add0de0f224cd7ce6aa5c35df17e697f696c499a792b30038f791c499a692b33bdc5e064ae2d45922632870ee2b89334325e762e0dc4f1267a64ace1b80737f499c592a395f05ce03247152f7e9a2717e079cf99238735472b6868ed2a05456b38d5f7ab8173c8d9256b7a10202738399943deb69998d0d6fe09c13310faf070bf93838fd87684026668ed2908f00e4020dc8c449121af26770b918aa0199385942437e0f9087694026def868c86b0179b80664e284350df97b401ea10199388d4243ee0b37be911a9089430e1a726f401ea50199989945433e1490476b4026ae63a1210f07e4313e06cf0dc5229207cfc48b026df0dc11280f9442490d87d328cf02cab15228a9133534ca7d81729c144a6a189c46f93a501e2485923a4143a3bc0928c74ba1a486bf69944742f87b82144aeac40c8db21b504e9442494d06a251be0194937cac56296d10b32915debcd1c4ac937d8c89a24ae5f6c1f6e955c6ce7a357e7b4c6230909650792cdc9c0ed6804c0c06d290cb01f9100dc81a377a3d04900fd5804c9ca0a1210f03e429527a0dd4b288b45ec3ee4039550a25b5861f8df21aa09c2685925a388946790c501e2685925abb8f46f935501e2e85925a559246f934504e974249add947a3bc1006ab33a45052ab49d228670265a1144a6a05731ae57b4039339579adde169ccf63514e3431651193b27d82d2b6ba3297555d6c6c7ef57cf7dd2ab764d23e9446485b9e7b0a1016fb485a6fa835e2e1e85b0cd38a243d06b950259238a913c634ce9781739624ce012a39d70067a9244e6a66088df32ee02c4b65a728995363a5beb781b29c49d9c7510e0fbeac366302850aa750e5eee6e3dd8bb12ba76adc77c3b63bddcc76f88382e714059f87bf6a68f0b1247864310f9bb6b2aa3fdcf38f606fe36adf7b98713721110e2e722f435f4e5d1f609beda3b799d6e47a9bc7026185ef6287f5e77ed62e18479cd9ecb41989750f1852ce91c84a5d3649637d0f42717399ac1d37d05d8ade29f5de7e01eba4af8193be32b5dda4f050158e9238f14b2b6db4059ce8554ccaae09ca012e05a724d1226b82a357b9272d089e1e9ff8f691f3dda3f47586ee82d6392f95add35b714d5a38ee3eb85ece6752f632b5d312e29ee5c6e57e684c4ce80117816a26f3ce8dbedbe70746c50e7642d29f82c8fb7a7312efb5c0bb20b5298e78404feb9d6905b9cf83117e8d8fd15366f06f4ee29717ba9b98a7d1132d48b212081732093b01615c5273841b889698c5be20695370abe09ebf8809d9cd418e76d1a605c115d39ec2f6c113cd21c177531659a2c1ee08b08b5339b7991c11d5b879d634a05cc2a4dc164e76bcd77b38c1e7b2f0c603de913e367e19502754d774ae96c700e6514ccc96c117e589fee510132ec6d637a06c055c47a7f61aa83ddcb12b74788e4975b8233f18588e73f76fcde18e7ba0752e6592f600d2f8e350778062371ab7878e5193078e7460dae8fc03003ed6c7f011dbece4e081f6a65319bcf0eae08025c17fb38327cc4c5c04f4b6db9f80f5387e97bd76bb8d61b19d464ff2004beb672e836becf13eb6be888276f1c072b0239d5be70686b99ec49007ade3f431d02e63d276a9e75290ef02c9e50eb9a95c5b3f818bc0094cd0b609d0bce0dfc2e09b3623c45bfc88d69d7a0cf84e94b8d52035e79316d9ac81698f9324b252b3eb68ac7b00eb721fc98a0dc7e12725dd8af29863a9d62cce22b8199d2c89335725e748e05c2189334b256733e03c451267a64ace77e14e7faa24ce1c959cfda175ae94c499ad92b323709e2689334d25e70c38d94f97c499a192f339e03c431267ba4acee5c079a6af8073140419e75e4694f255ed0e59e87ec138136e78194d11eb8d8c3e0cc067f9088a64a4222842e3bb1bf8cef63dc714879587b8005da189d61d796891b438531fb8bf9f236923ac5c662608ad85a64342e2b99238f354728e04cef32471a6a9e4ec0561baf32571a6abe43c18385749e2cc50c9b902382f90c499a992f321e0bc501267964aceb781f322499cd92a397f04ce8b2571e6a8e46c0b1da54be46cc0aa3113644b18115dca2f6f914c99bc1ece26dbcc09feb39fdb255c35ee9005eb9271263ab5282c42c49ec0c2ded7c4d89749a955470d2dd3da6d5bb8a25e2e85921a56a6519e0c945748a1a486946994194079a5144aeabc3b8df259a0bc4a0a2575ce9d46791d50fe4e0a2575be9d46b9007a9e574ba1a4ceb5d3287f8056798d144a6a061d8df22b6895d74aa1a466cfd128ef04cad532b791226e124ddb46ea0613b35ec79f6bafbf8a62f42e9b62e5c43d01f87a39153f737994b4754783e0c674838ff5ed76debdc4b5d039be9216689596aaa11ddee8239e142dda9a69c2759bc92b8a9af64650fde066b5865d2ed56683cc0c044acde8e081a5891b57a9c26b657b68a337f9a8c1d050f838f95a99c1dc209276b5ec0601e49b25616a2cadd21d306f9184a9b1087a27c0bc551226b1034fc3ec0298b749c2246e454ac3dc0c306f978449ac854cc36c0d987748c2d4b8dbc18fd035fabd244c622c8986f90b60de290953e3a8bc1f9ce67749c224eef446c3dc0330eff651ff6363d6b911af9bb4b544d703e83dd240352eceba1f40ff200d94d8e7a4813e05a0f73241bb9bfa2bcb0e3615ee7b298cbed3668dbac29dfe3e89db9ca433634bb46d4e6e81f8e6fd1259d354b27e01131c0fc8e94ae5aa8c7f9e0fd7d50725616a8c7fae02cc8724616a8c7f9e0d980f4bc2d418ff3c07301f9184a931fe7926603e2a095363fcf32cc07c4c12a6c6f8e72980f9b8244c8df1cf3300f30949981ae39f1700e693923035c63f2f04cca77ca478d9ca34d151b5efba7102e03ded63b3a7f5671b67bbfd6188379b162cc8e721bcf18c8f9c4d2cf0533740e7a1b0cf9e2ccadb4d4cf9acaf6d75e28fc312b5bbe2c5aa9aeb767d0998cf3131fb99e41cce59262cb75fdce086f7754f7ffbc63ced40b80d0bfc6a08c8fd91096e7700aa3261e5394c94d57713da09dae8f33a7674250e2e6919c6a7c12dea051f11f888d9768f4a611b93867ba01a8799cbe084ff938fad4db00bd5f8364b8c7ad25aec5aa0fdb38faa9e481bdef12dde5c33d215b0a85aef64b2c65487e670e57d51ce4e9a1a23f49381f2251fbdd6c62ddaca513911f728dcaa5e9684a9b1653e08987f9184a971eee861c0fcab244c8d7347f702e62b923035ce1ddd0f98af4ac2d4d8a9bf0b305f9384a971eee81ec07c5dd25e0779cc090f5aa77d3ec4ecdf90c4499d3fa2714e03ce37257166a9e46c079c7f93c499a992f3671373be2589334725e710689d6f4be2cc56c9b93b70fe5d12679a4acea3e0647f47122775651c8df34de07c571267ba4ace2b81f31f4ccedea66e8ac3a16e22c3c6e36d71a07cf77925acebb06fa72078b1e5eefb5e12206873f69f01f47bbe6794ea5f2a33d8d87ade552e7a1f254510234ed358b4536046e97d1f73a0c9b92543dd018add049d3d7472812b7a8ba54dd4bd052df603999b9313afb8b4cdc9c7416bfda78fec3c9bda58b22eef69846bab2566b1d19ee6781eb4cf0f25f504f254ae3f9e05ddfe8f24715297d0d038c702e7c79238b354723607ce4f247166aae47c1fae9d9f4ae2a4ce79d238d3a1757e2689335b25e776c0f9b9244e9d95458ae064ff421227b538208df3cfc0f9a524ce74959c2b81f32b2667bb04679a1bb77bdf869cb667f61300f8b58f4cfb4d892c258fdb89a9383d68cc90f0f00d937907939c695fe2e8c28334b53cfb7c08867ceb231812a1969b86d62a4d67469568c190d700f25f522089cbb86990b701e4775220356ed4f30974e2bf9702a97107d87700f2df52208977701a64019cda3f48812476d969905d0072ad1448e2c2031a642940fe280592b81c8606391920ff23059258e08f06791140fe240592b8da8d06793440fecc84dcb516a44da5a9bd4eb869efb2f52c8ccc7ff111902b328d59f06a83c51ad71c3d0afdcd5f2571eadcfee425e0fc4d12e700959c3702a7fd2d6238a9514d1ae79dc0d98cc9b971db926a5c459c0377fccd9894518038390d7172f0509bd85569c604ffec677171167a12220df528689fcd99a861376a9c096b2f851da26a7790b072d810d7412a3451b1ab94ed91409b474a3731f5e63edaefc6e67b6accf6dc122e0a2d24a21263f434d4cd01750b89a8c49e000df547b8d26e2911951829a5a17e09a82d25a212679668a85f00ea5612518941141aeae780da4a222a319a4a436d0637aaad25a21223ab345403a8ad25a21207af34d45fe0f46f231195382b4543fd1950b7f1115c693853547b12c42d26a6dc9649d9364199635290234a5b7dfc10f0b54d6d982f3c548543259ed4b430c940986d6ac7a48cb6a648ab05eaa11dd2966a17403b6ccfc4dbf47d3889776fda869167409bec2091354d25eb47d0d3ec98caab663226f1aa398f75e23f01949d98948ddb93c6ee0b4b0d7eac65413e0590db498124f6286990f70264672990c4c0310df260b8f96c2f0592182ca641fe062db20b13b27df0854dfcb295406c477c7ef072ab82cfc399ced126ac1652a17098d8c6c4845d99845d4d72d69dedf22c4a042c925ba5a768fb5c16e9d9d02a776092fe775ba168dcbce72ea0dd9149db650357ce41c1532bdda5c05e14c2e430e26c3b2dccb10c6e45dda4811267da69a0e500ba933450e2d594063a1640bb4b032576e369a06300746769a0c49b120d740280f690064aecd6d3400f02d05da48132c3722cd01900da531a28313847039d0aa0bda48112f33e68a02500da5b1a2831e783065a0ca0bbfa88c4376ed507718c44cba89f6362ca3e4cca0e269ebf0c7ff908d3546acfbe07887d99889d37708227b7c74ce62093d622a7c1c9dd4f12a6c6d3fb08c0dc4d12a6c62d4b0f05ccdd2561123b4534cc2980b987244c8dfbbf8e07cc3d25616a5cb9391130f79284a971ffd70301b3bf244c8dcbb3c701e60049981a8b4d0e03cc3449981af77f1d0198e9be530e1bc24c5e2ea8716d5b214c096748644d53c9ba0db066fa4e6268fcee5bc46e3d2da5bb142e04593e0ab23436d649dd378616e9ec049cd99238a9bb1ad1380f00ce1c499cd4ad24689cdde03a9a2b8993baf701af7502679e244eeace1c34ce39c0b9b7244eea489ec6790970ee238993ba85198df345e01c288993ba49148df373e0dc571227750b331a672be828edc7e4ec66ea6e049d6f8a9c855d7680dbe746efda43053bda54f1c72686dddf473b6dfc36a5c4e1266dbba8ca6631e70192387355724e01ce7c499c592a39db00e720499cd429631ae75ab8760e96c499a392733f689d43247166abe4dc19380b2471a6a9e45c0c27fb50499c192a395f07ce619238d355725e0a9cc353590b24f944d7b835ca7630721f2185324325e52aa01c2985325d25e5e140394a0a65964aca0f8072b4144a6a06328df201a01c2385324725e55288701e2885325b25e520a01c2b85325725e55b40398e49d9ab1eca4ddbbd9d98fbd983c57c195c470ff251a4ca4e6fcc32f313df1e626c3da51050f7cab76c087a8c6742468578d352510095c6f73cf04d60f245d563ed2f9ee54ef6e8d873130fa1e1d1728e03bb7578137d24c7361cd2c08a9c9eb67e68cb623d0258273159ed5955ecda63616050113c393c40897b80fdbc32f84d134d59e2a595b979758d7b696d0fa4937d140088ead08525cbed4e704dabfefb8bd04d3ad8478fb331fb1253bb4234ca4fa02b74888fc0709169ec76b91ad7083f0177f4432571522b7dd0386f06ce299238a9b1761ae73dc039d5c77513d3bae22d492726443c2472d1eee9bd81729a8f2164e36680f4dd80de05c8c3a4406abc93bf0a90874b81242eb3a641fe0090d3a54012b3886990ff02c81952208925296890bf0164a1144862a1141ae44f0039530a2431018606b9050c1b8ba4406a9cf1690e90c5522089a5ce6890ad00b2440a24b1001f0d722b809c95cae9dce431b7c6ea475b0365a98f3699e682bed138bbc04d45d827699f676c05f7ed321f71a001eeffa38fe18b293015eea0517d0e7af082b68b8bddd82de22cf751fba87161356a7e1bed241f036df30849981acb428e07ccd992303596851c05981592303596851c0d987324616aec180d05ccb992303596851c0698959230359685cc07cc2a49981acb421600e63c49981a0be34f00ccf992303516c69f0c98d53e06945106517898aa2636f7f80124642d486dcc283c941da953671f698905fb00654d2a2993b7992752d2b6997f18c26f0b7d54315a60ca821f579b86d6524c7401387b4d9de50e36877bba97b260479b1876918f652ad1d5b3d22c7290f34db41bf00433c48c328382275407df0fbf37ce84ab2bece3f2835752ce65beb83989b90c2e058b7d2c0f18e0da709c9ce521644cbb8e0e873bfc1226de0e805768365cba4c731c7e21a01ec9440d2b674f08de7f95a9720f5b103c21beaa4e37b31de620473e3b71e0a1c147bbb48ab8488056726f77b8a61ee563394bdc23b5ed31ccd21c115c4debeb99669b4cee35b4058bf549b8861ecd646d9760b55df86a38f53d9df2b46de94f8553fe181ffdd1c6a660eb1b74e6c329bed4c73aa086baf675cb8f673047f1bcaaaf70721f2b0d941863a2817e06a0c74903259ef234d07701f47869a0c4fb390df46d005d260d941824a1817e08a0274803d5583bfb7d003d511a2871e69d06fa31809e240d9498174203fd0840974b0325662dd1403f05d093a5811273ea68a09f00e80a7e9ca9317590ea8bdd137ba4b4d8fd9b309e3fc547c99eb0f651a5df70086f932613f39dea334c6793ba27bb7a1e358eb1e1a93a62b79e3655f71c9cf02b7d4c7564d53aed3db4495a3af7046893a7f9c80c69dc8a8d349569362530697cba244c8d69367301f30c49981a171acc04cc3325616a5c685004986749c2d4b8d0e030c03c5b12a6c685063300f31c49981a171a8c07cc7325616a5c68301130cf9384a971a1c158c03c5f12a6c699f5830073958f51796330b1122cb59ae10a16eb49c07a8144566a479ec63a00582f64b2760cbea84ecaa12b095ec678f7322a5d24c9aa84e93634c66d588cbd4dcc78113bb5abca84b5b34b5ceb8b19edcbb6d516162bcce6dc05002f9611651f6c6aef36402d34358d457b3c9ce297f8585fd4d819a15c9553c07b4278f852499c792a398702e7659238a923761ae7ce70b25f2e89335d25e748e0bc4212a7cef499a5c079a524ce4c959c3703e7559238a96555689c6f00e7ef247166abe4fc1e38af96c499a392b30d7494aef1912c936ba25d5bc22c0fddc9328f9898efda54ae1d8a5f3a79228336562f86b4add54cca7d4c72de5195891753272fbace802d1dea8edbabd72dca4e5e9c1d3f675cd2918931fc81ac3fca597079b8cec7e5213d1597075a9bbe132e0fd7a7b2d445f2e541e39e051de0be7f83144aea82181ae5194079a314ca749594d940b9460a25b5c81f8df265a0bc490a65a64aca354079b314ca1c95948ba103748b14ca6c95949b01e5ad5228f35452fe1b286f934299ab92f269a0bc9d49d9dec4ab85ca5ccca8d8458fbced5d409b0a9e6562c23b7c24d16cfc3ed5c4046eda3ed53703ebefa59ce4d4252fb493bc0f7488ee9442492da042a3bc1828ef924299ae92720950de2d85925a3a9a46f92950de2385325325e5e340f9072994392a29cf83bee5bd5228b355521e0e94f749a1cc5549f90fa0bc9f4919edd966a94a5cc558fb52e37c62edb33b4b4d0cf9800fc8b4260a7934403ee823a7a3a159743c5c388fae717de5e33093fe90244e6a7a218df3afc0f9b024ce012a396f02ce472471ea5c4c7d37703ecae46c1d7cd150f5777db79c6e70cb79ccf7c2bffa570625d7384aa7162fdd8cc4fa330c1e1f97c84a5d4a4d637d13589ff0d1d3cc6ba23dcd1570da3fc9bf5a2e3476556565d2b592b810b5078bad2fb03de5a3fd3534fac6391de2894c2b64f63d8cbd9f6642461b364549aec5aefd159a6839f4fa361523c2d236c3d906609f61c2f6aa059bbc134698013c2978611639fa3828f85999bb1c94271e4d2e4341db2ba317303fcb64ee538bb9c2b55d7b661605870d4b95da6d71c2f9f3fa03749e2e16b4e5ffd7c35dff39dfabd71bdf9289052a68edb80fb4e33f3269a36a9c36061a1d557b27ea6818723eef23652623f83727f1cb0bdd464e9e0869a3f65d80f08554ae1b4a0e82682c1a79888929ffc4a6b4a3a059c1376a82872c700552c2904878a812f750fb7965f03b79c34c166567a0fc3393b255f04585b17b5d8e4ebaafebbb16f600b2177d8c8c6cfaa0bdfb862bcc0a5c17a7d2784b22dc930569e08af8928fb070c3498493922679f3987dc7d62ccee9c0f9b224ce5c959c2380f32f9238b35472fe0a57cdbf4ae2cc54c9f937e07c4512678e4acebde0647f551267b64acef6c0f99a244eea5c108df37038d95f97c449dd6e91c6f90c70be2189933a014ce33c1e38dff41db36c7cc54de25623b465566b2166f937266d1b13ce5dda83d871b9c52c0c1e666787346e3cdf13dae45bec495fdbceec014624dae29044bbd3c7b635b0bdcd64eb60e21879f8cb9b4ec2c13f01f1ef52f2d6a91d1f1a651b980e7b470a25b5d343a35c0e94ef4aa1a476786894fd81f21f5228a951211ae53340f99e144a6a448846b91a28df9742498d06d128e742b7fb032994d448108df21b6895ff9442499ddfe1f52ba1557e2885923ab743a3bc03283f625276ad8712cb8d2697119de40e43cd5c2b6b4622dd19483f4e65ebc4c351abc0d0d25bf6866be62792964b516b6ed038ff0893119f4ae21ca092f356e0fc4c12a7ceadb9ef05cecf999c1d4d9c4d14aff3897eac3dbbb2d4c48c5ff898845860ca821f57373805312cf184e4b568c43bfb7416ed50a0fdd247ee6f7a93cbfddd1f08bf92b9469278eda4ad91fc163a4a5f3359a352f5692605a5ea69f9977740abfc86bd22c2b6b9c5c6a64dc78ba7e2391f7d43c8ee80f7adaffb769c051c5ff5754f96bd0d8cff623276361bd39ba46e6dcc2b5b0298df49c2d4380a7f1530bf978449dc3a9686f90260fe5b12a6c6fa2f2f01e60f9230897b50d1309f05ccb592308995d56998cf03e68f923089e36e1ae6d580f91f4998c42a0634cceb01f32749981a6396df00e6cf92308939be34ccef01f317266677130f246d50cd620e77f38f63128b9bcb4d95cbf84d5ea16b9f33df3d9e172162e1de0fb8bf32717b9aff4d8d18e25d9f5659e32708c3fda60199d84fa521bf03c8a6a502648db58efe02c8cd342013fbb534e47b0079330dc8c4e8150db92ba4e334d780acb1a4541740de5c033231da4543de1e905b684026c66769c85b01f2161a9089233d1af24e80bca50664626c8286bc0320b764226f380f353c54586095787ba315583d1528b7625276311b5fc581d836692be5af815cbf56d2408957541ae86a00dd5a1a28b11f40033d12405b4b0325f65e69a0c700681b69a0c49b120d7429806e230d941829a0819e06a0db4a03d5580f670180b695064a8ccad2406b00b49d3450e25c020d741180b697064a9c01a3812e06d00e4cd01d4c3c871b7f1cef0e56e916f514b801a77db07d131ee66e691ba79c6662d48e4cd44ddfaf8b78bfa72d9ab81546f59d24b2a6a964fd1266b5b64b65dc291993d8c59fc73af19f07cace4ccadd4cddf4225c9d9f514f21c1eae011d1228cf8332cca4eecb3d29602b5851bd8f64cf2682555b649c14a2a5a9ad10370abeac2e48bf696b1f77dcb556aaa7de1ad60e195015e575f9da728012e3e8547044f1e67eca6534b4c9451a837f1ad279cd03bf8b886e2ede8ffe735741e74ac766492ff777b7769cc01d80e68bbf9e85cd57f8988dea7870b036dc1e59370b5dd496e2bd538f53c195a6977fe8dac605d118fc18e2d1cefcf76e8834cb8576278c8a1c1c792e050c44aceb4f6ba2db4d79d99a8ede0d44f4e98f0d2bda2b5ca83a027d08309182dd66838212279df398d2b5fae83537c1749981a57bedc04983d25616a5cfb7f2960f69284a971edff9580d95b12a6c6b5ffab00735749981ad7fe5f04987d24616a5cfb7f3260f69584a971edff2980d94f12a6c6b5ff2700e66e923035aefd3f093077f73de3d91066be8b76da6033b9d8072d6e3f1fa6e9f690c89aa692b51fb0eec964b59b3dc505e5a2a98f92e0e1fa821c765a3142db8b89b6f15b496b5ca8500531a3fe92387355724e05ce019238b354726e0b9c699238335572fe07ae9de992387354720e86d6992189931a71a771ee069c999238a925b3790bbce064cf92c499a192f30de0cc96c4492d2c47e3bc1c3873989c51516d4bd5f436c3381518737da423a6d71a9f6b9e2f1f0b7879be13641abf9d39311047dbce7c048436f666e77214ba0cf8727772c7295c5ec21c035980fda06deee3e376d3d0cd6650f0d44a63571a15063f256f03484b92ed0081e1819238a91b54d238b381735f499cd4cdcf699c2de06ab99f244e6a396d1ae77ec0b9bf244eea7ef234ce32e03c40122775f76e1ae739c0992f8993baaf3c8df305e01c2489939a8e40e3fc1838074be2a4ee2f4fe36c0e1da5213267ce89d123dacc7926b4d2021f652da2fa8a73d7c58d1a4e9dd198853409dae95049d1cd3c95b5c066c354c630499cb92a392701e770499c592a395b02e708499c992a39bf3331e748499c392a3973a1758e92c4495d4640e3dc1138474be24c53c9590527fb18499c192a395f01ce03257152f70ba5719e039c63999cbb98bad513c6b997112dedaf76870c77171be29658173aa94a379aa75755a0954a7f1c88c731897b994d9f344e1ee113176cf560313f0603d28398ccf6576311806a8558eda04d8e67627532ebdfa53179e44e83a495a0d81c3a4b13a44012037434c8eba0454e9402494ca4a1410e04c849522089114e1a6416404e9602495cb546839c0290074b8124767168906300f2102990c4510f0db202200f950249acdf41839c0d9053a44012abcad0205703e4542990c45a4734c86b01729a8ff9f386e343586d3b79493f8db52d8b7519b01ec664ddd524cf9fcf34750b4036ed8da6bf8540c6e14cea01b5a86b1a84acdec44812b1db4f0b8d3c0efcd353595ea56e1ebdbe6ca66f213c3243122631d644c3fc0e300b25616accb37b0530674ac224deb26898af016691244c62578b86f93a60164bc224c69e68981f026689244ce2689f86f92960ce9284498c41d130bf02cc524998c4513f0df36bc02c9384c9dcae8c85f90d6096fbd851231a8096af772a4e63c4fe4d184c1ee1235ba9a1b01e1e2ec4d4b8e8e0216899b3257152d769d238ff049c159238a99b3bd338af05ce399238a96bdc699cb703e75c76b1d30a77dfae72b1cdc2e021f60e4edc128776efee6562b4ca546e359adc0635ee4db03d2c19acf251700a536347271261e7064f5c62346f2af614b4c8793e0a4ea505ffa2a37aaad675010bef4cc09bcfc4eb594f1b1c1efcd0269dd4044fb12655eeaa38debd343bc6a931517a76b58f164abb663e08c8d54ce4ec7aae99c9fb61c6c5a8ea4eac55bb9ddbaa83afa28fe173eb2f60458dcad38a58ed0fe3a5053ec6f18deb42e5a8dcf6e924e840d548c2d4b8edd372c05c28095363d7ea78c05c240953e3b64f2702e66249981ab77d3a16309748c2d4b8edd3718079a4244c8de1906ac03c4a12a6c66d9f9600e6d19230356e7c7b32601e230953e3c6b72b0073696a0378e1a1ec989f3ac34e5b78bd020693c7fac8a9b7c193b862bc7dc1765cbed857148a16c22b3131e471a96c9398514f6d93f35894cf4150f978266587e08b1298ccc837935dbd854af7a20b82976493b9edd3f505ecb683f6b8ccc71a0f8c8a0e0e7e58157c56e35ece78876c4ff3f9260cbbd1e3a0139a9158fbc2ade704266b5753bb46628959945838907cc27b5a4c3097d55257c2e97ea29c2b27b19749bb727686bbf949bef7de68fc8a23622ba5ad387a1f4efce53e3a4ab94db4a3b4066e4c27fb38dd1b3712d2183b1a05942b9894dd12940b8253b9dc546fd4c94e84a59deca7c3c97e8a545862e898063b155aeca95261352e889d04b02ba5c26abcefef0db0a74985258ef269b017c135f674a9b0c489631aecb9007b868f32fe8d5fb599a6724df1dd30aa3a531aa8c615efb701e859d24035ae2d5e0ea0674b03d5b8f2fd44003d471aa8c635c66702e8b9d24035ae805f09a0e74903d5b8d6f80a003d5f1aa8c695f09700e82a69a01ad71caf01d00ba4816a5c11bf1a402f6482b64d806605ff1606dfb4eb42bc2dbca1f1dd6762be8bd86b3997b831b99d52b6d5eef2dde79550704dff8c7d17e0bc58cec488c66cbbc380f21226659be08b3277152c76d7c3f9411b8ca6ec887b1ed04a586e0170974adaa8345765a023036e309749e2cc53c9390a382f97c4a9330cb70f24de5c2189335d25e754e0bc521267864aced381f32a499c992a391f01cedf49e2cc52c9f92e705e2d89335b25e7afc0798d244eea6a231a673be8285dcbe4b45f9427c6e0fa98b63231d3ea5456444c1e7153efd7b431f7ded0e6ae9384a97185db10c0bc5e12a6c61a1f39807983244c8d353e7201f34649981a6b7cf406cc35923035d6f84803cc9b24616aacf1d11d306f9684a9719dc62e80798b244c8d353e5a02e6ad923035d6f8d811306ff3b14ab83198c9fbc011dbe80a16eb040867dc2e91959a9549636de958b76c51ebe043eb1c7cb08be1d8284e9189eb6fee6586193b355be2488a82af479b72f7ac1901c8d4e0bf8dfb5b1c16fc57dff79bb932ab0566b1a972dfb5c72b76c79e13fcd4beb26a3360b7e02177d8a6d12ad134faba1acb76f141dd42957d1d46b509972514398ebecd5a07dfb38f9d197cb734782f95c1ff97265e6ff8d378fd68ed9fb6ace7b97d9bb54afaae7dff6185ddbe1b512aa1afcb2fb04799153c3aac8b6a2b0014babf45685ae2daef04f78caae0195deb3ca3bec74d346589a650e6148b83676e4a6a886d42cd9ab54bb41a5b3d788c2971efb5d8bddfc2e03745efb3ffeec1c35c51d270d1c85eeb968bec95283f3a27f155f4fd0d1fd3b699f51fedf7b66134abff9a51f13f6bed1b7a47e1096a9f3fcbfdf54adc51476cf09d6ef8fd357ce6b45ecf5fa5ff1ef66fd194dfff9df6ef9ef8b3bb66dad95d1426057ff9e2c4a938367870584ac3feafc5ff01fda62ff6b7190800 serializedProgramBytesString: - serializedSignature: d8160425fdf2849e57277ec4bf09134bd19764eda05e8404780cff330910285bc6b25945978171169ceffbcfdc440252d7d1dc90778283f858ab25dbe773c901 + serializedSignature: 4fb469b72f098e771bbb616458c230109163c14348053d0d899eba209a2ce45dc91e2a274687bbf4cb06f93e72cc6eb3e811cdfc56dc23550089148435e68308 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset index 401c8cd..adc3294 100644 --- a/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset +++ b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b53144714ee5998bd08089a80788b9a18c5083bab58e62d55a2a8245e08b754c54a2d2b2cbaba5cb2bb467dcc53aaf28ff294bf911f91d73c9b73bee9819e99ee1946b6c110678be99dbe9c3ee73ba7cf39ddb3e43c4197334eb72531276e8bb25814ab62536cd0b7db54aed3c77f0aea67458bca6774af51dbb8389f3292afcbce28dd67e8a92d3a34f29558a1b281f67951a7ef3334b64e4f5cbb467f75eae5f4d2a04571473c168fc409673885c41206b5659dc3723945ba4f89b7d45a07533c8987a613749ba79636dad689e9a0df13f113c45aa7b6151ad3124da2f914148b7ff358c884222fcb5ef9bd4f79e6b2204b57b6f7cbe71cfd95989efcaed272e5f837097d03fa3db22cc9f10386f623b2fda87c2e2ae3d4f641dd9cae034ddc276c6a624b7860e24a06930946a61b0b93cee77c7cc96a78da0ea9658b086834b6087be88849715dabb1934ebfc2f76ddc6bd4a301a243f129fe884dc1cc35e95357ccad4df5f760ad6c700d6a298b0754f2a865718d0ce84984ca124ddb2493ad8b05ba6f81de32b11def9926129b6674cc1cd1f457ce3ad504806ed173131ccee3fe0b38ad83fb19aaeb601d6fd04a9ea2f20d668bcbdea2efba391724647a1ef50bc854ef2fd3404d77481ae6de83ed7ed4c8416884a1cf0fc965d8ebc19bfc1ed3c4470c7d27e32230f934aef9a12154775d78fce8ccc510cc2e635c42bd7dfb78df14371265d123c3ea3e0d0976347ce9cfbfde4dd5fff9cd0d8b36293c84ad3329a22501cbf4c69c91188564115cb7b7c28c46e17774f0230ccfef23fc7ebf06fa6557401e9129ac0004dc2068ce8be7d4d02256cb629a98a881eda6647211223511e61ab26e0ae3eae2aef49e9be235848be9b3929769cb9826e0a68965524a4ea794e27e2b25dd0b2529a5b82dd78e52f8d22358322098c68309c11e1d82c8deda56115ca43a3f5d9a466b035654a668cd51ba464f5348abdf6e5b581b7299c6dd423d8f0c62f7438c7f05de9235c049ea598d06cc5ae88316bec6cad94f394c5aecd56991c57296ad6a3148bae729bbfa8eda6ad4bf8e08cef5b344b1467333bd5b986127510f8f48d60f27db1311fde8f53200bd5c54b6107be5cc84b8ab431cbbb4857df43cdcb6092a6c69d97d0f6fdbae462d5f0fed20a01d8d0997ce8209c2bc06c20a7bc3218d477c47975b8a30c67eca40bca0d34fff7e4786c724fe0be1ef28b26be7d8aeedfeb8212aa4cd6f524d51871ece007edd177f92b6f1bf87cca41e922f98d7f7b2cc51b0f39ba3720d5c70fd8a4c1793e74ad6cc27dbf8ec68c6c319c8b4d8fdf1857d293e256e72b0906158c84442c45ac0c91bef79d720e57a629c0a90084727bd758e60ee0f0b1993e59774968fd3ab6707920f2d49e919edc9cc1a49b662f6173d512b66e7eb5c4db093bd71749e93aa9d9bc162466131f6b83069ff884efbec869d1707a2fdef698e1a666ca1c7a60cb1ddb381933a1be070e29413d0ef065f114b483287533007db0c998ca24f97a7707e715a68b6d3df6cbbb97022f948f0bb84d798f7a5dcea9645953ecfd052150fa86d0584d4f4947be8e89912d9589254302749fd26c9cee824bb135902aa73f625d9240eaa84f4cfd0465322cf2da671492de1b6709e9945ca019394677552fe60d09f096f5ff27bd061b0c59ba5b22d8f49b8867be82d31699b681e15767e59b0386ac2e2331d163f76018b392a3bca76b6db58e8567e1644064d889cd321b262f441f1f4a92c6d98d1885a046ff357336013d678162ca2eb68896a1b34b71ea3027d1c873dde34825b8b46ce62043fb58587ccb7922195e3b9d7695df3da5d20ee9e620da727681c0f4c6fecd662c1f87d5fdea449e11faaf1f835bce10b5e08e8a4dbfda622fea2aa20250a6811d29cbb1f3a492fa85acd79c341b2f93ed694cec5e73c5b8fde86b21f42fb041ec9ad89c3894915c3f9c4bc934e3f6d333e0102c11b8d2ebca466a3ba45c0ac22d5698b367028b8b90ae3fe854d700a00875fdead4a8ff45f80e701e029b811e277bbb608dfef654edc5d0cc241bfc16eb8057aab51f7c19bee0f8ef38beaf21f8b2da1318dddec44247d24a97044faf27f1e2c2a1c2c2e31087d816fc51abf6c738d0f405755ac9e35ea52dda6cdf94564b6bdbcc82d8556bebb1b51f6ea1cc76c023722815b919617dd06a9cc5745c51e94255b50e61528afd884f28c84d2cf4f376085bbcba02dc23a6a0bd69202eb570769a1e18dba45288fdb82b2a04079d526947ca4c86184599c26061ad206ad4136680b3257816cdc266417348bba856df42b6c6cbf95bfe43b6c5e33a7003c6113e03e506b21497989e4313869b1065a9f2dd07a14d0ca36411b14a674674376b1065ec116788e029e6713bcb312bc8e780e6f688ad2f15334ab4b79d816b04505d88a4d60cf697c6596c3418be09eb205ee1105dc6b36c1654fbf153be5b606d8802dc07ac5a139d7a8706a7a9d95ee48a58f258433fff0e09894937f1bf01079444d1e2fd49483048fb1766e8a6c8791c934d377f993aa2811fd34bba69f6e9c5ce824ddcb29467f82563cde421d6af96f08ff1fa370b1999e80192f2a275f8fa9f32a98e2cbfd17cd8c331253370000 serializedProgramBytesString: - serializedSignature: 2c6ca1dc67eb5377b77c5963e77c2a088ffffda75d767e92be6fdd29994ba18083555c8f286295544153c734116351ef52f0403ef8ce45be0dd56aa7a1845103 + serializedSignature: bd56f2c3a9f303170bf916c62b41c27e8d3420c44479aa27ea33116ec1c259cf635a2fb5ca17d6725bbfffb799b2a45bb857e67e0146afcaefdf25dfc809350c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset b/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset index 01b0f1a..6903feb 100644 --- a/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset +++ b/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed58dd76d346109e752cc96e43d2d036294d5a02bda84b0109e8e19e04daa6a7104e12e786f6242676a85bdbf8d80e27ed23f48d780b5ea1afd01768bf1949b62cad241cbc0102f2b17ef66776e6fb666777b6e0122e7515b75ddaa275ba4e55aad353eae06d1dcf367efe5758fe907a783ec1bd86baabb49ad393afafd567b86fe0ab4f03f43ca2033c9b52bf4d0dbc6fa06f035f5c7a887f03ad54119daa749736e9012da94f7344ec4aa77e50a6d82e55c27d8dfe446d4394e2415ca95ac26d1b357da96b43e9b0dd23fa55cc6aa3ee007d7ad482ccc722b1b4c27dc5267938c1b3807f99ebf9dd52a2f98f9055a32eb95ca9be9900e2b0673eb82cda2ef8fa00651e760033ba10a0b1b02af80de816ddd45a7841cd46f45e977b0d2d9a22b4941ce279620856ae855f23424f1fe53f08bb4c501335d7e9673cb9d73edd00e08f625276316c0b14376807f7aec8db87dac99679263195f13e5b90e97b5a1b2521a05d7cb744c36db93f134d1ba2fd06ca06e2f71d78fe1a9ec7325ad2f61ede7563ee0490e975d43b5c5ab9efd6214d77610d6befceb09bbd67e47530c2d0dba5601a165d9e23eaef0413ef31f4838c2581dc9771c30fa5636537c9e54fb5954070721b9316eafddbc7fb367d97698b1e19a67b592c1831fc577179f9c5fe3fff5ae3a6dd22d766d356724ccb0296e555d4624242b6099655f458d138fc4a07bf2c6bdba708bfdfae29ed2627c09695699c0059fe76f0728c7f0b8defa0b82ef16f9d7e43b38e44bf16e2202bc8f331c19567074b7c45b398e6a99c0678410778e9b401cf8f3059809786768d00e74b8f603905c13c1dd2109cd120e8314d1fe8fc40f42ac7f4e2d629d28b3a7ed8047568949f2acafc8dd63da96d8a7f728faef8d920080769ed426eeecb36f74834c866f143d8732d06979ec15961f08a6cc7a7af651acf968e09e658fd629489e4963b7c5b435f8e1dcf248e1ca1bf6e8b9e8dfab997467d4e505fd5260e93699486b0ad4398dd42fdf15a7c3d94f954be79b430199b9ed7cf0f6d1ee1efb2832b37c3bfa7a3d947bc4f0cb689e4587ada178476f3caa43985a30baf1cf1cf6ba2fe7fb812d195a3a5e5e0a7143bd33d51b107a51e62f8a67cf5c9e589a03cad77ebd362e6b38d7581f3991d68f058ccc84f923fa6f4243919d34f9a2fe559e1af75dcff5092ea700faeb32edfa6f4dcd0092c0a6501e939fdeaf5765bfa09b31a1cc550c19569fded09bd295f0b3e7cb267f43e34f9ded017f0404ed0208067fd9e74afa1c9205ffe2664fc1ef0a6937f4d048449c414ce85d8a9ee0098ba44913e7e7e0473ac98f0efa7e665274b1092f3615e22d0b184cb9ec8abc7e70787e5374ef3c5a87f57123e320aaffab0e871785d7ac7239fc7918f8f9e878733058ffde182c9d9ccabdf9361521916c74679950380f2d8ec765ec68493ccf01999e13e609f9b04ec9cb8f69e0c7c88267b43d94da8630c38cb147014016ed924708b017007c1541de03d2a30aafc1e79e6a02c9b82d28940b96212ca4b0194feeeb4235ec84a0c24a7ead04fc129fb5903b81001f80b9300cfa74ef2ce5b1b215504bc2f4d4748cef1bbb2ac8c9f5ff6cd01b7600a383b02dcc5d35b8b378248690cb0595380152380ad9a048c2d381a1e228c7b9a31d8e64cc166d19949523c4e527895b28b01f595949d66bc3cf4fa4a26b9959c20e3e71b0b01721dc8bc2fcb630d9ad6e439ca3d5c6ea66ed364c978b6ccfcc4e0324512a618e3ada9313e8d644767e9ab243eb319acb87c6a77a6edff8ac60e551d6b49d2e22a98f7853768138deba2145fd6ffc347f2e4f6240000 serializedProgramBytesString: - serializedSignature: 8f2154e332ee3f34c109c8b6f2da893723ac80443f92a68adb437bc06a47cebfc827e137b7ee5697d90855f705e74939568aaf75fc57581772e2b62aff40920c + serializedSignature: c247635d6747153132d27ea8393726dfb2b1f6fe8b602995ed06661c84d4888a84b570696e778f2ebb3520f6818236c08388d62a8ee377dfa848a5106ecfb008 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset b/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset index 48d3136..e7eb0a8 100644 --- a/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset +++ b/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9de95f14c919c76b90e110f0165050f11e0f18c45b514440445111c475d58d228cca2e088be06ab29bcdb1d9241b936cee3b31f7e6dedcbb3937f7b52ff207ec8b7d9997fb22ef937aaaab9967aaebe9839ec26e77e133d3d33d55bf7eea5bd753d5d53d0569c6ff125bf9db59d6cbda5803eb67436c8cdde09fdaf87694ff5b7bf6f11e36c1b7d7f8fb00ff6e2babf388097f1b13d5fcbd8befdd64933ce6141be4db61f17d1fcbf0cf5d3c6e86efc1d1abfc95e1a112853c523f6b67a7d849569558ea21715644ba298f25205d8912fe7e98dde1df6684517092b4f8aa8abff5f16f6e8aef46b9d176b80bec1191ac51fedd208f33c146b8e615a15872b782890fccda2c96db42b95dc05fa5f2f37cb95dcf5f45fc7502ed43f86efe4af2d7903cbe04c583f027e57e81d42c919ff17997caed3c745eb7f09572bb41b16983b4e97569d37f5db4ec746d5434365a1a89759646a2d9235db6ce2679fc94127e334ad3661416b65b659c1eb4cfcf5dd0ad68dbf1ea65f8d3681fb60de81c369b343ad6808ec1b651eaf4a27d38ef3a175eb60d55681f34fa24a7eb1e3c36b9c4c7fa2985afcd711b7396c92dca39b6a1e32e7ce75c5674ec784d0adf14f1fd19e57815da474c0a5ef4b037c572edad54f45328be9df66a19a6df25afec7ab250b16fa1c2dc2dee1214c74f9d5c26b78b7c865f24b7db51f8ed56fe14deb3f8250b596e3a2ae476874cc759b40ff1de50c22d71094f9c3b794feed7583614db79502bb77b509cbd52f721f49d7d1cb63be5f7e7d03e3e871d7eb907b33932de4b92cbebf278d267fc050a0fdbae8773ed2ab2ed290aa86b97af5d8aee2ea9fbbcdc2f0ea8bb426e772bbabba5ee7fe47e894fdde54a7ee9c2b89559990fc5872cf6c5769b679fb336603eec53d2b54feabf22f7e706d4b5f361bfa2bbdfd22da996fb650175ed7c6856749ba5eeb8dc2ff7a95b9b877c80ed01749e03d216bbcf57591f506c3f20b72b3d6cf563c741a471d0b2a3f449226f0e2a761c94db5579b0a30569b45876ccc53e1dcecb16c58e16b9ad0b6187cafc903cc779b40f36bda684c3fee63cb96d65b97e59ab8cfbaa126eb50c7741eeaf61a26e96db6dae1f7bedbc39acd87bd83a67d95d259ccede36c5de3619f749e66eefda19d86be761bb626fbb75cef266259ccede0ec5de0e1977ab87bdeb02d86bfb3d4798de37ee447675a2b0b03dca727db7a3967d15b7156d3b5e17cbf5ddbae4f69892ce6352a74709771cd9725c6ebb95b8dd4a5c3b9ccac8b6a90aed23bfb0fc191dbb64428c148ff2b1db001b67690113bc66bf435a3ba6f76016a48be00dfe368ad34ef261e33817d08c28fbc57875927b484dda11e5b24439b2bb4dbc0ff010c342f4a2f3142f3b4e01c68df0ff0c1a0edfe4c73bc5681a06c4c3fc9b069e01c322d665ee6a5fe0ffb92a67f96947f8903ac31de8297e2ad0bbcccd7686f44a120c9dd538bd5cd31ad98ff22336d071be3f222cec13efb784a519617d173f3629e6196eb06bbc311963b7c5d99c699fe09f75e73c2391e96dd40ff0a9e3d634829d4ded3c35607d5af41d6fe5c8fdc811405f745156c3c2b4e8a99f73e4c45b0cad4626291a6b4b639b4096c839d6c4d2623cd4eb20183c8dce14eacbb7c57b171f50baa5454f06b2bb46a4209bc33d4f4df55fdc70e2d9646ed2b6b3b41892d57a24cd0d2ce8a512950e05f7242493858d60a88a3fa1c32f86777db388df0a372cc205cf8022d133e56680989e3dc33fdce6af11798a0161fc20af5f20dcc7a34ff14f60ac239f1a41b458a07676a45ee652b00b74b04b661bb677ebe206bb643a5d59d8f0a727584a10f4b2812238474750787b676691207c3726540678d8e00c613a608bca500fb04c00ac7624cedb040a61a10ee1dcfbd3e0ceac0882975ae5bb0856b8b697410b6052474f4cc39c374acf1e07f47187ef38ff6e8087cf08a7028e5b0d5a76bc901bca9d268c0feb159a7a92f305c995682433136b28b2451ab28d407681cec052c540b08d102ea6841786142ea1841785142ea5841787149e4b092f09295c46092f0d295c4e09578614aed009039f2a4deb02dd8e43bc82169fa76b2544522ece4a2b919d2db03f1de671aff3f4dc124340707b74b30bee2d45b5ef9662996829ea986ece239845546b315f4758e4e9634609f7f363d67c4887f876580ca2b39a63621fce665fb7778b01544f88750053c21677fecb7df3af11fce12ab1597ba9dc594055ae5aaaeb0e50b91652e22bf220be48270eed31747b4e9f4d552ea39517eb94a10b59c59c1ef5fff89f43bc94165f4231a9cb0393a53a7168cd56fb698397d1c295ba4a2cdacee18854e2fc56e035be2bf05a5181eb0355e07c55de2aaa2cadd394a544c0b254ad13070f0d96213906f1707d187ab561b1526a8c0fe8cfb16eb6cf6330ff08070189bd26a73433d383f53a81e309be1d14e0ac0232c243d509df74d29996623a2dcba8b66243d8b662b94e19c26ff453e35cbc9e1aaa114a691aa175498dd52e8d502d65f5a69056afa04ae4664d892c0858225752b9b8256c2eaea294b78655aea394ebc32aafa6ea6783ae7e82d0255903db843707b52cc36b6b907ab4862a94694da17c6d6eb042b996126fd488df2d0b26be8e12dfa6116f2e0f26be9ecae4a6b099bc8152de1e567923a5bc23ac724aa70cd57aa79fc6a58616de44352ebb348d0b0bd8b86ca6c477e7417c0b25be270fe25ba99cdc1b3627eb75cae0f5edf393936b69e1068d705a0c14afb2fbe14e9e6257d8a3ccbaf09a5f4772bf8e94d691841524a90414431356522e645a97c5901307fc6471339dc58d54a93c18b6546ea32a534b1e2a531355e40f852cf2db291ead6179eca0940f8755de4929b78555de4529b78755de4d29778455dea35386f047fc140d17a7792f25dc1952781fc5e2685816fb29e5aeb0cacd94f2b1b0ca0728e5e361950f52cadd61955b28e51361950f51ca27c32ab752caa7c22a1fa6947bc22ab751caa7c32ab753cabd61953b28e5beb0ca4774cad0c3c2a5fbb03d6c2725de9f07f1a31493b3619974e994c1318015f5611c836394c9e7c29a7c5ca70cb3c10ffb31d96536b89b32f97c58934fe894614202d6f93a2635f631fbb255ee85eb7e315c1811ce31dc110a83824bfcbf8b7fb2a2c334251cc14e3b76afd5ef7217710499323949a5e8a22e454719e5fe3b67915bb9930ff7d2de91a903bbc1f1576dcf2e9fb824a68082aa0749ed292ab58fe852bb9ee50ef6d414c10415e445b7b0e91aff7cdd257541ececa1ec7c9bcece56c5ceec392d3bc73839cbca9bfcff8c9c5e73cb073a7ff253ea4e53e9bba44b5f93923e5c13d43ce99479e2370d582b480a7aa9145cd6a5a08fac37f8fc38b73ad8e33cea806c25eeb8d48ddc76c14f987ce5621fc56040c7a0c557296de52ddf906c19c7f2524a675603cf5069bba24bdb810025b4cfb384fa6df5cf7242c301a7c8fba9740dead2d54896db76febac2035d93a9ea66f0ec84207dd64cac3f4b593fa4b3bedd5789eb1493510322cc44245ac787a8546674a96c20bc0cbc842eb7bfea107da9ddaa78c50d62f939caf2ab3acb8fb8d41a9c435da2c439db43baa499f79b1ea6527a6de63db4aecdbf5f65f03c95beebbaf4b5f94a9f9f7c9ccd345ea0d238ac4b63ff743db39794e11be82cfba005b9ca06e4547fd774c80e764bfaadbda22466f8296e89d0d93ee1060fdbc64f7553f8c9a3288e9a627cd740b056b598ff27c4c5d60eb968e10ef735c784d624d7488bf5568dd329f5bec510ce3dca6b18e4c0199ef22b2227bc6f387c94d1371c3a2fb2ccf4de33af54e872ad01e51b4e9d779ae8fbec8a658a6c2d4e5a2c3e7bd0520a4b268be6c95c2d488b35705b66589abcad1881b3cdd197a1e0f7da580227193cfd890bc035af4b22fa000f32e9adaf5efe52f5eb85807d43561eeeb1854265b9cb13cc1adac15f71b2a011b88f9a84335fc081f98ad339ad792bdf1b12a5360eb85e2acde2ba61125705816b377438b140f5424916d59849548b05aa4b1c0bbc436f8917dff5f048309282cf71c0761b55c871f315d21a5ae69631b8d4bd2726a5ec8db9595c8f9bc4b5d4b594b5294b3ae380ee0554d2264ca29b4796b4f8b466875039bb6912d6021256bc7aca7b6559609326815973c0d624ae35fd10073c2385593c5326f158cb647bc569015187985b1c8b496f588e30dd9a3d27a24718705534ed4744151ce1516010f4582cb035236c4f987722accaa7828a4f65ac2bcee2ba6d1257f97465b4020dc5ac3afe7b4e16d41df32e8373f81327d7b4518c158b938ab83a859dafc7247911a6a79aa01277f0823f2e8e82de903af5246e208c9ae56f6768ea28e5987e49051819a602faf729d7aa9c72e97555abdcba9a94c6b949f96873531ed30729cffa95f2315f63abd08e7dcac72033e5cbe3cdce42eb678f1b41e41deccd3d41dc0813c4f0a8c8a2131282d5523f65b2a5ae96a5d9ba1e0033ac6ed75a2e8975e38a0d619e48559ad38e97f949e04cda72b85a6f777cef8c12cea658e23c86703e6dda8fb07a047cc32e3992ce1fbaf9a6d0952074ef32890e1a9321d1350d883b6e2665773626ae6eda2da6318015a600162280ef360910baa4abdafe39cee5af1ce17b8f497c95b2251c943db3ba4823f792b66348903f94c5a650562394ef8d52a7027733c5af533984703e63ba64aa153bebe0c37230cba4eb02ea500cdbc80a84f27d265156c992798d2c9bd87c2899c660969a82b906c17c364a300db699c660d62098ef8f124c836eb83198eb10cc0f440966530c61ae45303f6812668da637f7b386df60dbd96c0a6a1a417d2e8a500db6a1c6a03620a81f3209b55e421de18100a8f5002c752e7526777019055f630a7c0a81bf6b127c85046f4d2d037a5b7bd8a43f9a34058e21701f3609ce1e295973f36e73ec365ec732cf188ce16b11ce8f98c409973a46e5ecd130b37e7642378be458301583e1e61c04f1a326217a4d84c4dfa95f8c503e6f12e54adfbdbcb3f3318a76ad29b44d08edc766a3e5f43fc764d01f3556e9f7239c1f8f12cea658e2ec40383f611227cc5a3baf0369979fc6a0ff2e42d83e69129bb58c21333db709ada2c5227e739a0b11b44f9984b680657d48bbcc65c49171b1320582c5afaa2e43f83e6d125f25c32e38b5846516dc6f63285722949f895227020f6e8b1fce3684f3b32671d6b2dce98c293910f4ba1ddea8e768ac93d983b07e2e5aa574470c4be94184f3f351c2d9144b9cdd08e7174ce25cab547a083c21263326a7abbebd748ffe7919a34dc03253908f23c85f3409199c3ea77b4e2cf68e41db598cc07dc924386b15f22d66ff4885cbddae31286ff310b62f47a98d8487f0c6af8d6c4538bf6212e76a0d4ecb3987b6ef063bc6acdf897ed0e62d0b10e07b2601970ac083ccf526e3185c009b8f807dd524b0354aaf3d2e2a72e64d30e1db85107fcd24e2a50ae261463f7ec9204863f345db10c8af9b04b9520139f8c097d17a84f61bb3d1cf537349d985d8719e4faa4338bf391b38fdbb4d06177219c3d98c707e2b4a389b6289f328c2f96d9338e7336ad1cb0d19c4183c63b7082410bc174cc2c3172d726f388df34297e508df774ce2b39d21aa2acfd21a7663ced06604f2bb51011947af721302f9bda88034b876dd18c82308e4f7a302d260ff6c0ce41604f207510169f0928431909d08e40f4d8284d920e76c79fc7ae72402f62393c082dd4a6ab07f36e627ae46285f3489120a83fea6e6f85ead2943f07e6c125ef0f1f3ce180ef85a10ce9f98c4398f2c8b715dd83717a1fba94974cb3525f1c15cc6b21721fd9949a4f8b14eea959a595afc676cc2b61241fc79b45a488365d2580bb90fe1fc4594701a6d358de16c47387f69126719d9e1c4af5d2c45d05e3209cd1ef651ce77dca7c6aa10c897a302328e53634b10c85f4505641c6774562090bf3609d27eac83dfee654f0c3b975d08e66fa204338e4bf5772398bf8d12cc38ba3deb11ccdf4509661cef44dc8060fe3e4a30e378c97f2382f94a9460c6f159a95b11cc3f4409661c6f1b694430ff182598719ce8dd8e60fe294a30e3f8f4ca1d08e69fa304338e773eec4430ff321b30a905a6f645b1382f2f5d8560fed5244c6b061d2e3bd84fe5875fa278309e3abd0041fc9b4988d61d615302a3c74f17c5a0ec2d42d8fe6e12db425491e13955f64d74b374e5c6d82d754b11c07f980418fcca4d1c67830eb307e6377d1aa1b9fd27148932592452019ed796f2f9fb002962b592f5033acee3f60fc7b8df116cfdf48cf37bfce334f4c59a94e7ca81948f752e295f0ff84f057e5ab8f553370b6589bac1c39f108ec300ff6e406cb33f7b938639f3044c5106f9b96c774d284fee6aff824293d0b7232379ab09f9f89d1d5d4abdd347d7aa72975c494353fb40a7ff55c87799eda29856894ad6cf73de128787e34e884661428449fe1f9d43b36054c70000 serializedProgramBytesString: - serializedSignature: 9d4b8ff2f2953a6d4bb9acf11aa53729dd058dffb1b7c0a1aec7eeebbcd4e04e31213ee8995cbcd1a5bc9c8b902252f88d7fb52944435c50f652780efb35bf08 + serializedSignature: 86ac60b486ddaf5ec4cd02499cb47540b4acca67dc66d3f1a8bf6a3ef9c5c3788ce666b224e97831e53d335b47a564b3fe0c1a6c14c718617e745189e05efc07 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset b/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset index 0284aab..280894f 100644 --- a/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset +++ b/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed574b53134110ee59d8242810f185961ef4a49614bb80c55dc00716af22840b6585403656aa9298ca460b6e9efd2ffe00ff9407abbc78d1af7b7721d9ddec18619142b295999d99ee9eafbf9e999e352cc24f4da1d8a64d5aa4692a5285de53136f8ba81b78bc56d0bf416dd4ef50963136450f349afc7ba4eea05c46cba50e343fd03eea9a8c17c8c1fb32741db4b8b78abf0329350ca5222dd13aadd1a4baa531b12d4aaedfa7d82f9543b94087187504144f62c9d0248a02465c196b007420b7436fc5ad06c6f6a1d3a63a6cee89c59cd085bfa904dd6bc897a94596c1fd4f06a031d0d413c8a6330691cf244fdb01d4160cc47851148e3a3447b3b15edc55a35db817a52c43a2264687a2537c8d4cc1e0ea789cae10b8e87f2511e420d430324d2ba8596b976640ea4ec8ca36a6ad238c0e6da16c89bd5dc08e4aea5ce27085753661d35b4d0df40484b6d0ae0bc282941f05a923e897d1d791b5ddc4ea5e407d20b3457d6fe33d6ece2d9fb2788cf18baa5fbfb77483302dc11b466f717c2e23f24f22c2d46786fc6d386cf11e519f2391b8e4d03b644c39ac3d1b334299eae99b258b9b6a33c2e0e03e463d8c5fdf1edff3f42cd197786638dcf7c483e308fffcf1e5dbafb1ef9fcc5ed7e6c8cab06bf735ae2511cbf61eabdb110bc92e98e6b0cd40c3f4ab38fab3dc593843fa3db99ac80d1e808c64a6de00a871345720b087e79056d1e90a3036d1441d898ccd66b2426e3475ea00f6a3d788a33777d6f4eacf93247a73477e1dd34bde3d2786c1913e0cea309866168f5257a1f94224dbd0df80444d5a2e596c5ad9035ca4184103b639036e01fb9e30a9bf565d49b856554f2dc3eabcf0f862fdaa5cc382533bce3bbd4ffd6f1359dfa3c0169866022e9ca7bcb2327e50296b86e2fa32a59bd39f1e6dd1b8e465271c001ef7b2bd4a384eecd2b9433edacb73b0a9e337a3cd9b7aec3fdf6f36efb7f1ee4ba461318beae95f1e767a78f9eed9b45f8ebaa5e0195893cf7e18e07896f070f6a842a47464bb0630a1d94e72171a11538184793a1fc11c9fe7c05911fc2e1e6f211b36c7e45a9ac43df489f3525e53a863101d30d246fb8dffb157ea99a6dba512d9e9113c9216c14617c11369129cefbb329bbe486ae465d3224ff9c7ec05486836278aebd1fc31e1fbc217f755d90f65e896a53ece25169f3b6a7ec03333d9a6fe24bdc17055fc7aad9fabe415e7e94912d96842542c4e6717daff9be1653a29d79c2222ef1977681dc21501c53ff337e13cb35652170000 serializedProgramBytesString: - serializedSignature: 01fa81872105a34eb1cc06f6e5b9a0c6c3ce8f6ff1cce38d88f0f9e0df47579534add5d7be4cdfd980aa90e31d872e22f0461bd9db0753c26b3b876cb9237f05 + serializedSignature: 91cd25f82c92cd225cfb03f5ca64742ede23c4946dd555020a8f2c554fb516000e9928e625c04077ddc892003557234833fc4e34f0243859809141990b920f03 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset b/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset index 613eb46..8b21a96 100644 --- a/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset +++ b/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7f6f8e70221b895e01228120a2421094e5b24581b0ac55b4a21901028411aa0a5eeeedebebabbbbbbbbbbb7eff5f5b5af6eaff6df999dc93d3b77cecd6e76cfcd2cff5ff890cddad973be73e68ceccc6ca302e6fc248638bfe6b3d96c12cb67f358055bc7d63a7f4d72b66b9c7fee9e3a3e8bd538db2ae777b9736e08cbade34efe3330d1c5f93dddd9dbc0363a776e62cb9ded2a717e0eab74fe9eeedc5be9ecf1a32b9cff95ce558926ce4df358299bc976629d13397588982f6eda208f25b85d8966ceef896c1fe76ca5508a3fa4409ceaecfc9ae39cd920cead719456d72d628b85596b9c73cb9d7b6a58b523739990d8ecaa914cfcc1dc4d47b9cd91dbad9cffcde5df8de5dfcde4dff07a7e9c5bb75b9a6b3b816b954cae7596f3ff57b9dfc5dd6fa4f6bbbafb898e9a8c16404637b9edaee9dec3f9dfd4f973820ffdd39debe9ea30f274b9df4e6e0f96f227827d874142e9de5b6e0f01baaa7bfbca6d2f296392767e6b70afe97c3fb9cd45cef797db3ec8f901f27869483603657ae9e9d392f9f39b16729b57c7f5e964b494db412164b472d3ae718f34d77602d7aae76ce3da2fae53f9856f0f05d71c2ab74d24f3c9daf12c797c8a76bc29723c1b39de4c3b3e586e0f03ba1ca6dd73b8bc672ad877f4cceaa2c938425e370de80ce5a9f3d3b5fb8e94c7770036c1fb8e44ee3b4abb2f5bbbef28e4bea3b5fb9a69f71daddda78ee7807d7e7e47d7c6c61fc9e343dcfdacb0f9255f6e8f95cf2903fb7c7b8c3c3e03ecf3f4b84a3eff2d79bc406e8fd3e41c57879c3fd2e8388c7963ef508dedf19aaf1cefca6c5aeaded7747f96f473be3d415ebf9326ef044dde4cafbcecb3e57eb1dc5e2eaf9b25f78b34bdd4f9e9daf91cf05c785ea5c1cdf2f8ce609f6faf439e57a29dd79fd70ba40d3c3f5cbbee16797eb6b63f274ddab4d66c3e51de3317ec3bec9abd5607bb1175b053e7a362a7e461ecd4798cdd48edbafab053b6deca927150f9a8f2c953a49c79e05a759c6f2f645edfbfd095d142f97c9626ef2479fd7cb00fe5dea69dbf4d6e6f073a2ad6778063b783637c7b8594b300ec73bd0ae5be8ab74aafd3b4e79ea6e9a5fc6121d887f1463d6f17ed79ca0f4dfc95ec1cb00f626cb32fe4f15101598e31b01a0b8e6d2bb7e3c03125fb64700cfa4073f79ac20a796cb4dc9e0aae3f59f38d5399d767b70bc81edaa138433bb637d8a1649f6eb0e38c34769c09ae3f1d5cafce413bc6cb6db626ff2ccd8eb30c764cf06987927db6c18e73d2d8f10f70fdd9e07a750edaa1eae7cd34f9e76a769c1bc20e25fb3c831de7a7b1e30270fd79e07a750edaa1f2b48a456560dfc983adffd0aebb8879cbdf8b98371f2a3933bd72da3c86a4fbc51a2ffdfc25daf94be4f6524d8f4b353d2e93e777d5f4d7cba885400f751f3cbf48bb5fc5aa32b0efd8d7b69f76dd959a7e57ca6d892667a626e72b2ded1587ab340efaf9abb5f357cbed359a1ed7689cae4538a9f3aa6c5d08f450f7c1f38a935e065ecfbc65e0f59afc1b58326e9bee57e7551fc024e4ba1bb5e7dca83de726cd4e751faf673607d7f0ed64569bb7da7d248fd5b76eaecaf6bb34bfb94b6eef64de3af59dae6ded65fdb7fd46795cb591eed6e4dc5d871c15c74c3a4e67debab9dec6bb8779eb27f748991fb9f77550ed399516f732afaf4d01c7a1bc995e795ba93ca1ea972f336f7d6f074d2f757eba763e073c179e57fabfc2bcf5cb57e4f655e47925da79fd79aa7e394d3bbfa376dd6bcc5bbf54fb41eae6f7316fddfc3e975dc7f575b02bd3e4e8ecd4f9a8d82979183b751e633743bbae3eec74ff9bc592795cd9b33338a6f2d66c569bef4b547c55be7a3fb8fe7eb9553a3c20755a0cf69db4c949171f543aaabaa3d2f541e68de30fcaed7cc3f3178063aa5eba101c53b21f02c7d4731e4eda3a4c95792a763e02ae7f085cafcec1f45275f6a69afc47353b1ef56987aa07413b94ecc70c763c9ec68e27c0f58f81ebd53968872a17b235f94f6a763c19c20e25fb29831d4fa7b1e31970fd53e07a750edaa1cae1669afc67353b9e0d618792fd9cc18ee7d3d8f102b8fe3970bd3a07ed68a2c97d9179cbf71799376ebdc4bce5bb7ebf3aafea11bb69e7171b38ec9eb4a58b6a4fd6b71ea0f4592ab7af4b7d7607fbce355da7a591b5446e552c7f8379cbe737a48c835d9dbbdea53dfb4de62d9f9780e350de4cafbc6ed7c97d55c6bcc7bc31bf1c1c8772df95d7e9fb2a6eb691dbb7e4f189609f3ff76cedbae572bb4c5e3f493b5fa13d473f5f298fa7eb6fd5cb5da5db62e6d1adbbca032b349bab923ed3e336b93d5b93ad7cf66d4df6db52b6b263a5267b555276ff71886c55eebea3c97e47ca7e48eeefa1c95e9d949dfbab261b4bf76aedd958fa2fad23fddfd7d2ff7d57d71e0d91fe2abfea69d59a99db295572fb01f3c627e53f1fb2645cf9105ccbb71f316ffefdc8959b7b9fdccfd29ef109f3c6f04f34b99f6ae73f95db8f810e1fcbed671af3cfdc67f7bccf7d6e2fc541a5fd3fb5b45f038e431dffcdbc795eedcf71e5e6aafe2195269f6b7a7c2e198c93fb6b359e2a1d543981e9a7eecbd1ce4fd7ceabfc52a59dff50bbff5f5afaabfb7b69e775f9eb34ff50e7553a7cc1bcf56a55ce286eba3debb5f34a9eaa23a974f852f3852f35bbfec3bced7a257f4fedbc925fa35df715f3d6cb83e6d1af90f37a1ed5edfa5ab3eb6bcdaeff6a767dac1d2fd5aecf01fb2a7d1d3feda9e23b1607543d238a18b25a6ebf61e618f22d4be6df6fc1b57cfb1df3c690ef5cb9fc55bd2786a867fca0f1fb4193fba376fe47b9fd1ee8f0bddcfec4bc79f727f7d97c18027f6e5f95062a8ffec2cc31e4174dc7ff316f0c51fb3286f453ef2b95cffcace9f1b3ab47bf83e5fe068d27164374fdd47d39daf9e9da791543566be7bfd5eeff554b7f757f2fedbc2e5fc5906fb4f32a1d7e63de18f29bc64db767bd765e8f212a1d7ed77ce177cdae3f9837af29f97b6ae7f518a2aefb93858b217f22e7b118a2ecfa4bb3eb2fcdaebf35bbbed78e976ad7e7807d1043faa83e8c4cc49055ee96ff698a218904abcdbfe26f752ddf36629e1822f61db983949d59da33d49893f9601fcacdd2cecbfb138d810ed2ce4453e6c9bb62df913740f67f0e50ef2f641e4da8f1285a0c4934d3746cc93c31a4765fc690416a4c8ef49944b6a647b6ab479eea3750fdb075c49014fdd47d39daf9e9da7915435679cf2ba6b5f737d7d25fdddf4b3bafcb5fa7f98792afd2a105f3c490440b8d9b6ecf7aedbc1e43543ab4d27ca195e62b8ae3424dfe9eda793d86c8eb126d58a818527bbfdf18a2ec6aabd9d556b3ab9dd7ae5aceedbc7253d23701d297b7f3d47be1303144eb7b48b4679ebe07b1cff3fb6369646d621eff4f7460de98d141caf8c3d57b9b12efb3135b316fdfc326701cca9be995b78d7adfa4f25747cd1fcbc17128378779f3bfdaf7d3e78ec55a657b27963ae6433db733f3c4df4427709c6fbb68dcbab8320af3a49c2c4d5e37cdcfba6972bb6be7e578d5445796daefa864f6d4eee9a9c954635c559e547ed3312933d1c3cb3da1c69c96837dc7ae21fdbcd7ab77dfe8f57381fef0bebd98379faafca86ceaadd9d45bb349a5ff42af7cb6b7dccfd5fc73b3dcaa38d7c7eb0b625fddc7b77d35ffedebda3374bdf73a15e7135bcbeb97817dbeed278f4fd1f4eb07e4f0f3cbbdc7c575cdbdf7281b84ad30862adb72c03ef473fdfe1e21efef1df2fe9c90f7770a767fedf34aebb87ed73a9e37bf9ef7e784bcbf77c8fb7b84bcbfabf77e95076bcb38c5479671dba87ec330659c8acd0358321f8c91c7064a396560dfc99bc372b5eb06304f0c10fb50ef3ccdcfc681e37cdb5f9eafd0e4f6d7e42f77ed1e36de2ba7f6399a1c75bf182f04e5546ae74703db838e555763fd14c741cc5b4e0d92ccde73752f52f7a934dec6cb4ec913c7a1bc995e7945655e39e25d513a1bd4f38668693ac495577c99765dbe96a66a4c9f62adc6a22a1f5b088ef3ed602d4d959e83c179b02fece6d7afd03828796a2cea54b0cff53ecf7b7dad7e855e9f53726ae50ed3f49f0fee83fae9d7af70d3b158d5f954590fed823ea8e4d4953ee97c4cd6bd124540867a5e314bad53c93a5ea28479eb54c5e038df0ed7980e77650c57ef18b334792399373e8dd4e48ed2cecb31a40998bf543b098ceb4b8c06c7f8768494b300ec73bd543c6daae935567bee584daf71cc5b87517163b6f6bc5db4e75da6c951fcb3928cd4b95abf2b067ec7c74314827bf9753343f8c13e324d46f9b856ce2d4a6cc7bced73391e36b1ad3c3e03ec3b368f38dc7dc68897bc72981c5b9dd85ede5705f6f9763c48cff1e99f3152c93c406ef74dc384cff552f61ee8e3fabab81cc43cf947bc739369dab5898ffb3de7b212a20f679ad3ea2d776abc05bc03484468bfd31dd59d754f74147d4dfc17ff19281ebbd17188f58e00c36cc379622ee346a7f557649c6dd855f427a8a74f12bfcb9d2b5609a12b13298fb83be5115cb96ae75f25982ab9c1393e55ccb4e49325573967f25999b3e5772d65c3d822e79f57ca7ce7b1d54e63a492cd757eaf17f2963a6aa75e5997497c5aa57ecf6c47a63beb738d7344015defec570b0de788df7b094d2b85f6d39d631bc51cd4b5ac8a4d74b69bc5d3526daf71fe363d73ae4466d6d13cf9133bee4e3155c954ea58c3b52f103ef97f29d21029c2d137e5f983ff34291011e3d89494f83f866e90e185d5742963984096f01c2b6205a28e313b8560701b532d34fbb7cb7b042b496b8b990c4feeeec282640a6f3eb47fef0e9b4b77cbf29a56cc0a4435a5471da6a503cbe5e589565f1013b2b29a14724575fc09137ed1c5352783f8ddeb5689eb8227405351f8791340349be7f29470fe578bdcb74a4cc55fe744ba758ef0d56c82f3bbda89a3e5ce632ba40929e955c885670be4a9056a5d6a63d01b99a08b772e731bc4e7b1e507d2636f566b45127b81a8817549e39cd8b344f5a9b1ac43a9ec73e24b2fecbdcfd87dd6be35a364e4d8c2d1176799d3a785489ffa3c154ba1c6a6146a91e96c517739902e7d5ad6da954c1ffe6366d80af1f1ba74c0083631116cd9303ece75af9f8ff34eb3a11a4333bf36697d309d0618c12c1341f1c66f5e0609ce7434dc43d61eebc7b0ad6f86ed04c3ae29d6f9d101a3d8d440b190536c6f52abb9a616d708119c8d09ee105270334cf056210537373954eb4c67497e6e9d90c20bdee0eec4dbdc83f5b066f6a71c244fd6ad02e64d2d4c69c31176326aa5274e0e9e382d31c99dc34a6e8549ee1256726b93438977fe99afbbd7af8ce4b1a6b3ef32b21b4b57f50e5a42b631d113231f7623a597daa5a4fe9ae8dcbbd2e1b097e827d8e4dc6fea824a4fb4bbef68df43d0cc65a68eb1601a6184db9a3c9f63ef8925bbeefcdd70e76f6712ce9fd8cb4f98ee810b6e6ff20bf1b4a519f18b39ac94ede89c2b77aeaf142d277e7c9623b1dc79369737413c219912de3bd2fb476fdffe912bfca31ff08fb09a617ed201f3933e11f8c95698f0be1108ef6812ce0ba9ad596ae5ff6fe72745782b5c780ea6793f83e689809a77c24aa5fe86522911a454ea8c3119606072b049ed344cba60c2071a849f1c5078574c789e41f845018577338515116b0ec94858a9ebadc754b1b863a5a7b2af9ebb4e7455738d54b7f76c67bb4268c18f732dea7e5b923e300daae503ba33446498cc4c45544359c1c700b410c587396c0e1661d32e9db1c0dbdde4f0bc61c50720a474e971675d222b5bfcf96bc5a959ce13786af2e3fc4d554a9ec8c6f3440f539e10017b6d83e689c9ceef4da222c9ffde4ba6c05cf1ec647763186fe7231f7a1a0a1f510019fd2a5ff855910fbf8a427bcc637a6221b2c01022fb258285c85e5881576828f01a072cf07a9b8473971e66083c853cf0142573bafe9cc1f87372b13c556cca531d449e9ae9104fed209fe778778573e9465305364daeea63ca55a2a692c98e2bd8395fbf8eab125389202a45a95d547e9e2647d6b83fd948f81ec1cc7d607e1e80659abe984b8c34b9448e7089258ed32f717655f69d2ede92f0f729fc1c1f18e0aec61cc431b6c6f41885bba6abc74acf5b9afa6bd00fd360b449838e46123bc9e2b2fe5af4c7b41863d2a22dd0823fadca49f5fa3f7b00f6ecb1a667b706cf5e228afe2a394e40bc2d0bf0dc8158e01e6708dce31b050bdc7926e15c773eb8285417d7204cf27661256f8301d9de04a4713020834dc27949369e856f740ec1349f60d03c2f2b98e64331cd2746a079be4178816889ae4a09b851964cf364dd741f5137aa12611cca4cd6b279584f77352f976630beaafc26a147fa128ccfeff0d7d9c247e7e789f1b074ba62c553011692269bd40f10730a4d8279509fe247f0085cf03093609e03a61a7240aba6c172409149b83b32cf501f11bd1df57b65c66770346dc2dc9f7ce7273bb5a299e67552b1494f5ea1ddc1a0a7a8d0f2e1af8d84bb950977cb4fe36ea6466970870b52712e31d9c323cf0c43e4691430f20cc77c9c0fa54f2976cb842ba502c865fb394e7d80b3752b83958ea9fcef75ceef1aad70ce151de61b9d80bace69af0f1555050eacd23993accc7089c384c4152276ad11f771d92e5a7ebec8393fc6d9163bdb3e8132e008cc95679a5c84bbf2ac703e3912c3bcb309f3d24830d71f662edbdba9d9ba054aae56c7cd15630455f32b57debf9ea92fa1f0226743c0e4188585add986b0d5ae65b0b035da54b68aeed24cbe0c9ce05c55235e07046fefcdf15d5ace65e61781e99f8e957f634cc9d285b9d343ea2ca6e6e24932d69424a2933993a398f4081e2c51e6fb4e9405cc3c82a9aee763c932ce444ff4a2ef9c417a7ec6d89ac92df44d6e17412e27c5aab4c350116adb9a9c9953e373aa9a6bea949a4ad15d7087de0e0b608b0c01ecad80016c7b4cf3dd0c9a6707d47c3ca6f96283e617b50aa6f904acd4dbdd54ea3193ea694a8d8998ea4b0caaaf6c1d4cf54998f0a506e18fb50b26bcd4249cd7e8ca59f8b6e4644cf8b208844fc1842f8f40f85493705e98559822862eb814173ccd24987b56a51fc1695c703ae6252b0c5e7255fb605eb2834938bfbe8a219554be9464884aea8e18a655a6ecca1b08412ba9bc30b2b13d5086a1de0343bd3a1cea1918ea6a13ea6591a18e4f9b60272c6bad3164adfb3a06cb5a334dc279185b1b41189b85095f1781f09db118b93e648c9c8d79e49e2163e41c0c478d01877128501a1c73312fd9600ac039c1bc649e49386fff6cf483244dfb673e26785348c10b30d67b45e07a0b4dc2f9f57bfbd13a4d1d74172c11371b12717da76089b82b267c1f83f0519d83095f8409dfd7209c8fd10a227c374cf87e06e1cf0514be18f394fd23f094dd31e10744207c0926fcc008842f3509e73d1307f9f1f105b8e07293601e350f6686029f7717062df037cac2bbaa1eb5aa6045f332cc96434cb6f013b99ea70679d672ec59879a9e055f8c2f4f792f54ff97d31598168799b4800304d6c8ca4fb9605f7f0d2a310d0e3769d082c1d7e30b84676c0c586eafc0c2cf11a6d8d63d58f8a93209e799f8c80832f14a4cf3a30c9aef1650f35598e64747a0f91e98e6c71834bf2ba0e6ab31cd8f8d40f36acc3f8f33f9277f4fb948c6b2c54e6c5824e3d018d9e8708f2d14dba16c3be7f76410b3960b41d5ce5f7ce0cf7ae7d84a115f368b4ecc4a71b422604c5b83e97fbc497fde819dd4480de3cfadb5698cb467b1e1c58c1bb3f506d41a71c5063990ca6d8ab9f6b9df785f2726125404b269adc926ee2027d49ed05ab5e2dbb0d9ccfdc9777f82356cd7614e7692c1c99a0474b2f598f0930dc2b3020adf13137e8a4178d380c26b30f73ad5e45efd7c650fb75d5ee06c4be43137abecc786cb6b4738db200eb3017398d33087393db4c36cc49e7906f6cc33433f731396d467451009f73209e75548fea1933055c8bd3152e760a4c4e74cb320a9609c36639cce8d80d33e26e1bcac3b8fa59675b923829575fb629a9f1f81e6fb9984738c17f849e15c5cf0fe5894b8d01425780caa9643a283160d07607c2e8a80cf8198f08b0dc2830e583908739b4b0c6eb3796430b739d8249c8faabc94851c5579884932efb7bbcc8fcfa4e9b73b14837d790429791826fc8a08841f8ec1be322cec230c920bc49c1e5e07b66138a51afa16dd90caab4c7e647cab7e35e36fd5f9e0465a7db137f1479ad29db7dcaff19315d28c7e3c0a137c6d48c1476382af0b29f8182c0b5c1f360b1c8b49be21ace4e330c93786957c3c26f9a6b0924f3049e671ece608e2d88998dab78455fb2493641ec76ef5e37757e3824f3609e6e5e26d7e04a7a9319e8281be3d02d0a76238ee0889e33493609ebfef0c99bf4fc738df1592f31926c19cf3dd11703e13c3714f481c676182ef0d29f86c8cf37d21399f6312cc39df1f01e77f60381e0889e35c4cf08321059f87717e2824e7f331ce0f47c0f9020cc72321715c6812cc233fff0e76a8c87f11c6e3b108785c8cf1783c248f4b30c14f84147c2986e3c908705c86097f2a02e1979b84f386f9d37e90a469c15f81f9de33617def4a8cc7b311f0b80a7391e742bac8d598e0e7430abe06c3f1420438aec584bf1881f0eb30df7b29a4ef5d8f69fd72045adf80097f2502e13762c25f8d40f84d98f0d722107eb3417881582784bf34cc7c9f4614f3e0d2f768bceec74bcb7062b760eeff4648f7bf154be7372348e7db4cc27947e15b7eb44ed35178bbc981c4b2252b1ac481e81ce76d13296357d83b8c7785f119ef145a621d6077989298a7c4bb7e92f81d3c89ef3409e67502fe3da7507582bb30c9ef87957c3726f983b092efc1247f1856f2bd5800f8288200701fa6f6c761d5be1f53fb9308d47e0053fbd3b06a3f6892ccbb7d3ef3935dd274fb3c6412cc5bb39ffb119ca635fb3006fa9f11807e04c3f1af90381e3509e635e82ffc084e53837e0ce3fcef909c1fc7387f1901e727301cff0989e3494cf05721053f8571fe3a24e7a731ceff8d80f333188e6f42e2781613fc6d48c1cf619cbf0bc9f9798cf3f711707e01c3f143481c2f625aff1881d62f61c27f8a40f8cb26e1bce2ffb31f24695a08af9804f3c6da2f7e04a769d3bc8a69fc6b488d5fc304ff1652f0eb26c1bc5ef03f16b25ef00626f9f7b092dfc49cee8f089cee2d4ced3fc3aafd3626f9afb092dfc124ff1d56f2bb98dff1f9e061fcee3d4c7022a4e0f731168d1221597c80b95de34478b7fb1013de2402e11f614cb2c232f9d82499af3cd8d44f32a659cdfe1393605e8dcef623384d35fa539360de81d3cc8fe0341d389f61909b8785fc3926b94558c9ffc47261cb90b9f05f983bb78ac09dbf3009e7bed4da8fd6698aef7f6338da84c4f1a54930afdcb5f523384de5ee3f98c6ed426afc1526b87d48c15f63283a8444f15f4ce3ad426afc0de6cb1d23f0e56f31e1391108ff0e0b1c9dc2068eef4d9279dcef1c32eeff6012cce37e979071ff4793e04ee2c27071ff270c72b7b0907fc624770f2bf9172caff40899577ec5dcb96704eefc9b4938f7a55e21e3feff301cbd43e2f81d0b76b92183dd1f98c67d426afc2726b86f48c17f6128b60e89e26f4ce37e2135169f9937f972ff087c3981091f1081f04626e13c700c0c1b381a9b24f3b89f1732ee373109e6717f50c8b89f6512cce3fe3621e37e530cf2e0b090b331c943c24a6e6692ccb3c0d09079a539e6cef911b8730b9370ee4b0521e37e4b0c4761481cad4c8279b01b1632d8b5c6342e0aa9711b4c707148c16d3114252151b4c3341e1e52e3f658f61b1136fb75c0248f0c2b792b2cff8d8a20ff75c4488f0e493a07133c26a4e04e188eb111e0e88c091f1781f02e988b6c1bd645ba6245f776218bee6e58d1bd7dc8a2bb3b56748f0f5974f7c0fc6e4248bfeb8905bb8921835d2fcc2d2685758bde98caa52155cec5b2c9e408b2491f4cf8940884f7c5604f0d0b7b6b4ced6911a8ddcf249cbff79eee2725d3bcf7ee6f12ccd7c3dbc18fe034ebe10dc070ec18018e81582a96854dc53c4ced1911a83d08537ba7b06a6f83a93d3302b507633e322ba48f0cc178ec1c96c7508cc7ec0878e463c2e74420bc006332372c93424ced7911a83d0c133e3f02e14598f00511082fc6842f8c407809267c9708840fc75c65d7b0ae320293bc28ace491588572b79015ca5158857271c80ae56893603e647c773f82d30c191f83095e1252f058acdab73464b56f1c56b72e0f59b7de16f3b76561fd6d3b4cf2f2b092b73749e68b4d55f8819166b1a9f198ca9561559e80a5df8a846191a3e3c52eff22affa1e2ffc1a6ff29bcb2b9c5bdcb928d36baf4caed0c73f10c9cfae12476a58be5817738e385be148dc24669170b9c97b4a9d6d352b97ebee4d916b7656ca8f5cc29927f013a8de33ae7ec58e854bd25891fc2eb1f9abc4faf3e63b77ad0ab8e0d3448c7a9589fa0486cd8881f3615c8aebd87af1f56b3e3fa85acc08e277f133754bd02de33387d6313e7786af8e18c4be49987d2b4df655127bd54636ab76f1fb729162e5c243ca1ddbb975fe3d281dadfaf84129c6699589d3bc06cb7de90985e73019e3b08789032f8eccf93af9652dd7aae5c2929a141d6124c0ce246505b1640a66c96a9325a3344ba07f85b7c52c2d883553316baab13865d60cc6a632e6aec13c57aeba9ace1e7f76d63f4e4dc3ec5b63b26f1a1a875397e8aa5fea05971ec4dae998b56b4dd66e1bc037dd28eb3725a38ea23b6076adf393e7602c0b9fe7ccd28258b32366cd7a9335dbfbca73131ca215c2b356092f0a9fe7926782d85686d9b6a7c9b631b5e5dd1ca7feb763edcacef3841dd5d21e77c6f31251ebd9206fe71e942e1a461741666016d5982cda4e4b2def73618af148c06b29fbb09d185fb1ba1c4d3baf8ce82cdb09b36c83c9b2fe9a657a4eaa9211a24c44b02ac657098fc6a766627a6e34e9b9a3affc3255cc1e2f97f5295552cd74fe9eccf6740471710d596ecdc26cde64b2199f519fda7e50e9b456b6afd2c5b7201aef8c69bc9749e371014a5aafde552c75210cbc64352d9b11c4aad998557b9bac9a94a6e471ad98224a9b35c2f3ead72a49e6bba8526e0e66e366938dc3d194e32df865ce45cad632d1229b2cf43595b151d712e66276ec63b2a334449c68c8c8300fb3725f939585be5b5253ebace14511cbe763daef67d2be28400d35a8fef58d080b300bf6375930274064763d2e59feb8f7f8edd9c964efcf428cc1017e52315d7d3c682ad637e6ed825970a09f58911ad7f1b4f317e1d3f5b7d43f9d76c5ac3cc864e5445f11718e73f132a16db9f0aa866d6f2cc22c3cd84f8b379d27066bf146dd5fb61b66d72126bbc6fa8ef2c1acc253ab3e362dc66c3ab4fe7d4d75e5b84c96ccbb63f61de627a604290ff05a147d7b780966e5e17e5a63143562ff56d7b7b4588ad97c84c9e6850d6c33358d728cc691261a537c969dd3457dc5aef2731966e951264b27fb8a5833185fad8e979beafd1ddef393a952743966e7d17e5ab97a193349589a9a7ab0e5eae778b4a54f0566e3317e4a9f541b93ed42ae27bf8e7b177fefa66b3bd7f97bbd38eecfbafaf52a5762f61d8bf5bfa4b3cfad27246ff05fea449b6a2b30ab8e3359b52862cfc4f25fd0eba36552853139dec4645746f74ed96dad8579f71eb44d9eedfc4b245a32265ab91b45fff92cc190ef6d6005bd9c53a2d7c3b539bfd6967c8fddc9e3fcf96b9ce7f212626eadd67cedd1f4124e706037e55fd3e23f03133ca136ca8c6e58e17592905f2d6d73a3fd06b1ac6fa528f76a444990cfcae4972bd56aae7559614abf7c9082d0baba6d52ebbcf2b131cb451d859750cb1c6fcb961629590ee9de9cf49666e9893c555bc9546d5490cb6d1c5c4f6faa5b8b93f8d31a9b7da8730a5998734cbabb0276923dde89f68cc96a958b6dad88093cb37091d36577519d4fd557e4d59f3a540850655c9de2e681606812d755b89afb3ab386b90309f29c6c969dd5a890a7c6c994c87a30f81d671ddd3ce72915b2cc9fc6e0f7643738c6c4016449ff24c853ec04392c1620afeb9104792a2548f7dbe6339dcbe78b7a42a573297fafc23f420931c6015ad9c824b4d328a1b5f5781fef18d73f0a1d075c3fb64be23a9d12d756ce8e7abbaa170fab646b7c5fc647e5c601db75a0b03883125b3b8f974d622b85ddab1d7596cbeac98658002b199104762625b0a60298db52ae8949d5a3198073969d2566712c407e9b9b04793675f057d12cbe516c258862e750e26a29fc6eb268a46d128f8f53cb8037f415a67f50626aedc99eb363589d5898c551656769c2f5eef9fa37e083f1c5bb1a78069ecc368b216035425e85def5d0c7b9c43acdcf855d07796932569ecfa6799e8f589617a0f696578717e7f9a838e7856ada85b9bb38d4dd45cedd7afd23cf57152ecf771b2cd93769ee532ce47d93e7fd7fde6d58c8bb0dcfe710f8c444fee346ef0b28a3772f99ce6e2ff15a31b6d7efe8d3256c84ae4f8f147dbc1ff05271dca459734fa42ff5636c7da23d9f19ad0ac60b29d17631a0c55fbe2ee173efe970e650e1bc0fd4332eb20967512c717e0e705e6c13cee258e2ec0532fb2536e12c8925cef100e7a599c059850285eaf3d8495814b5a2c2b90bc8ec9751e2ec5487777a510ea743d98d0ae5bd00e5e5b6a02c8e25ca6120935f610bcaa258a26c0e505e49893247a21ce9fcafac1d9a325d34f42ad966716ebd68dcf11be2077215c8de5765a2b3192f78b0196729af67a3c3da8e0aeb0880f5ea4cbd77e45e58c5874b67c6271750c1db0bc0bb2653afd3566d31597a01c0776d431633501c6936cea642791d40791d25ca3612e530998d6b32e58573a9d0cd07e8aea744d751a25b2e7b2af5c1c1ca52520fdc850ae3f600e30d99f0c0c22dc603c700743736641cf40e5c2f8c6189bc3da86edf9489cc3ccc53dd56a733e49164c5c934e0913767c223b198e82d99093d920c657780f216eac10a2b3d6ff626886a76cae8db18b44a9a0168b73604b43836e5b201b4db32d142f6539d86ed63d21e9c1154587b8222e5761bb19276d792617d1278eb1d36bd97217d9140f65ee60d80f34e9b7016c512e7cf00e75d36e12c8e25ce412086de6dcb0b8561945523b24eb31b8067de630bcae258a2dc0678e5bdb6a02c8a25ca378157de67e7db99921856e9d702acf7dbd3433e3a86edf0ff00940f50a2e46345bc4d4a3e6ed2a54186ad0d15b62600db8394d83ad799b1bde37d087d906cb4cf7600e64336c11c154398a300cc876d8249d81a2783b90d80f9884d30094b6d32980301cc476d82393286308701988fd904338ec34d8700988fdb0493b0bf9d0c661700f3099b6012be262383d919c07cd226988483f4c960f604309fb2092661d70619ccae00e6d3998089bd0bd7bb8209b3395947702700f3994cf4ab17b2e4d731b8baa9337ff95535e28af8e1cc03389fa5c4d955e2ac762eaad606a1e2fdebf1ebc72c025dc2cfd9069430c39301bd1f78e8f39440f990116fb75bca0a4331e8f0cd02b85ea0c4a5667dbbb3fbd5768af443ef0a01de4924c4b192cc136702b42fda33a68db0b788ac2fbd3f40f95266fbd237604bf0c4a0b46e05b0bd9c89cc0d2be5fe9774206cf19452a1fd11a07d2513f54aff1d1b716c404e07385fb50927e9920e6438f701385fa3c4d9dd77c6f70ef52784fa0e15d431a0aafeba8d50093b3bc8a08e0650dfb0112a61a3920cea1d20fbbf692354c2862519d4db01d4b732d152f7b694cceba1c5b97db42f00fab63d638d085fb391b58fde0328df69c82e632f4ad291ed64302b01cc776d8249f8369d0c663580f99e4d3009c77990c15c0e60be6f13cc38f6295500981fd80493b01a4f06b31cc0fcd02698840d4d3298cb00cc8f6c8219c7e9d03b02981fdb04338eabbecc00303fb10926e1786232986b00cc4f6d8219c7d9163500e6679430d5b27723d896b9ecdd6a00f2734a90707d36253543f0c8d6241a07e0fd33135e387c0bf5c22a00f25f9420d5f43e352c86f755ee0d26506d5983638682def62f28b1aa6f5bf007af1060956cfecd0632705954e018f0c77f53826beeecf04f91f329a4c9d561c880e552016b0f807d49094cadce66f634c221592da8d03502e8fe9389d8e7a75fdcbbac0e611705d9fa2f7f01ac5fd98895b4e7870cebd500ebd70d39ca2dfe53523a0294ffb577b81621da522ab48700b4df64627c1196f953177f22ec07221b587837c0f9ad4d388b6289f32380f33b9b7016c7126707d0caf9de269c25b1c4b92dc0f9432670fa1fea1ac7c9fa3b81ccfea34d388b6289f32080f3a7861c45e4f54cc2b11a64bd438f03943fdb82b22896283b8398f94b261a9bc19727237c334e365bad0c78e8af99c00a67f3a6ff9e6f9c67f50e02587f6bc88cef7d1319c7b11b2f0394ffcbc44b5dfe3d00ef8cb52de72dd0ee00e6ef0dd9b7e4f5cb380ed0ea0b50fe9109bf84917372ed1b4af8622dbe23d7b70230ffa484a94fda5feee3bd641c577365a0baf4976d40098b2132a00300d0bf6d031ac737e71f802ccfdfd05905348e0b9f7c03802628819ae6a8f9691fc5f133366703a88d6c841ac746e779006a631ba112c65332a82703a84d6c841ac70f329d0ea066d90895703a2019d4a700d4a6364225ec1f2583fa1c809a6d23d4387ebce12100b5998d5009a70992417d0c406d6e2354c2a92f6450fb81e6690b4aa8c187e3104e7e21ebbf7f07f8684b9b7016c5126736f0ce5636e12c8e25cee100676b4a9c9debc0a9f7e2c77109807100661b9b60c6f1a5484700b3ad4d30e3f8e63307c06c6713cc38ce5a6f0360b6b709661c67adb703303b50c2acff841ac2363cd9cc8fb100eb563662251d854786f55996c4da91126b6f0356f32c90a9f2968cade1594605f7370037c766b884d52932b85f00b89d6c864b588891c17d05c0ed6c335cc2ea1619dc9b01dc2e36c3256cb292c16d01ea095d29e1869bd648d8395d4a85b63b40db8d122d5fcf21b9ce48a9b35de6b0a8729c661de5f2043da8c0b50119bebb4d5d7ca4739ac8baf81e00387bd88493b4938f0ce77700674f9b7016c712675f10257b51e2dc3a4401041bae84bdfc5753411e0920f78e0364c2f7a66490bb01c8b971804cd8d222837c1288be7de20099b0c54506f90800b96f1c2013f67691417e1040de3a0e90097bbdc8209f0a20f78b0364c2862e19e44f00e4fe71804c584f2683fc08803c200e90095fef90416e02aa7003e3009970cc3619e41f8027e751420eb628086150209ba775134039c81694a4fd1064280b41d6dfc61694a43d6464287f055e393813630f82afaf12c7b92e1b01d62199289cd42c577e31bf7d3de3af62e63b64263906548822496d273a37f2952ef672aee373626b685b6564ef1eba823030340e90095b6564901b03c8f971804cd8534606f97b102e0ae20099b0a78c0cf2c70072a12db506d2793264b586e701ca61b6a0249d234386b20f88af459940b99c999766cad8e0a30554289702af2ca644d941a2e45ee75d322c430b85955221dc19202c69c88c0dc5917a23d960f9cb01cae199f0c6d405ece2ee8d5301c21194083bd6111b95a5a49e48f631ad6d01c6910ddbc6870233f4e6956c7e411f8075142556f58db212b6657ea36c090039ba21ab40de42278e5f091f0e508ec9c474b7c2944267cbf1cbc900e6584a98cd9c9d55f28d52a97c7b14bfd1812d00ae7199189eae3a312a8daba262cdc4382e9a782840bbad8d3304495f7e9095e06d41db7b3b1bb192bee924c3fa04f0d6ed3331eadaff774e083b87c93ecc3111e01c6f134ed249ec643857029c136c9a13403acb9aacd47f0be09c68134ed2b500c870360245d2249b7016c712e71080b39412e74096dab4f4be4e730787ad117ff341639b84c8e48afe7305b50cf478e653c1ee0142c1645bde0a9196f96415feeb01ca29b6a024fd882119ca3c1002a6da8292b4ea4486f225e095d3ec1c2c16c795513700acd3ed79e94638af8facfff3df00e50e9428dbb264ff67a5a826adc9547f27d9fbf3b100de8e99c8deaa038f23abaa3dbda5bd08ee010aa0324aac7d0cd9dbfd32141fb4b596ed20ea9cebd3b6e9e3f8b9f7c6c06f67d8f3fe288eaba2f6032877b2a9af89749c1c9967ee0670ceb477c51ec271c9a554683f056867d9d9774fe8b1647df75f02ac3b67625043f1163aa861310039dbae484a98ddc922e92480738e4d384917ec26c3b907c03937131fe348beabe711d215b2a555f4df0550e76522762aa8abd2f67fc62f76de0a40ceb705641cc78d1c06402eb005641c3f03fb2d00b9d0169071fc40f18700e42eb68024ec342603d909f42aed6a0bc838ce804f00908b6c014938e79d0c643100b99b3daf31083337594df23510251737e4b7f2b0ce8d38766d5c0ca0ee6e2354c2176e64502f005097d80895b0b64906f5340075a98d50096b9e64508f0650cb6d844ad85227837a1480bacc46a8719c58782480badc46a871fc1ad4b9006a858d5009abfc6450ff01a056da0895b0f24f06f52c0075858d50e33827e94c00b52a138d53fcfd51dc3b953703942ba917b6f0ce2d9ee748ae708e708165cc7d6d5c1d4384ad01c2559408bb316f9f131ff3b1b7cccc5eafcc504d742e15d2c1a0f7690f7b068111769490f53e4d00deb9dac6a135a4a3e7c98aa0df01d66a1bb1924e9521c37a15c0bac6a61973a4036dc866ccdd0370aeb50927e9401b329c9f019ceb6cc2591c4b9c5d4029bfde269c25b1c4b91dc0b9a74da3ea48e7c2938daadb1564f61a5ba61a0e8be5cbe48701ca0db6a02c8e25ca1290c937da82b2289628b702283765627a217ff00a0152c95e2b2f895fb33201b2f45e76ce1e26ec8e239b3d5c04b0ee9d89f14bfe0a9df865ee5300c8cdb6808c6307f10900e43eb6808ce3a8e37300c87d6d0119c751c7670090fbd902328ea38e2f0220f7b705641c471d9f0f401e600b48c2363719c8cb00c8036d0119c7b6cda500e441b6808ce3175dae01200fb60524e1d862329057029087d833a180b00244d6f6be05a03c34131dbd85e2b7dabaca4c66ee3a496ad909b53a4dfc061b8c06380fb367b00161ab9bcc337301cac333f1c5027f997c582c973f6b09fa278fb009661c87c1b406308fb4092661ed920ce6df209b1f6513cc387ee5a519f0cca36d8219c725cffe009e798c4d30e33871f54f00f3589b60c6b1d2fe0b80799c4d3009fbd2c960fe0fc03cde2698715ce9e82b00f3049b60c6b105f45f00f3441bc705938ed5201b17dc1b54924eb2112b69459e0ceb33c05b4fb6774953c29a682915da2ce0b1a7d834b895b42e4a36b8f575e0a9a7da84b32896387f02384fb30967712c710e0499fd745b46659256edc9de13dd083cf30c5b5016c712653ef0ca336d4159144b94ff025e7916f53469f3a79833b486365985281f203cdbce11c384ddc7642386f70658cfb1259393be7023cbe44f0394ffb00565512c51e682a2e7dc4c0c9be1a8b6c42f0f4c013e791e25c896cece72a7c8e15171b5c3813f7e937329e1880e32681d00b4f333e17dc3b650ef2b05202fc804c8d15b28c85900e485f68c318ae3e0830100e545764d738ee3f7d6c6039c17db84b328963857009c9750e2e416f05ef20d324ef29ef452d96b1ebf0eb49600dba5b654bd4933345951732d4079992d288b6389726bd08ab9dc1694a471910ce58bc02bafb067f87f1c070cfe13a0bc92126547063f8bac2ae5c92ffb66a44a4e86b10060bc2a13efbe373aadeb55cea5d89befa9f206d83b493a67bc8c0a6d31407b75264614f96bed90464e323fdd1fc0bc26132b087b67fbcc16c2d689ecbfe5ccf99907a05e9ba94fcbbb5f46df90a9c849366aa810c0bb8ede2327d7163d7c6cd026e97bab05c689cea5bcbfd21539c5d9f235842b6258416a0ba05e6fe30837d217b764beda0a54e16fb0112be9280d32ac8f026fbd91fab5c45ece09de0dbc8ecd722ee2d8f8fb7032683da8a0b503d06eb2a9ab8df4752d5957db2280f3e64cb483bcef18b79476d06c80f1167bc700134e0628a5427b1b407bab4da32c497b36c93a89ef02386fb3092769c3920ce7fb00e7ed36e124ed2c26c3d91ed434efb00967492c718e0038efb4b3e21ec74f7cbe0032fd5d76d5410907fe93d541e7029c776762800cd6d30951c6719dad0301c87b6c0119c79197070090f7da02328e2b08f70220efb305641c5ffde60090f7db02328e93504a00c8076c0119c715840703900fda02328e2b08af03201fb205641c57109e03403e6c0bc838ae20bc2700f9882d20e3b882f07a00f2513ba7eb11163d64d3f57600581f6bc8c576f45e22c2b60e591fd11500e6e336c1246c8193c1bc13c07cc2269871ecbd3c18c07cd22698842d7132988703984fd904338e5f893c06c07cda2698842d723298c70298cfd80493b00d4406f33800f3599b60c67145a2e301cce76c8249d8162283792280f9bc4d30095be864302f04305fb06726501c57bb7e15a07c3113a3d8f93a074a6a86c6bded42056f2180f752267a8abcd3a8b8c25bc6da064301c8972941769320ab9d8b7866e68303f7963d42deac9da1cfc0924d4fe90f06bfbc9209df1cb585fae626e09baf52826c0f32f97a961ca59e2180b95400f703005fb367e192382e5abf3540f93a25ca9e4c9f703adfa131c951ba42c055db89cec57c8d413ebf824facaaa1ed1f229b57d11b807dc356b084c51019d86e00ec9bf664fe387ecc6b2440f91625cad6ce8e77e1d0e4fcc90d317c61d614807bdba661d5a4e37fc95adf6f039cefd88493749d4b329c4d4145fd5d9b7016c7126701c0f91e254ebec32fe673cfe287a939c8c4efdb383782744214d9dc88af01d60f6cc44a3a6d8f0ceb25026b7696267c4a8af0492282f118b65ce8efd605f3d954517da91448963bfb65a2f2bd912d75802c72fe054b8bc5ce3fd3f184e8e59ccc36b3f5e22897572164af71ce72cd36b0c23ece251f72d74848d7c84b33439d1b9d103d035cca5ae76933185f2ea5dcb9b65c6ce73aff97098b0bfa3a9725781ab84d8afcdac644be9c0ebb46eea9e375cbe456a697f61134454b9feac8d2a72e8b5c97e2f7af10cb79540aa9d3ebb4b46efbf0b46e9526550a784b7d8bb6ff639eee32d9859b76166e3ccf497957385f85aa46b8748db826ebff01dd2143ca0bad0200 serializedProgramBytesString: - serializedSignature: 4b8dceafbe7fe8057a685b747f5f1bde02199f0250a6e644f1e9d027639fcf1c8bec3711adde1b1234a6473f931f2004d4945adc371fd60735a0bc849fd5ea08 + serializedSignature: 94f82f68c4def6c513070fd3937e1accfcbadad786a8308fab87bc44e158c008605a7732847a298fd0dc0c837951484f810aa508d5eac71a1b310e593c0bf302 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset b/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset index ab34e15..03871da 100644 --- a/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset +++ b/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9c59571bc91580ab0149ac06bc203018b0b1416693309e89333399f18217c6c6306c59ec192cb30d1eb6419a64fc36734e9ef292bf919f90fc93fc89bce53527b9f776b555aabed5ad96544290918ebad5d5dd55f77eb7eeada54b6a480b783993b05917cbe29198166b624b1c8943f8f608f607f0768fbcf4257102fb5dd866e1dca4180eb9135f634e2f6ce7e12827f270e70f6213f67b747e456cc3f779b8771b8e3075073edb7095d30437ad8939b1285e8aa47325248b75ba2927d31cd4cb6986ed43f11ece6e935058489a4e2561b302677274ee0084f6ae7b25be26b50ee0dc26dc7322f621cfb794637353a3a02fc2dd25e4be59ee2fc0270e9f21e518b5b8079f187c5ecbf4b8dc77c2a745f98ee9c3f2b8419e6b96dfd5f2bc7bbae43dd795632cefef9a5cde7543da75ff94c7ad52be7f975076b7cceb86728cfb36b9bf28cf8f28c75096f3995b86f36799de28f797147dbc3c2e2b6997943435ff9b5afe7f0b90dd93b147de7b4b4b4fcaf451e518f7ed72df2bcf8f29c78e6488fb3e793ea594e3a5e3feaa3c7f5b1e77c87d4ceefbb5fbaf2ae9b8bfa2ddefc93da0c9ed31bd26d3c79563359f09edfa41edfa412dff498e6dcc210f7d063e9315c7224db051c252438977677810c1ace3b8c1d718159b07773d860c184f5ea3389117b3e20eebc97d4ebb22f723da66e18a3dca74ca5fc43f7c45a070fbf0de56c2500ed29f5214c340b40767a6c50bd8e35d6fc40c0496575a2eeb50ec3e84b26db10adb63caef0d88edbf324c250c59fa3dcb90a71b510f20c5037a0cc7fb24e10a6dff48926e93f4f39096a7f87e0811fe21ec7fa4d2fcba9fc077aecc55898c97910faca674377c7b669a036d50fa34d5d95f2c721a1641f4f129e9864d698a7e7ff159e217866e90c1e03e2ff39821644e51da1d91a6f8bfec23185d47bf867cfd76797f2cee06eac2934173f79306050bbfbb31fafa3ffffafeafb162d566459aba380321aa0581c5fc524e8f2f87601562b1a60c0aaae37738fcd4a559a9217ef7ba3dba2eba01a807a219c0c1aec42a1cbe25e1f26201be1fc2679784f4d92583992408adbfe10c13cf04b78183db5c6bb8e1d124086ef307bd0a70f1c5136c31100c93c144b09123483de0775609ae419adbed794c67f7a8adc456334bb92f82ccef649b8afa98aef7282ed020eb07922498370e39a634de3ceb36623d2d8455694d9669e22cd35afbc0e17ae57e482bc4b3c6eeee90bf6edfe7797718a343b00c268231866006095e60c5fae98b588b26164a64c83cce998786916fad9ac71bafac40c7f4398858c8ed882a199693a3ce105eb744797e47dda1c268c7bb37d8789d253b4a17196e54198155433a9359139c59318a763391f4bff0f299b5c56cd666ceac341affb926660d1bba7211c78fd81bbb2cc37e87a4c0f44de93fc16505578a8b1ff81418a76956e1b1287d006e5f0b9cbc6945778cf155f63255d9fa92d954e15bb83a8931ccd93d9536fa396cdf7f98d6ac6eeb8c1345d7b4fa951722a047d443969c0868a52b93d764955653184a326108e73ba384a136cee49db56efcf56e4db4c6bfb7e4f6a3cfd0f087956f324d3b47afebf41c665dea8092cf56d96170c6b6510fc8344d1be4129549348cdee86da0dbc45bb53fd4312b93c264fd0ece31d1fa030caa4c77912af42de6f3d47eb3a75ee0ea1ab592ab35f4543c7744b9e0203cbaafe23cfd84de23e6cd3a4866edf529172e82c9609d1c427afab2732aee6a6fec395472481c26cae301ce6363ccd9c5b90e56e6eb6cfdd0dd64d0ec26dd9c8de9c9da9b9af4abdd41c543103e27438f3b00d98794f794df032a411f86787704dbf546c9761d21bbde14fa50a97cc94cb6bc68b2e5cd4a6d7989cb19136f7118f48c87cd195f36653c5a61c6574c4dc25858932037919a841e5369291ba52539cf22854f6706ef2b28234b259ed01547b235a85e14bdcd604c13f4a0b9ba6ac8a5d9491a8b75f471113679580d814ccedf6baa821336aa609fa9b4491ba55d35953665a3b47e5369d3364a1be04a43674e73a5f5f84b3314396e2ef21a173f28a8ec9d4afc581527d483cc891daaf007558e1e19516a5b3d432e3c15e0c295cb6a72e041ae22a055ee70e2ebe69e319b7b88cb18a7546705f3906f4e08b6d3f152e0b4cc9f48a1efe4f4fcb4d880f73c9c5f8433eed2074ce17170d36978b56ab4e221854fcb8459cb61939677392d3f319a5895ced56f8e2ab65ba9df07e817a4d73adcbb0755208a46d74d1a7dc46974dfa8113e263c868b3c7d9e9225dd29b239900b2d67d6aa782aad7af6ba61d2ee634ebbcf23d7ca5d3ab3215ec0b94dca48ed60e3155c7ea6ae7814cd464c9afdcae46f2a517ffd3b020936c026df53ef615fda48b74471ed339fa996fd6e9ab4bcc769b912c1dfccfa96e277d17db37c06b74c0c7ecd31b867a8c3a63aa77aeb12489823bddc5ea39946f10c5b146d464dda7cc269f36905da2c837479ea098769c3f598a3e83466d2e9534ea7acb1967272a8b575811a77d40717a105d5562ea7d26c69c3e629139fcf383e6b463ec512944746d756f5517541800d0eb74d1c7ec3717855068707d07e6e95e1c1a75737c64d4c3e37c583d2fb7dc56d74ded7a936ebe3ef8047d169c2a4d3179c4e8f8c3af9a57035ca498d8ecb8cd7d5e8374e9a74bccfe9f8a46c1d4f2a8ae2d1344dc0db71f019e9631a8e9ec09d4b7487bbbe244dd31f990f6d52f8c37d2cfb006a24b6fc85458de18fec1f08f3ef03fc0f2fca5d2a1ea685bbf40fefdfa1df1378cb8f39ed4a5f00e25f169f901a797901699afa396f9a3e54adda90a609a789326b53b8141857e28d7c1d8abe54d6cde0a58cb20ece636cd0ed59b8241f9e7fd833f729cac05b3f5d859fc460a5729bc31332678e3824620d19e43e67134e82e0e0eab32d1991ce029e63c2938869993fa99a1396b774dc1f2e3a2940ff48cddf09e5b7a5870f9a5dad37c91fabee9ff2b9508aa9378516896f4932d8223df93f6f2c32d8583c4508435e6c251f7f66d3c747c8561b7072133e1be43f599ae57247d1a5f6c432ba6495fcc4a4a5284af497a2763991e28a1248e76d421e35427607f7d1ba8216518fdb423da0a0fed226ea710df5be614633ca6c8c55e423b690772bc89fdb443e2891bbc38b43c25eea20c92ada195b68af29685fd8449b9468778be0aa59aae25b85d9620b66ab0273c126ccfe92eb69f104f81d7b50876d41bdac407d598f5067ce20d44b0ad4c57a846ad1fdad41ed54a02ed984da21a162c13b84d4cb1b67d2ac818bd9022714705fd904d723c16dca3196fec8f4ec37410905e5b24d94030ccaf33bbe6a57b0aed4026b78bc3c0f587b14acaba7e9f8356b7cfa6ca16c5350aed944799da9a128441e88e0d8fe4bf92f3ae72db2362880d7eb23b2ea6bb42c62edb185b545c1fa5b9b58e3945be15f4caca16ab385aa5141f53b9ba8b07f5998d89b93d3ce38dd8193c8d6c075d802d7a480fbbd4d706d45e09e51877c577c6bb3b659831653a0fda116f12e7a97c7e27486b52e4f9f82f5557d34233a568b131ad6b07628585fdbc4da294c63ef4379893578095bf01c05ded736e1b56b6db0fab730d6b075d9c21657b07d63135b658f252cbab3b5c712830ada8dfa6c7cce6294ec55b0bea94fac77cf20d67e056bb61681200f7d4aec9447fbc995c5e1a1b5314fb382f6ad4db44325d7d8f3b39421a9c0ddb40937c9c035ff14c72acc415b302f2830b7ea09a6c586ca1acc2e05e6763dc1b438e4b406f3a20273a73e5bfdd933d8ea5f15e766756e0621e13fa6c59b64d548f9e64b5321d382a980d9af54e0c8cf5d52db2db9616e0b744d562ebacd2acb6bd3f4bf09f85be1284bf483f30c5ffbfa2da27178afd9af9abdabb19e97d3b492b5bded015649d31f4a9c67fdf17f31e2d2ec544d9354c9d744613df8225cbc4542e12bf63f860aecdfef680000 serializedProgramBytesString: - serializedSignature: da4c4083dd87264b3b72273072e66061d269d7447feea71812a6396ebdf6eb7d8a25c37c187b37bc9b87d89a4176ae1a53649b2a66d56ac1145d68129b60cc05 + serializedSignature: 39e1aef0a35aa55a2d17a7472113495587e6556d541018cacf94b187d668f8fad20ec603fbff9d0fd3c874c8553fc6cb348e268ce5d386ff94a3a9b0ad86380b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset b/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset index d43446b..c92765b 100644 --- a/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset +++ b/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c49531b4714ee01b401422c06818d139ccd726c23018e9d38b1133663d91828045c5c295b0681e5202062f1724aaa5239e457e447e490fc9fe496432ad71c92f7def4a0d64cf72c420d8878549ad1cc74bf7eef7b6bf70c34a5196cc635d8adb04536c986d9325b63db6c0b7e4dc2b1041ff3ccbabec0ca70dc807d1eee5d63431e3d71bb6cf4c33e0b67bb6c0f7aeeb3553816e97e8e15e07716fa16e00cafaec3b700ad8c16e8b4cca6d83c9b6349a3d783c40a75dae5d70c94cb88c27e82bd86bb05620a0749d3ad24ec72706797ee958069abdd63f6358955827babd0a7cc3681e633a218fd13f606c94487183fb6f263377cc3f0ed11ce518aeff879483862bb73fcbc991fdb6cf77bf9793b3fefe3f77ee6d7e3fcd8c18f09de2ec9cf9b388f51fe5be4d96b4cb7be9dbc7dd447db167e0cf36f7f803e911afa4403f4b130e8e27d06647d420659e27db08d3cdb6169227285f97719aba7b7b320e930ee70bb4cc3ee8159ee000189c52e933fecb131362ab5d801a35de07b92f679685124a2e79d43fce6180299db844f4170b75db83e43de8a0e57843bc36c168ed8eb291b01077a6ca3b202c36e82cb16d812ec7788de5360dbd9d24b24744d7b9f45a069468e125cb100dd81f34de23047fb03e2b440dc67e1da1ec5b12d886413707c45a339652fc36fd9984b1c32398ff200a2ba6e86294b4d53200d729f26db7cab9193d008421f3ecfddb0254d91e5278726de626806194c04594e63842033aaae8db234e5bd450782c165744a28b76f13ef9bec86ab2c726450dd1748828a86fff97be6f73bb7a6ff08558b36c6d298368c410fd1dc80457a29a3cf41c15d8450a825838cdae13764f0631a3572c708bfd9ae48ed822b204c99a95a0194a8a6a0013671682113e6c5424a9226bd985141d92483327adc507ac70e3728a3877255a0c44d8e604c81a0170f2a049b650852ed55d28ae0325c338b9c69ba5ba4cc38ccc6e97a0990d823ee51163f6dcd2cfb882610fbc48f3bea381db86e435d8e781b218e51533fcf2a2db5c8b444339acd13d2d23ef08cfce7e0bb0fbd5779e8f4eee15f47edbe7514271d655c75541f8e551a0ac93444f3b6a5638c4413147d37a94eddaa2116e124f5aa3d16c9214f10e4fd0ee1bc595041189641883660bc3861239f24ce77ea6ee09dbe0dbc8bd01ef665e0b573abd24c44a2990c6aa65b2640cc2600f2ae201c5511ee3922e1988c308e764e926dff85cd413ca626de2a33545ae7f95eaba1fa5dcc98a175bf029b07677bc1cc59a835ee3619007264cd6617e1b84e5ce0752b2aba8fe56ed6bd87f854304ed3fad734f3bf24a35f0a2ce89b32d6629cbb7bc9b87173300b8b6af7923b773f8d7ebab0518582369963617c1890cd08503a5ce398a7a9d596d385236a2f6b978d845e765e625e1934af0b87fa1c244487a4885abf26a0db7320704061709fd76df6f6a0333bcffd6a9ee32a9e2faa787e07beadc86ea0713a64110833b2f1e64423903907417aebb48c69d29b63b8f8ff923ce21bf093036e9f4bd0a60c6314b82f1d25e6bc8b204b6651b8c9bd6e886ce4ae0fafd32995cacf122a3fbb24f3334c564b30ea6b360b5457819f028c16c4db3a5509f33d49c28c1acc49dc256176a984795f25ccde9184e9968d8791eb0326ab6fed94136aca3d2a493e94493275685c3936c51e8233e5c1740a36d331973d86d913f8642958bee4cbc478459e606409005b8bce515d8907c1ef9c4aca8f6452deb5859cea714db9b621e098b2e449b388c086300976e7bd7e92f5aa24bb2c936c5a5910d8a7fcc39c47d4abc59d9d6b71912b88b42b70af18d003fa5472a66472ce1edaa915a4c410250b7fd9c39695c0b7487658005e0fa8b589095efd96864179cc6453a4a18bec8d8b05d422755225f51599d43f6a943a4777d780e23e498474550903db07e3c34fea71b3bda323ddaf42fa6319d2f75cfc48b62c6362b800ddf3d07e9e5ae6a058dbe66879d1b266c0f590744025e95599a4b76b8a184ba49b0dd25cd9236e049128021fc3c0c4374df6819177817ae0d92e4b53d6cff82881aceb387609720e462bb4b66714b5bccb1c7c7d45f5d47c9dd5eb016a6d855c562a9dff82d4f9b038c225b26801d254029d3549afa356c35cab4d692abbaed6684dde5ce0f43cdc2cb7a1e08f944c0273bc8e32503ff729fdae913a2a00e605d5788e6a5f1e70204604ac678d75787d044d6d1c785ea359d02e7cfe822b91505306b591d609194e42ad188d11779b6a5b338e238c8d00d68251012ba313ac84009638ad692cb87e10e01ad109977c42db0810fd2a4034aa13221ce00945a5291a5a5558370268bf08316b4c276871c10dad45c9c672c141b2af48c846fc5edd4a8bda5e13711641092a3b5fd18a7499e8add98b225a4d396d9cdf108b9a946f374bf92c21521e3698f2ccab291fc924a588a0951981bc92cfe08ce013f6ff2ed633a8c99b08420f07c18c4cb77446a63eb2b327d4c47c83de6d1698b18f7f94d7db6255512be247b85a22579b10e43fd509a5fda99336a812baa00a09507da613aa24b7ba0dbe26b045eb962249917dad7617d30566a700e66d9d608e495c58c7c29e46250ce9524287a084cf752a21ce958003af93355bb48bce0aaf7ec0857401c704e0be38c904d4f88120264079e7f4e4f2d106cce55d0294777542892916632736903f2cd0065e5c17782d02785fea04af5d00cf2a86ac6723da60ebd2055b5880edabe382cdfed8461b6c6dba606b16601bd709db251ef5c44ab24c250bbaea167bc0ff6ceeaca5952601e0099d00c705bbac2c0c34ae434704e026752711794db8c59b345e063604f0a6748217ac9819694028130294d33aa1ec101c585c956b5c178e0ad0ddd309dd3bdc0af7d8735adb09f6629cc6b492d4056dab00ed8c4e68ad3520d50a90fded348d606a5b50eb16c0bcaf13cc8b0e3bad5e0152bf7dae35760eea02362e009b3dadc06ab4586dc0b6b333f39c2f838f511ea07184b871a45ce758291fb3fe6a0af6c96dcaa3564e79a662f3415917471bff6ae6114d65f2d0264fc7ca43b334bd2f8d0f8c82bcf8e44ed3fb89d64304d4907b9bf3af824ff2299d4cd2a33cb16b77d14a9adef03ecbf2cf8a7a6f4ad39bde2375b03d6f8e1eb120fffaa8be0fed4e9f46cdffb2b6432d91cda35834d67ad5f48a346e3a793aadb97eb2cf555b737fadd61c9ca3799dd66c52332b151bed191fd2c9f56097b9d26a87ec41fc9f12051a1efff6d41b898b34c757531b87b30d92b548544bccda2221eb93a4974a96a1af194f700656666b440fb7d07f9c486247c8500000 serializedProgramBytesString: - serializedSignature: 27a9b87b9a3aaafdaf0f0d313dd8fdde9e04819fe78c1d2f296a126c86f92bd978e010c8e133815a7531bba2aea080e69124feab80cbca95ee96cf3d9e95e700 + serializedSignature: 29fbbb1d4f36e44d0eac0848764502da8d8b427e0b73135103615241aefeb32a544659daeb35e364f93c2fb2f9367e008da9fdfbf2c04e46f6aed60fdf328d07 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset b/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset index 8e8f13a..3fbf743 100644 --- a/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset +++ b/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec7d09dc55d317f6b9f7bdf7adb759838af0a659694622cd13699e489ae75173a642144208211421842484a8148a9029332173861232f69d7dce5af7eeb3ef7ecebdfbeecbfffb7ebfaf7e75ee3ec3b39eb5f6da6b8f679f6803c7fd13a9e7fed7d7e9e9b475ea3b7d9ce1ce2467a2fbabad7b9ce0fef5537cbebb33c53d8e72ff1fe25eabe714a67952fca915a9e4fedfd94d4d75a6b94f4e7786b9c731def55ece08f77767f7d9116e4a9c1de9fe1be1de1589b90ff571da39dd9cae4ec5488534107dbd87a6d2b988d02b52d4fdbf8d33dbbd3ac223258434f02e5574ffebe55e99ea5d9be092e6fb0638033db526b8d786b9cf4c71c6bb98433dc4a2b1cf1def87e31f46d3710c1d47b9ff0ae8771efd2e4abfe5fbc579a1dd5921f78e95ee65cc71eebfb8fbef00a5c7fbe9125b293dc14f47ca2b18c5248c89749c44c7c9743cc7fd97ef3efe6d06fcc3ae4df139ecea44e9a9749c4ec769f4ac7bcf4bf5e8dc0c3fdd7217a567faf6892ca6f42c3ace0618ee31bac4bf96578df4f84e4a8b63753abf474ac792cf39e7d2f91acaf335e85893ce7f2fa5c5f3b5e9f9f3e97cad24b7e8c974ed02e59a38779e744e1c6b13fe0f525adc7721a5eb28d7eb84d8b305dd738ca2f331c47937dd372778bf333789b57d299d3bc57f26af28a559a752922e2c7770509e5baafce310e5fc101f33de907835566cde988e7515fe75fde7626528dd24f85c42de45caf51f95eb17d3f99f94f397d0734de9fa5e292d8ef5933ae7f13343253bcca36bc749e7f8bef9d2351da70574bc145cbf9c8e9781eb57283a5d49f28ed770b94abaa6c3ba9a8e0bc1f56bd270592471717d29dece09c623d96675c3f33a9ffdee5ae5fe7a4ec257d5b8115f4fe9ebe8de6393f7c677d0b5eb956b8c29ae2d96ae49fa25aedfa0d8fa463a722cb92929ef797ee618c96fc4b3fba4b4cbb94817baef663a7f8264237ad6b945ba26db9dafdfaaf05aaaf147bef70e3a4e0658c85ff93afbeb6de0fa323ade0eae2f57b836a2630f89eb9d746c4c36e2fa6005716b90b473919574ed6ee51aff16d7ee4adedf8bebab13e9d84e927b0f1d8fa3e3bdc9e7ce2ca4732caf071def4bdef362773a77bf842d8e0f24efd9bc85cead228e0dc91e3f4b6957e7a254af380fd2f5fd946e46d7d752fa213a3e4cc7d574e47afd17455e23455e23c2dbedf32b2841f73f42c735747c14e086b509385e377382be4f3a14f4279994af0eebf4041d1f93f2661d1d1f4fdaf2e52a211c58df13157d4ff46517df48f73d4947f695a793f873588fa7fc678af5a6f47ae59967249e54b739cf4ae758d68624f63945fd638207c78993145b9d44b27f0ade97b8ff6449ce262758b6f8dee7e8de539c60fd760a1d5b2431f25a48720ba4dfe2d85c3ad79cecb800f06a29f1da0c785159c86badf06a4dc75692bc56211cd886cfd3f1053abee8047d96dbb8dc6e7e898edb92f972f45b213ec5fef0b27f6f01b7d5b87e2b2ee91cf67c313a6e4f737f1846713abe628151c2b75f893d21f78e95ee6539affafa3b5c478fa2fc6823e54d1bba1623dbffaa9c8fd3f9df94f3f9e07c1170be68f03cd7c5796d252e6d83cfe4b5a3670e48699767a9af158cf674dfef1267198fafffa13cd781ceff29e9243fd7013cd75179ae88f25c47f05c27e5b9a2ca739d82cff179ee037a6971fd2f5fc7925c87bce6a74b73bf32dbbee1eb24e75427d8d63b958e9de9fcdf52dacd8fd2b3483ed7b96fd0f5d3149cd3d2e06c0fe1f89613ec4b733b916ddb45f1952e3e6699f2fe7365b8fd16a3eba7d3fdff04f1bcf332dec120de216c2baeb746f8f709d7f1cebfadf01aa1f8025f9f2cc995af731e502ccc8f4869711c0fe4ed0c5e4f91c731f60de5fa3bc1fbf2a6107e544987c5a9928ace5de9999894767f97e5f603b2ddbb696cc7d773653bc643b6e3ebc876ef05efcbca76aceb542719b7638a4ff6209cb8742f9f17c7414ed0f707f918e5d9e7e30a5e37c2cb97d232ee34e5fa343a4e9738b2ad6724cfe54d97ce89e348c22922a5052fb67fbec2ab9722b797c28bfda5a89496e30dcb2b50e455c7f667ec448c9dea04626c596ecfbe6f664be7c3545b391f49e73ea1e3c7d239cedfeed239d907a8edd39cc63b9c0fe85a4f290fba2bbed153f1d95d66b60fe8f186468f4f357a30466f8d1e7d42f4e82be9d15bba9fafc97a7c46c7220a7e3f458f7e1a3d3ecf500ff6dbfe1a3dce08d1e34c498ffed2fd7c4dd683c7fa8a2af803143d0658e8c1e5e52c8d1e0343f4385bd2e32ce97ebe26ebf1a6138c457ba4b45b062b6e57ee1bec04ea5f2f2d9743c63918c4a9c4630c6abe0f09da2be5fa50c59e43e9384ce1314ce1319c9ee3be00f157eba8444c1a223d275f2f1e7c9e6355c24e14ab2aed57ee1ba5f0a3367ca2ce629c83419ccadcf755fd6ab46227f5fa18c54e3477923756e1c1fd0db6d3386027bece756f5189073f275f673ba975e0042758074e50f0273ac9b8ad7b9eaee7f3b8c917e0be498a1c651e266fb2a227b743bf74926585db275f3989b27518b7d5b36d9b7f43d8b314bfa1b997bc994eb04d4d63ad8753fbf7701ee3a2be75de6c0567761a9c308edf39c1b6b9da3f3bd709b64fce25ccd5c48defe7f6e279415f63bcbcf314bc8341bc23382fb97d79ad136cefed5178d1f5440ce3eb9325b9f275ce83eb9c60fb92c7b1af07f27606afa7c8e3f6e5b7caf5ef83f7e52d7682ed4b4e9bb4cdcf77826df3f37ddb1dd92a8ded7e48633bbe9e2bdb311eb21d5f47b6fb31785f56b6e37130f6cf7d4eb2fe247d9c9fa5733c6eb5df4994fb16dc87e031b30b92f7e7d1bca34363b4791712a792525ae40db711741c69bc26d12ee5b232c709c6719e4b3ca091ffbba403b74bff90ce712c9c2b9d63391725753d89fa090e8ffd5c2cc99a2bddcfd7e4fc52c66012f897287a5c92a11e9f6af4608c791a3d2e0dd1e33249d63ce97ebe26ebc1f54f11057fbea2c77c0b3db85dba40a3c7e5217a5c21c95a20ddcfd7643d28fe27da078c7fa5a2c795167a705b60a1468fab42f4b85a92b550ba9fafc97ac414dc6b9c60fdce73a55cbfd3dc68a27e579fe7ebdc8e50ea28e760aa1dc4e9c4b835f727b36d07109f488464d05c677e2929edde53ad5208d6363a722cbfd109d6cf371246779f73b50541d9793739c1fa799b745ec63b18c4abce73655cc72c7502313f1295cecbb8346f9a5f5a49b33eacfb1292bb4f4a0bb9a383f745d8867974ff8fcaf578504ecaf57c3acff54326f52e714bc476e646f54384e305e9ecad8d229fa9398f8ea3156cf6d99b15ec9b7dec1ad49f8b1428d8c592d80d4a006cae776f51b06f21ec4584555cc12e91c43e66ab828df2bd645036ccff324a5acd7f9eebde27a56392fcff32ff415e79694d3f25c2b190e6e3393e25fce70e271957ee90ee15c7654eb0fc2ef3718fa1d8c8f57742c69d4e3086dfa9e0dea55cbf8b8ecb250ecbe9b842b1f90a5f76ad85bedc5adc76e1bcbf47c9fb52d27999e37d4eb0cc733a8f7c6bb892f7772b3cee261b509c8e940eda33910f7fa4e1c7cf4d0e5ee7e712d7774afca5eb797728cfdf1bccffc4f32f2ad715fc08fbfeed0a3ee7c34a27d8ae5ea9d84dd1277248f07ac20ef94a3edcaff8c2fd8aaf3c40d78b2af86583d713fa940bde97b7ca09b4cb8dcbe82a705d2da3aa5e0f2a7a3da8e8f55050af849d1f0ae2a6e4ef1d52fe8ad8c7ed7f100712ed8c5cc410f2f5bc871d7d0c59ed24cbef6ae95e717cc409c690477cdcfa3cbe1157643caad8ef510577ad729dd68ce4ad9138d09a95bcc79c60d97dcc975d77872fb71ecfdf73197d42f1e952d27999e3534e3086709a62487d9eafe4e71f57783c4e36a031f5c4badd743144e5c7cf4d0e5e4f9409bebe53e22f97f1d5caf3eb82f99f78fe45e5ba829f88210f2bf89c0f4f3ac118f2a46237459f440c794ab143bea487b8feb4e20b4f2bbeb2de09c610c62f1bbc9e1243e8bebc671cbb18f20cb88e6208ebf5aca2d7b38a5e1b827a25ecbc21889b92bfaba5fc7539d6e5f553ff450c21acbc8d8e3e866c7292e5779374af383ee70463c8733e6e13f6cfb822638b62bf2d0aeef3ca755a3794b759e2b0998e2f38c1b2fb822fbb218d7f361cef04cbe856c5a74b49e7658e2f3bc118c2698a218d790c8f9f7f51e1f1a2cfa331cd5b78ef49641243547efcdce4e0f54499e0eb3b25fe7219dfa43cbf2d98ff89e75f54ae2bf88918b251c1e77c78c909c6909714bb29fa2462c8cb8a1df2253dc4f5ed8a2f6c577ce51527184318bf6cf07a4a0ca1fbf25e75ec62c8abe03a8a21acd76b8a5eaf297aed08ea95b0f38e206e4afe6e92f257f4f3064bfe966d0c51c71e5ea7674b496951de1763acc8a141ffcfe3351507a4b4c0d8eef36e1a0bcace7b93eeff278897f7a682773088d794df51e1f2f596e28f51e9bc8cfbb6132cff9cce64cc1dc55ad67da793b2e62321f71d27107ff3764ae7c5f15dc56eeffa1827f2bb477105ef7dc5cfde57703f50aef31cf07b4ecab86302f323e5998f14cc0f83be9bf09bb79298de3d92ddf33ea6670e91d2ae5ec7ed0fdecf73dfe8fee3ab4bfca5e7bc37cbe4729aafe8f489a2d3278a4e6f077562fc088db7e5ed52fcb3321d99dfa7415ff0d2fc9c387ea6f8ef67be3e27b40ade97189ff99cf89495d2e2b89b707e53f8ed0ef2cc2f173cefdd57107c8675f074956368e5a09f7b69b94e519fffd0f2f94f2c9f7fdbf2f99d66cf27e4fd147e3fc75e248f7dd1f8f9b72d9fffc4f2f90f2d9f7f2ff83c97c1441dc7f941755c538aed56751cc7e62f93e5c0e118f515c9db23a5ddb2d9fc27e5be2f9d400cf0d2326f9e1be5fae063e9bc387e417ccb2bb85f04f1bdb22be647ca04711272141c7edef948c1a9a05cff40d2dd74ad3aafc1663b7ee304eba96f7c9b9db48ab8f3f8205fe779dc7f827879df2a78078378275709e2787345613ab0bc3d4a9eeef1f15a4c53eefb41c95365be3bef7bc5c7fe90ce8be3774a9e32cf25d27529ede92dee3fd409da81f17e54ecfa23f11e1fbc3fc1efa7a0cf314e0277afc2ff80f49ccc4fbdff503f1f5b709b4f5df3aee89dc049973f613ec6f3e5f27c3ccb93e7e3b9edc87db1fd4eb04df5b3745e1c7f516cfa8b8fd192e723e20ade6f4e303efda6e01e50ae33ae3c2fcaf74af3a279bf4be7c4f157c22922a505af4e8491aff0fa5391fba7c2eb2f27d886e138b45f9157a0c89ba6e0b0fde3491bf1b584dffd2cf95ddc7f5d39f1acb86faf851fd0bbdfde7ba55962440e93b0c230f8fec3c90f9a65c08fd6c845aa58e89809fe91ff127e4fc22fb4b0efd174a4f678a42ae5ffdfbe5fe45794d2e27a3527e153db69fd7aa4869feecc6df89a8ee78fade9fde53631cc23522b2837522789df8f6246a4b6740fb77d8f093ea77b3735c2ef44efc7f213b63ccbe7dc86df2be5bcabe784db76b0ff5cdb6594e675ddff90ecbfa5b4b82fe6736ccbfddd7ac1639eb43e21c2ef4fff14bc2742ef89c728b6f0fb7e5e3ae28755c6f07eb3fc02e97706bac5a284ff9d9416471e6bd923a5856ebb7cdddaf19a94750672c491de65cbaf24a55ddc76cd08b73bb8bfb29416c798a47f8c30ce270cae077b48d7a57c8ac532e31c5aa6e8ddd508bd93ad2d338d1d6d99695fdd3fdf3e2c7e7520bd2936469ad091dea38d344dca9b94c97b9861ba9c40c76621ba9ce8a7372cc9008fde818d9c1c82d7426f9b0eadfcf31d7a6339117a1737d29c8e2d93f85bd607af719b24466380f9874b69575e47f6637adf3146ef4ee6735b96daf59156c1eb89b10bbededa09f633dbf87c7af3f5b64ec6712ad29e8e1d42ec476b8963bc4645e6d251ba47c7b553906b28177aef30725a0897cec4a540c345be47c7e574032ef45e4fa47b08971e7abfeab4c43fdf69159613e94ad7da25f588f494ce89a3667f82482f83bc25bf8ef4c13af0f8688ce70f7e96d2ae2e9d37d27df47e504c7a97dafb2dee5946f750dd9e2807c57d4c5e4b94b89f30237d7d2e4be766a00bbdd713e91f921f67f8e936b40ec68bb9aebc536bfbe74fa5bc4cd423359df098ccb6e1f9d99fa5b4c09d4bb834af1ce371dfefa434e3083b1c41e9b119ca0f8bb1ecd3675a60d0186564803d8f5829d27d9f94766d741a8fafd37b4491b3e939dd3e49ba7232888ef43e526470f2b9cf78de78081d8786f8c630e255da49891b89bd57783da1123778ef15ef59dd755a2f19190eae2fa3eb23c0f5e54e309e8f24796542b84e4ec3b54c1aaea3c075e63a3a43ae6348de21215c7702acf9d2b3615cc782ebcc755c865c69ac24563684eb8b006bbef46c18d70969b84e04d755aed49f8e95c35c2393d2702d9786eb39e03a739d921957b52d80f23ba52d406dc058f9541d2353a57b7458d3147b897791e53610bd93ec50db2c56c109b4b5623c5fac6bcfcd54f4e5187768926764b6a3b701ed5b17abe404fb52dc07a1f9a8fc23a5b4786e5692c7e690f797d5d81de339887d52da8dbb3d38eed11aec08afd1cf34eed23e77117a072b3227f9dc67dcde994bc78be8a86b5f30cfc3149e87f93c7b72fd7e319d3f5cf2057a16c611be3e5f7a56779dfdfd12707d195d9f07aeabfe1e962fc348afa5be1d7aee226c7a7f247219ce8708e91161be9793af1c95815c1ebb91def9c8b82ee776e75dc96723574ad70a14597769aed1b908af41ae4adc0be9fc554eb07cf29e76dcc7db96b407eff513a17735780d8af17e403d839c6255829cbcb49b577d798c9eda8531797c8dc68562473941ff3dca7fb6f74fc1fb12f7174a189b14ff51f67f8a1ded0463058da1c5aa2631bcdf2cb740fa2d8e4748e78ef079f55900785593786d06bca8af11aba1f0a2f1d75875495ef5100edcff199b6ad718c73fa90d1ca3fe531fe6c3f9b748ba2ee75f4d907ff2f86b1989939c7fc4b1dff9415fe8d74e4aebec2de4ed0f62276448799eb67e40795ecb09d60f349ec9f3ffec87893e1571ea77b22287f767046da7c87512bf78d20e29cfafcbe0f974e590f3a5b6935aae784fd47d52dad5a77fa7e07d89fbeb3a99972b1eefdc2ba5c5511a8b8bd593e41648bfc5b18e74ae0ef1da0578497b91a62d570d155e34be1793f6488c35c01ccee0f16f2e57925dbdf16eb9ccd0be82f955a5b4c0e8223d2bdd9718b7e4fb784e7d8584afca92f3d5b4ff48e30a91ebb3c0e03d4bee4d3e9bd8a3b89784375aba4fe8c6fbdbfe2da55d5dcfe4fd9fcf96ce1728f7707b4abc77e7969b71eb82d8b2dc88ba0fa969fdc53c9a483c9af83c0670cce376d6a9d275694e33c663b9373959e75184e74d682f545d3b2fc67bf4f27c6f6fe9bc38d2bea5bc76d04bbb7a9cddca09f872602f5a1e7fa17d71f32946aafb0af375d37d8563dcb7d82ba5c551daebd5fbedf23c6bbcafef59f382faa58cedf07821ed0d1ba37d2ef3ab4969a137ad298fd1be92f9d5a5b43836a7f335a4b4841f3b99aed794d22eeec0c5cafdbc3f11eda793cff363b7d271a9745d3c477b51f23c5d8cc6bfb5edd5dbfcf4fc65213e24db49e0b520fcda525ab24784de718bdc112277999376dc30b29c8e7786e0dc95017f2e031cffee76701968e9e8cb404b3ab6728265a095affbe0ad743fc7125d1968ed04c7205bd3b33cef573f788c497b3e46ee71b4e520c2f190c7eef74a6971a47984445ba4ad138867b1f6743d26a5359c222ba5e734e534721fe047ef9ec53a29fca86d10eb98d43146630fb10ed2399ad388f17cc01e292d7876d7df975f47b96f56f0be9432afb60365dbf3fb703c4ec16d62ae13747b5387f921bdb7167908fb61621c9edb8cb4bf63a2cd78aaafd79056fe7343062bcf4d4ef3dc3ccc33c2fb1df3bc92e1dc6164351d1fc1fa45d638da7997a165fcf34343c64f228ffaf72c5c9a01177a872df25888adb99fc07b5ffe2da505a715c489d701a87943cf25e60af9b9af4374785cafff30d27f58d8f85157e928f17568cfc6e1bc0e4ef5e92e4ed2a7f97d36b56fc3ed7cda232f515ea90e8af13e91c74869713c3d891debee04eb432ea3bc27620d29cdcf0a0ebc2f5f2d292d8e72bd2caed7559e93f6a04bd1591adf883c29e9ecda78f8b20cecf494132cfb4f07f320b23ee94fcf536c8af0bb6999ccefd1fb67910dd83f231be919b617cf1ffe2da5c57d9b92cf8e189f816cea63453687c8dee2a71f6c45697a9f2bd65be1d0dbf7bd113b483eb55d232f68fc3ce4f99121fb8e7bfab11d387f5e7402b6d1ed191fd96a901fdbe8f852884d5ed6e824b8d3fb2f237785c851c7b3fa38c1be5d1f1f6b14af85e03df8b8ed5235c9a7f53cff387abc82fd0a61f555b0fbfad8a379cdf6ab74a4f79712fd42dd3a2bc6eca760f623beecfb3b88cbdd217c39d6bcaec8cf44b745e13cf8fec81b6978a4f3037a3729c2e3983a3fe07d7ab9cfd15ff1699ee7de997c766b6106b2f9fd94f743647fa0f7c131ddfdf3638687c8e940b6e3b5428c41ef2945a4bd2923bcd7c9c7490e936b67a0039581c8a7213a7ca6d7612cbdff3936444ee4733af2de579aef4944f87d9a4ccafd1774fc12f34dc45fde47947f0bce54d747bed2e8c4f7c9be41cf8d2b11c24d1d17e07d480f486981b134789f23d75f5f2b36385b7946adfba475046add176abf6fe8f86d487ed39e8319b5db389e7c1f921fdcaf3acb09f6ab68dde6781e83e1718974eb2c5836f56d223f61d991bd7adf1d4ff5dff8dd584e84df4390fa39917dfe735b43da8c097e9497115a531f61bd073ac17eff40cc3fa50d4b7bc326dab0e4271342d63f3934de3e81da0813dec5f7467ed5dbcbfb9a9d7b7e62d83ef8aa8f0e96ecf69be2a35cb77019a13d6413ed585a5f121be204dbb143e83828891de3752b6cdf614ea07d1aa3f528fc5d9818ad1d498ce70cf7759cc46b3f7ff775bd91c71fffa0ebac9f4677e6c032223f2b1c683d4aa2ad3d828e239d605b7b645017d4d64ec853dada913f7dee4ff2ba2b7a1f21a3d8caebc4796f2b69dd318fb145788db3a85f16a5c714cb7dbde7e8bd28f93b31117ea7ead9543929df894927274276a1b536893af39f54b9b1511ab907b3941b95f0c531e4db39e7b423dcfe1837cac7581037466b84f2eb4969715db7c680e3ed1827186fc7d091e7a9fe96d2aebc2924331a77f475237a2eac9dc1fc790f639a17e275b94eeb641e78bfc5bde3e9de2a525a5ce7b130deafb8a49476794c1f4cfcf32599225d3469a3b91be91cbdef139b24f9c5241f672ae78f1acfa43dfaa3058e369e45e91daf18eff5bb574a8ba3f42d82d8d4100ed4f68df21e70ad933a4c2b0af8cd96f89500fcd866e72afc78ae749ac4659acf85e5454b85e419ef015d454acb793643c9b319c13c4bd1e53c035b9fafe8c2f3ccb39218de6fa1cb87d8ae908bb4af6c5abbce51b8d0deb0b10b252e172afeaab36bdb0cedca7b6a1f2ea505f68e208e8c1d2d2d5de37365a4fb04ce64452e8d536ad74e71ec6b2ff1a7f112471a374eb48fa748b618e3f39dc163613c1e7a4e52ce0c5e5fb153b9c6587c8e6508fbff1594e99c26f1e0b1ffd335e7ba6ace49edd1e8213ea73378bcf27a9fffcc42fffccca68a5ca98d1fa57d04bc3a5cadefba4bf7f15a42aab3a3d4e64ac4335e1be7cabb98627d94f79891c6d8a215fd7bb6cda5742527d87655db96fc6d929252dad56d96b2fe581b0f796d9c5a2ea81e86f150fac6496c8624578e41bab829782d235955f03de7c600772956a66d9ba2587991136c9b5e44c7b9920f85c4b5b463bb28ae5da2c8e53956694fe818adf18b725c9845cfd497d2ae6d66ff05784a312f30afe2facfb98315ff99acc828199491b83f2c0f94b99b288f2f86ccdd4479bc99c664a34726ef991ff29e51a2ed466bbaa285c441d7ffe23ea9fc7d0f5d5ca8ea2463a0c0d2cdc5acd36085f1a339f868357b7e0ecfbbcd53ce496de56875e99e5ce940fd9a68cd101db8bd7aa9136caf5eeafbcff9dc16aae53f77feb20ce4529b345a2747b693ec94588744fb8e27d653cdf7f95eb024785fe2fe0512e6262758f6d5f554bc67f85e292d8e972731bcdf2cb740fa2d8e9749e72ef3795dd810f0ba52e2b519f0e2f5545729bc686ff0d84249de42cc610e8dc1468f015ca4fdc7a375f55ca2dc075aa470e131e76b247d54fc6b257cf51d5dc6e71879bd824fdf4d8e5d27e9c5eb66a5b1d8187d77413b166b587e1c9ac78ad1371512f3ea8bc99ef4fedb9c8d0afe5369f01997f738a77e19ef231593d63079f7f03971a43dc8790f8318ed413eb7bacf656ebbe073bc9f147cee7c43ee6333bc2f2c3e709f86d7fed17a897c392db81df075baa892f25cc3f0e72eea1ed4c9eb6f86704de0d27bc7b19b155cda77fca29559e2d277e5a3b4462dc67b8f3794d22efec5dcb71c6b88df54c1bf55c1bf95f0479be167aa67685e1faae4f56d8a6d6fa323ed9d9e18df58ea73bea49e82c33addaee0dc9e0687e67ab8cdefb5d9c36ccbf2e85bdc31daff38bf919416cfd2f8726c99136c7f2d23b96f2978c76788b75cc15beee3cdabaee09d9021de9d0ade9d84374dc16b9621de5d0ade5d84b73d3b3bc756105e6385cf8941f9b17be8be26525a60733bf86e27d807e5f827ad9d8dd13c716c25ddfb8ff42c9f17c7fbe8fa0129edea78596d05879fe3bdb59b4a6971e4bdc48f93d22ecea5622ec08d6f97eef28f09dc7b95e769eff4c4f8e3dd213a0bbc560a0eef757ebc9416cf2f51f8950cf2bb8ce7b733cccb04de2ac9d6f74ae7c491f7273f414a0b59bb7deef34b98c98cc97d70811bb6ff43489c8af1dee2274ae908f56bc47df4dd3e1eeb0f1dcbbf457a466ddb4adf1e4cf45722247335c92825a563fe6b5dc2360b9a059f8bd1dee6dc7e883da2f83ce3152878bcfe5ba7833a2eb146f18d3584b19838ad559e9b9ce639a5bf9de88f3e9ab44b4a7fb479105bbb96906db23689133dc9bfa7e52eba87c73d9e90fcf3099fd7e5dc0ee27d1e22d275a14773292d8e8f4b18b49ffae534ee17a37749127d968ed279be5fc67c9c8e8f4998b457fc15ed140cdecbfc58292d8ebc97f949525af605da8b9ef7134de0af52f065fbd1fa9a680be99a38f2bee615a5b4c0d0cc87f0334e27c9ef796d1aed9f9e68573fed735ad834785ff414094bdcffa3729dd723ffa49c6f45cfd17ee689be048d8fc6e479a9679c14fd13fa6e50786ef0795ec97ec5bec7763956797ea3727ebd745ec24fe4cd86a01da2ade9d846c1dda4e4c3a60cf2a1b3940f3c4ed8d6d1db97aff3bae90cd63844c916d10e980bcf895fd5292827110b9e4b724c3b4eb745c95bee2b535f3a314eb7999eef93c48ef27bdc616b94556ecf3b304e25e2be340e9c715dc0f5e30b4e701ce605df5657f757f0ba69f0d28da9f33a761e73e2f5e619cc4f473bd391f7aed18de90c25aeabfdf3d7f07a05d5865bb10da3a765902799ac7f9065a4f3a197141fa2758db16d8a0f6da3e38b4e4a194ac8dd2ec94d37b6fdaa2297d61ac65e51e4f2bac29725df259b474f97ae8923efbb5e4f4a8bfb780df20e92f98394669dc4f175e579fec6b72ea6b04cde73fc64292d8ebca7f9df52daf58f450794e7793fdf16521a3d2f8e6f24ed10a37dd0af3d398899586f42fba627c6de79cda3f4ee6c94d775900da2d27c50e29cb49e96654479ddb458474b7d81c4f88854b6a3bcf698dfb3df967c2ef17e1c977f7ef7ff6729edea77dd60ba4f5defc6fba99794d2e27e348ffeaee49ff2da3597cb75721c11182b2c30d80efda4b212165f68ce201ab6875358dce43dbc7f96d2ae0e8bb9aee57de2ab4b6971e4fde16b48698ee11c67c5755e034475d7f56ba5ebe2a85b7fef72bf7e2be9a39b6b6419bcffb36e9e85bff3ce6b8a346be913b64e13ffa3bcf696e33de9b298f399df8dfbd049896fd133a47b746d045e77c9717c80935c0be51e6f582d711432688ffd44d9fe88b8eca1fb1d893f5f2f08de7b83f22e77c23fa56fc407de67007e193d2b282bc5c612ffe8c00cf2ec6c49f7347eaff3e928ad2f8b0e76d29705398e0da173217567c20fe576d050ff9e4cf6274bbce3fe89e4235c4f7d4ab6de27a5dd7cbaa95ef0bec4fd9f49189b947c52e764789df25e292d8e9f4b7ef1b924b740fa2d8ebba473bb88d716c0eb0b8957ba3999af145e5fd1f14b49de9798c3addca755c702684d72a28ff8b57fff92eac1fb63df38c9be859b874b788ce073e93a9a8ff94ef28174f33ddf2b7ad29ae3d81e49a73d8a0e3f283afce0eb707327c0e747033e7b153e7cfc49e243cfc6be0ddae8662eef9f4bd7f9996fa473e2b8cf098ca124b8fe223d4363a2515aeb1afb55e146dfb28eed979ed94fb6f89038fd24c9d3dd2b8ef21ee0aaed0e48b61b0e6cc7eb5eff50f8d17edc3169ffee18edd51d93f633f77ebb9c6f592af101f724fcfa4c3affa774cf9f8443e39fb77671f43afd25e93412e844eb4963bc6ff05e292d8e7f4b72ffc65c127c79af0929be79bfc53d3ccea19ba7e6bd0ee5ef40ebe2a8fa6e1397f34229edca5aca632fdc3e1a43cf334fded3ec5b43f9eb32bc2fac0ee036d74127d8e63ae873bf4db1a53cdf1a1debe7b9babefbb658905fda395aa52feb8d5f49e94cfbc951de536fbfa17cce175a1f1b9d40727575b569fd4feb0ca3934230953d48c5b261b91fe0a55d9bdede298483d26e8a47250eb40631654d19adf58bc79c40798b53fec5e3c4e348292d8e7949ec38c98f47241bab5ca439c7e814c085d6f0c60b142e2ca7a82493e64ae3f921328b25afa9e3125c57c4a57d613dfe8207cda1c54b2b7950dacf83657b24d9e2a8ec8d1757f3b20cc93e28a505ceeee0fdbc5f589cf695cc3f454a4bf747a7079f8bd31e75f92d7d7f88f378d00c45c7b8843133e4daac906bb343ae9d0baeb9c73b9b2a36a6fdf9e265151b97f575e5fb53f254da7331ca6bfa543fa23d03e3872a7e447390f1c395fca2757df14a922ff01a05da4f305e4ee159cee7b97c17dd372755f73beb295873295d41c1aa403a737fe3228025d931ca6b1269bd22b71fe3b4a69ac77be2fcae9d66bc27ca6bc12e95e48923ef07fc839406180ee7abb4df27db464c21cb79ce759dd6969cf705d26f81d12e58d6a297297ed34a4a735929907e0b8c0f33f0a5346bd1a12f49f399f10a800397f902e9b7cb6b05b7ed691e201147aa48694d1c49d88df590f606e618b582f7936a2df9a08c4d3ec9fd5e6dac13c752928de62b79c16bf05c7f7861b174bf904f31327a395de7f97b6a6bc4798df3cf52da7dee9e2e419cbba98d16a5357b51dedf51e7cfbcf65f5e8bbf30583ee47797788e4c7e77c9217fcaf8dd25dad7ea6e1a038d5e15c4495947eb1eef219fd6b56974730eda76ced54eb29d2330d74b761347da3392c763e2343674cf0289379f2f50ee619b5f93461764136e4bd11ac2947227edb9986ebfc138ef5fb9574a8be3914e208647af95ce8b63215daf28a505aeaeed45f38bf1aa4e60bcc34bbbf658d91be871b494478c512d792eaaee35c83185d63ec66b28bad19865bcba9427b45e39ba58ba268dd725aedfa09795e05ad3c0e6b5155eb48e25aeecf118e731d4f2749e624d94f68f8bd21a47edf8388dbbc5eb287e5ac7b7f97dbcbe76a874be40b987d68045797c8cd7c1dd9c94b721e4fddc849f52998b4b7b2926f6d0e5f82deddf18bd55b11fdd13a57e745cd9bf314ef3c4f17a920e5c3fd7577caebeafdbfdab018f06063c1a293c68ed57bca1c483ec1ca5757bf1c6ca338d536d13a5b579d13ba46be2487bf825ca1cefe11756e678ffbd7d52dad5ffc1ea8e5effe39cd43277bc814d94bdf3e25407c7a5bdf3e2b4ae2aba4cba269739bebe5c91c53edd5cf1e9e6be4eabb84f3c543a5f20fd16c713a573b4e7de2ac6a7be5ffc24c9069de9dcc9a97689de293d278ff1f3f5bb240cddf5158a7e7c9ed6abc54f516cc9fd9516920e2db05e9cc7d17b089fd7a71a965f6730e1f1bdf582c778cba4ec74df928ab75674a298166f25f16f45cf486b0774fce26d08eb3b292d8e6de9fc1e29edf27f88de297ba855d01e19c911475ad7c1df8df2d2027732e12e00f75796d219c80b8da5b43e30ca6bab695e33cee33b15a5b4b81ef2ce75bc83136c2376f0f57998fa11d1fbe8787f0856d89af761493da30fd039ce6f1e7faa22a5856d34ef6c4679cd15afedd27cff264afbdf85edd9147dc84f27de2994dfb7141ca81c27dae89d7c7b3ccaed53652e39de59b9bfb37fff6a6e139f2d9d2f50eee1fa4737ef4beb42d6f0189bb2c630aeecbf17a7fdf71e619ea707ef4bc449be8fe25c94d76c3217dd58a96baf35dcce64bf97de4f8dd3be748f505f97e704e3cabe7789fb780e566d3f496d6f758f9828afd34473ba3247d5565d145b7521db3654f84aefbe26ee41ed6b99ab325f1a5d13cc57ddfc73f451ba87cb68c83e0c6b68ff2ff685e8da0cf20c954bcdfbc5d1c77c7c7eef967def518e01b4d6324aeb38b5fd429ab3ce64bfd428adbf8cf39e7f6da4b490bbdec77a94f5a57599d1a7b17ce318cadff3b83c04936324ef59f8b3947679aee5716c837df9d8b66b97f9b2d6ae0d7986e57757e4f37e87b4eedae1fd64b88ddd93aed797d2aeccc7687e24de2bf87cbc5710073e4f7380d16795bca63eed131ca3d5b222afed4bb3ae2ccefb59ed95d2e248eb30787d579cd6eac4e598a9967bda0b3051ee692fc0279a4acf8a23adc3c86f2ba5050ef57de2bc975e35292de3c8f71704cfc5a57dafa21b807da4799374ebdfe2672bf6e1fa85f7683a26285f5e97e5718904d765c5a93dad5d97d53598af715ecf5f5d4acbb26b0431d9bea6fb6fc6bb4bf95520fd165c68fef309b64f3fe9ba5cd7d0fdebb8fdb0d17feec9907d201375661f058bf27b1d8d2dade3b2dc55ba5ea0dcbb10cb896e0afaa976bd268f47c9fe1d56aed4faf239d23783f534f1c164ff76525a5c277f890f09e69f9716d7a98f16a7bdb012f18262dc934b251c093fbad9e7f654d83c1bc7e92da407d705cf1b3cfb02a54724ed94383752b2abc22f347e53ac7b6a30f19816f28c9a5f527c485bce473ac1723e928e239c6039a7f50971a99d9d2277b49379fc1dabc8a5364c7c8c22770c1d4725b1e3bc0f5275292d8ebc97520d292dc58138ef19534b4a0b4e5c9fd11a9138efa3d45e394feb19e293141c9a0be63d25e2343fcbfba87969372fd787bcff94c0a6b9eaf8398a0c9edba5f9d6fc0e525a60d23b5bf1a98a6cdaef637d48fd1fe575b45b1559cc85f73f292da50596a62dc37a38ec2fd3e9d98e52dae5f36c2c28c361bfe3fd903886f3f8cc36ba4efba5e47792eee7f3e2a8ece711a7bd369ea1398b28ad1f8fbe8c75488cdb4b65374a6d63f83d60f7dab3dc679990fa7cc02e4af9e1f59bec77e9d66f86c60db54c9eeb641e0b947d55e2b40e247e9e132c933cdf2bed5312bfd00996499e6bbdc0099649fe061c97c9398a9fcf09e6419ce6a8a3bcee9efb31a6ed705abf9ff5b814b74de63ac136f25cdfbf9ee3f54714b79f633fa175bb71690f9a28bdb3be91fb556a9e5d24ddfb9a3ecfa23be8de4b953ce3f9df7952de507f397e4952e74dd581eccb24d969f62e8a2f5064f39894b4ef467cbe229b7f0b1b71bf86ecb1690be07485c4e975c089de1d882f543851fb287ea5e2c334f718bf3c6993e74e06f2af7232afd7ae51e4d3bc5bfc6a45fed58a7ca1c39b3e8f67e74ad7d8f7d98704068d1347dff2efe7fe51fc62c9e758271abb8bbe1dbc37a37684e487296b6ee83d84cdbccfc1ce0cf0b92cf138d440099fd7a92c7252e263a495748f263eaadf228fbee373e1effc25dab892bc507e347e18bf96eccd6319bc4ee0bae0f9f8b5d27971a4fd5178efb938ed85b6856c13a578137d4f91477b9924c65579de5f3766f080c489fd87de9bc8f65b4f11fa468c4363dd3c0798385f21783efa819d3c87e7142b4af9c279257f8393efe3fe36efcd72b89476edfbfc2a05a39206b7b2642f5e4b92adbdd6a7ca897e648719e5bd5f659e9fd8613afc8d01c9ce515e3b7098746e97a51c2ed752de453fb5c4bc8f8e8512e6678a5ea636a67ebf237d0b32cadf1f95d63344797c5ffafe6294d61a26c6424d7d86fbe2cd929889784bfb0025e64f691fa0ad2ba567c4f99b529f35fd567174b765be50ffc3e1f61eeff7534a4abbdcb7858d9bca186cdf2f9c405937e6c5ed43da232e7eb3c28bda1adbb68460f137dea4f51f015ce6faa525d7937c2e2f713b88de4f7178cd2aed459458bbc77b13f17bb83ccecaf3e47ba4b48b2bba3801bca5923efc7d0eea8745bf56fc86afc7250cddf5fca05fa5d557f0b82dc9c3fb2db876f2edf632bffff178c8bd4b157bd1b791e2b72bf6e27d88f2829ce37728f6bac3c7ddde50c15b6661afc77260af96c46b2ec9fc8630aa4979a2b60bc2f078fe7eb9138c33cb7d39aff01a1c9ad789df25e94fcf46794e6d89a21f5d77ae929ed55da7766ff43bfdf528bfcb44f6e1f7951c691d8243f688dfa9e841fb26bd42fb9fbcc271536793b9a9b851f61b8dde89ef7f23bde73be17a2f08d7db5946d77f04d739cf387ed331be4293477ba56b3a1bef4b9307d4b74df171bebedfc9dc87b9df7cb7ff0c7f3f33faabe293f738095f56f78489f31e4b5d94f32b93ba7bcf0bdcdfe8f84b907be2fa812066caf5df83bac5797dcc7d4e206624783f2071b8cff7bf1df59467798fa7d37dfd76b422597f4ad70b243c598f3f149e0f287adc0fae2b7a24d642ac222e5d95f30f6afc8839fce5e8fde0401033e5baca81e75f1f5238f0f9874338fc9d86c3431972e031ddd5c4a19b72fe91100effa4e1b03a430e3c16ba46e1c0e71f0de170300d87351972e0f1e3b50a073eff18e6208a78280775af1ac481fbcfbce75277e5fc13211c2269383c9e21075e8fb34ee1c0e79f0ce1104dc3615d861c789dfc530a073eff740887bc341c9eca9003cf49f23e495d94f3cf847088a5e1b03e430e3ccff9acc281cf6f08e1104fc3e1d90c39f0b8f446e2d04339bf2984437e1a0e1b33e4c0f3d2cf291cf8fce6100e45d270782e430e2433be45c90b3eff7c0887a269386cc99003ad1789bfa070e0f32f86702848c3e1850c39507f24be55e1c0e7b78570289686c3d60c39f07820ed8594880f7cfee5100ec5d3707829430e3ce6bf9d38f454cebf12c2a1441a0edb33e440fbcfc4696fa644b9e0f3af8570289986c3ab1972e0f99c1d0a073eff7a0887526938ecc89003af45e1fd93ba28e7df0ce1503a0d873732e4c0eba2de5238f0f9b743389449c3e1ad0c39f0bce94e85039f7f2784c3216938eccc9003af5d7957f1073eff5e0887b26938bc9b21075e1ff5bec281cf7f10c2a15c1a0eef67c881d7567fa8e4059fff288443f9341c3ecc9003adf38a7facd881cf7f12c2a1421a0e1f67c881dfa7daa570e0f39f867038340d875d1972184cf77fa6e4059fff3c8443c5341c3ecb90c310ba7fb7c281cf7f11c2a1521a0ebb33e4c0efe67ca970e0f35f8570a89c86c3971972081b1b09b996c77b67f03a749ea771dbb9adaadb613bb48e274f9e63335c4fe1d4248c2ad963e41d216165322f5b9b9e3bd242e65112562632c9fe798516b6e2f91d1e4fdb27a5ddbed36783494655ca6b5a4fa69b4f880c9630d5f9a36f14fc6f087f23e1d3d85ba42cc60f9dbba2b5398ef44e7cf0fe78c41b1fefe48c70cbf964a781f711c83a8e681df574da3af5dd96da70679233d1fdd5d63d4e70fffa293ecf4fd6730ad33ce3f5bdbdaf68ba7f6a7962a739b3dd4747381111c37ab989a9eea911eefd02a3b3fbcc34a789d3d8c39ee05e1be6e24c71c63b63dc7850395242e2ddd6fb7f887bc7180fb4577e8a882753440872e3ddbf23dcc7a6b90f0a9253ddf31ddd3313dd7f53dc73c3dc7417f7289e1aec34721b09031494beaed8f1ce7437d5dbfd7fb28737d8a59d7a673a9506ba67d5677aba98133d7613dc336cd0c96e7abcc7b097f7ff0c8fe9088f7d67f7dc34f79cd06694d3c63dcef2a4a5ea3ec5fdad93d99b4ca6e738d0e87c245254caa676ae36827d03cf4fff7f8efc2f72c41b7e12e543fc8935f066c7ae48c989ff6f433fc88841aace84d1c833592470aeb1d3c09b3fec996241731d5335d4fbb76fefe39da6a1bae82d23b2fb704f83640e17bde1961e3b4bb79b120faad6c46920bc2452258d6a61861578b52387a62084ab108fc71a0aa2aaf9233af37b9fbfedf51f9adfbf6f8c779f7906e47b955f3003bcada77abb3f66b9ffc67b2266bbf0c39cee6e6a88fb5b504dc99d8602aa8867e0d4ea331d4964e2a8cec4de8ac1deff130f1f9026bae98d5c34a145d2c80dbcf64fa5105744b2bcc6521eb598b8b07cf0d079dd3ab7b8bef2bba7373de1a486272e8febf3a798973fd948453994a7cba162ff7521481ff5c3f2a77842af64fe883f7a1b96003e9e8e03b2604c67c1e2ff1b1f17dcb3f371313c7aac6243bdfd4a85fa60180364c1b8ce82de5e677dfe430b7673198ea5b66276362c9db10dcb7836ac9ca25d261c9015f335566c58827a6b29b40a145a8211002e8280cb5a021745c0e52c810b740e55f2bf2e92e2da240f65887bafb93b8951d1ba6a58d3fb53055026d35340de544c9737c284876a59a9995301674e71845cd116b90442ae648b5c52e750de8ad2ffbea59e5d1d29624dc58cebc8c39cb086b6690d594a673d6f0cf2ac7fd57aa90348fcab8dfbec68d70e33bc5181e9eef3ba01a7708b1e9e71b4afe259b3d0d10d83993142162eadf37c61f62350b6abce7f1876fe323a7021f1c84cc274150c7c08023eca12b82c0a0485b681a01c42aeaa418e982097d7159232ff9b10d3c8ed4a98871831ba5c2ec5d7f445a25a688041f291fb57d0e58ab05d753d25355baae16c3954972d9ee3f6f80fb3a58d9b12bfcd33a586cbf290cc1a1135bd3ca990a25698709423155140aa958380540915c2dab6c5bb3242ae638b7c98ce8fbc3835e63fa9037b39ed9cd35c8a49b449de18b89033d51ba11de3d63123dcb3f2eff62eea142fbb93b5112385fb9d78cdf5084d3e3b3024d4f5dcef58c7f9173923773d1ce57b3ddb7caf82908fb5453e42e7515efdf4df0e5ffaa382e3b38a4e629386a3326e953670d0e864380794eb47eaf24658b021a2a5664f039c3d4721f04639002f445ed5d8d6abaa22e426b6c847ebfcd56bf59cf91f46c0362ef9a91ea67fbe8fe7256aa4e0bbc2bdb7694223695cd86b8b1c9912c5cce48a8d716b45c4d8ec74efbe88e720fa5271bc572a6c25a232524de70f22d7bc3d7615e58fd3b9f1f1d825aa23f0663900af813cf9445b4fae89909bdb22d742c827d922d7d6218b76ac782f31b581a822d7c4c87574c8a2a9275644d936f58ed1818b2ea2d89ed8a68b581701b7b404ae87805b59021f8b805b5b02d747c06d2c811ba0e2dd3613e090a2dd1001b7b3046e84ca5f7bdbf2d7182177b0456e82903b6a908d86249a22e44eb6c8c721e4ceb6d6385e872c9a5de29db2d466d7b25626cdae1310f8695af0b92d4dc09b219b74b1b5c9893a6411fbc5bb5d56b1bfb90e590cbc8837b6ec065e4e42e6e866eb7c27eb9045bceb9e49f40889772d10700f4be053902d7adaba464b84dccb16b9152a2bbdb56565a351416c8dfcae8fb5dfb541d07dada1db22e87ed6d0ed5011ef6f5bc4dbeb90455d2b5eb2b16da37740e067e600bc23021f9003f04e08fcac1c807746e00373007eaa0e5cb4d7c50ecfb6edf5d310f8a01c807741e08373007eba0e5c44c2218e6524ec8a9087da2277d3218b183bccb11f63ea8ec087e700bc07b2c9088d4d8c6af79e3a641109473a9691b017e23cca361f7b6b901b78334fc2b3ff574363f272d1d69e84ec86c9c4db23994d948ba990da91ea4ebaa1accc99a161ad3ec8b9c7e6c0b9fb22f0713900ef87bc70bcad17f647c8136c91cf40c8136d91cf44c8936c9107a04c9c9c834c3c0bd13ec796f640843cc516f96c843cd516791032f5b41c987a30a23ddd96f610843cc3167928429e698b3c0c21cfb2451e8e3271760e327104023f3707e02311f87939001fa503176d56b1b7ba6d9b75b40e5cacdcbc20717312fca0fb2705bc04061f83985fa8615ecc90f958e48773347e68d4fe1b876c32576393b93ada2136198fc02fd2802f32049f80c02fd6802f33049fa8016fe0add211d4ffcb3598fa177f3bba9a0969f20af8d4551ffce6674ff738d26331c27bb36944062f0c8737522f49d8479acbf5161ab57774eb36ff575acc73d914f3860af54de84b1dd184febf8b336a844fd239bc78dbe03247f3569be8c30d72fc058242fe44ef52771745e4a6383fc63da6948922b84c4c46116ebe26c2450c23dc39ba02e7ad2f9bf83f2d70edddffc56bd353bddf33287b7b7bb2932ff8d91425b1d3a9d9d2afcb3da76d9c81d3e6823d72c72928fe5ea189bfd52366f1772a02bf5203dec9107c1a2a48e2e31769271e424ac874047c95ae84c6bcfbcccbe10c649bab35b6e96f689b993a70d1d2101fe6b06af1ce42b41769682f34a43d1b59fe5a9de54545decefd318de2f708d7f10b9d1ede4551400bbd77ee87b8bf467a85748251fe9c8b14bd4ea3e892a899a2e72145afd7295aa055d44499f391bcc53a7922d9dd8d1e7e4c319173019273834e4eb1849c765e968d739f99e4669a89c40b91c41b91250b69242d3bb79883dce2268d5bec36748bb93a703197ba2493901632977a11b2d2cd3a2bf98d8e412ee4202a42fea8e3202f3dc4fd35c4d06a1723f9b7e8e49723f90dbdffdb7af5d734f7f2186f2b93c00bfd061c2e411c6ed571a812e0900917717d8a574a4d58cdd3b112916da993da366f28dae6e27b00d41856e55c8ae55c8ab4bf5da77d794ffb6eae8eace15047ec0c34ce39939ac7ed134d52136d2f432cee40a555f6bfd6eebf5146f2e62379cb74f2ca4a792e5e4b9be8c6d9f1969ebf0031588eedee33189168e975a5ce4af62c2e472cee4cc722d5fed9b3b802b1b84bc7e2d04009145db051b46591cf65b8fb37db5870252a752b50a9bb3bab52b710697c0f8e7be1a56e967143f32ac4e1deb032d0288765e06ac4606598f735ca7119b806b1b82f1d8b5c96814588c5fd3a169543cb404feff9499e8db22d09d7eaf888f6cc034e6a7b6651dcac3d739d0e5c8c35886f27d88e355c8fc01fd4803b86e08b51363d840bae1c30938dcbec5de506c4e1611d87320157e9e535446c1aba3722c758ad718c7af9668e7113cabb477290774b10f89a1c80dfac031735c7a30ea839c47721cc6b8e5b50e63fa6cb7cb9ae9c917829506d9d66e786b722268fa72b0aec867db58c4c382c45567f02597d5d5656bf0de9faa44e577f8997a8af7b7b761535755baa35473966834eb76b2437f0de9ffd2fb70392b73ccb6e3ba0a73419d2c07bd33475e39f4ca489af80d0468b8e53048cff8b4f6de87616ca44001a18bd03b9c2333a57a8e0e81aee9dbde693d8932efbe2b70cf17856c7a3b4c46388d754996a217b3992bd4127bba413d65831917ba74eaea87b363aa975cf96226675cf5d3a7031e4b1c9b15c2bb702213fa7414e9ddf0d41be1b216fb6e57c0f32f5168da9ff3234f5bd3a70e126cf3b96c3d02b11ed1734b40b8b9ad1be0fd17ed196f6fd88f6560ded7686b41f404eb2cdd64956e99045f5fb9203aa5ff17196a8179bc5674e6a47c4eb767d689664b6377834ca8bcba2fad2cdc58a488deee7aae674f738dc15292abdb85135ff20d2e715a48ff8508a7973e22124e73524674756721ed6c911f1557c9725254e0b171ae47664fb26f64815f5a4a81fcc061656eba48af69ff89a8aed8b618f20d3bd894cf75656a65b834cf7b6ce74c51c9e8e178e29da7a23bc569f89d91e4566dba9359bd9cb7a6b5180794713601615980598c790adc4275b6c665c1fd7018b802bbe236315709f4094dfd765af78a1a8ab1b550aa54e9468310ef1d65d8cf2da3185de126b31bb38c4fb9f9be185eebd23bd39c74934fb3886dca49ef7cc38f7f764af912e6259a1873ed2c510f12b3957991cf233b1df3a64bf0f6cedf724f2a70f35fef493a13f3d85687f644bfb691db218d2fb38134f0d798f683db2c7271a7b742966668f6710eb5d96ac9f45c09f5a026f40b1ec336d2cd3982324966d44e09f6bc15b1905ca4d2830ecd60506ff851751ec45f49fea354886b84555343d861b15d5e790dc2f7472e5711d2c3fbb99c7cd88c9973a26c5150bf897c6186abf05c9fc4a27b33cd03e293b3bcd9fd7b1106d8baf1dd0b610df94316f5bbc80b4fd56a7ad3f80cb23647c1c4f5d687f231b132d5fd449174356e203d8ea30689eae6c860c836e4571708f260eee2e6e1607b721e6df6b986ba34a08f39710f80f1af00243f09791597ed498a54c0933b36cd7818bc824beba65555dbe8290f7da22bf8a0cb24f6790926606790d81ffac013f50ca0c7c07f293fd3970c2d735e00dbc5df3fedd8d11c3bad4c1a5cfa61df0f05161f15dfaccde86fcd5e10d11ff3dae68c8f70d14af7fd3d13708c56fea80857b1cc804783d067e0b9580df3525e0c3d26625e06d1db8b8ff0f27b59a6ce0edcc98dde6fe7fba4fe5c71cff4f7df74f91d46a3664e3fb9da8a4fea529a951c392fa0ef289bf1d4d1d2e5ed6d70d67153ae7b9ad980bbceea29890f057704ef3ba97c23be58172d1919ceefe3ed6eb501eeb0ddbfbf349854e726a412036f210477a657d82f79cc0f67d5f5c6fec5e6fee1e9bb8c7aa460efb2ecafa7f3459df5064fd41bb3c7c0f99592c0b4831f3e09c98397b63163a339dd114800b956532858ef8d6d7706f7460048d0288debdc01de5b198eafe35cb8ef751318f44528bf9aef266c5fc035d5de4ed12fa5feec1dddadbc056b478cde71ca3914c6b97bc887e07ee70e9a8bef850972dc272311d21354b041700fc912e4bbcbd55ffcb5d6ed5f178b34c89679c29f911fd0eb7e9e4a36cf95867bd4271f2bfdcbd3c936fe5e92d572463cb158de8372f0ffd9c1cb0da273a6716562b88a46ebff3abae162d8a1d7a170a60c534016c6505b300f629625e5cc3bc8821f3cf10f3121ae6930f3563fe39aaf54aea6a3d47473da4d6d88da897d2506f56d18cfa1708bcb4067cf16166e05feac0458bae4cc4beeff515023f2407e05f23f0b23900ff46072e7a8de532a96f7ec5c0df223f2c9f0970880b7e87bca482c64b661d6ee6257b74e0e2fe4323a0915a3162d548fd1e99a992aeb88a1db04c1ba9a232fabfb13ff00332756564eac3ec4cfd2332f5e13a530fcd99a9ffdfe913fc848a56154dd15a78a459d1da8bc2d811390863fb10f8913900ff19c5c8a32c63e47ee491859631f217648eaa1a7368f7330931c7afc84b8ed605e0a3ccbce4371db8e8ff54b3ecff1c40c0d52d817f47b6ae9103d7fb43075ee8266b66c23aa40dfa27cac45a9a4c6c556896897f21f0da1af0a255cdc0ff46e07534e03b0cc1ff41e0c768c0971e6d067e10794add1c788a1301e0f572001ed181fb1f97cbc00df3b11b4675c022b0d5d7d5c962db70d33a791ad5afbcd2c6a4e163567be6215d1ae874f1c27c40aa89ac1892d550274b9ef41e9632d591fd5aee3862d148c7427e157602b54ffc1550d933c8470c1aeb181473e4d5e4fd3ccf986658b516d14914c04d74e1a7ba5984288a0a71d31c14e202c4fc380df37a35cc981743cc8fcf01f3e288f9091ae60b0c999740cc9be5807949e49f27eafc537c356300c5b2816e6c184071a839f50bfc73fdbde3b1ce29eeffeda59835cc031aeff8eb0027bbe7467bf1659637ce38c23b3bdc30a69542fc9bebf88b4f0d2419f1d6b185099d9a933e82bfda4ff263b6dac799e0dd3135b1c271927776b8e3efc622fa3ab31dd3e552a5753a09073909753c4f161d4f6fe6c8f13b9ec67dcf32c8c95a689c2c66e8648720f05334e07143f0b208bca5063cdf10bc1c72af563af7aa9e51f1f0bbce0ddc63533ae71795f39ce3e8dee3dda389c394470ed31a394c1b6b87a98064b64532db59cb3c146575fb1c44c28aa809d9c1b209590959aa23b294d8152c3f2e5bcacc4e95919d3ae7c04e87e9c0c5baa9532396eba60e47b5e8699a5a74782bb35ab40aa2ddc596f61108f9745be4231172575be4a31072375be4421db27821ab7bc4f285acaa08b9872df2d1c8f17a6a1c6f6b6b33c7ab86aa905e966368d511706f5ddd24c2454fafd935c21b92f5d78689c64f8b44f7d4447a0d64b33e1a9bbd6b68b39ac83dfbdaba672d44bb9f8676ed3666b46b230fed6feba17510f219b6c8c720839ca931c8604383d4d5818b450f0374559f58747e56249b45e7f590bf0cb4f5976351213b5b57c8fc37d1bbb845cbefeb74f27a18addd94bf9262aa5111ab8f640fd2c9aee4c86307611cb27b81a0818e8d18b8199c491c0bfbc623f2c0211a0ffcab9d99073642361c8ac65fe4cd2c0ab37805a131526798469d12edcdd46982c0876bc0c71b823745393cc232878f43c0232d818f47c0a32c814f40761ead6b1118dab919f2c9313a9f145dd69e5ec9f5df5b36f1c513911a637595b4a11acd512f635c0e7a192721e6e335cc2b7530637e32ca800928a8fb7bfa88c56b62787e8a174a0b136d28932c6981149ba86b80182a760a029fa4019f6508de12e5f7e41ce4772b9425e7e8b244ecad93dcf145ccb08cf146f5e4ece1f580d98fddb7469ca6e83805b76eec23ad7d486e0525f33361d206e5eb544dbe16ed6896af6d75e0a291360d35d2a667d5486b87fc67460efca73db2d04c8d85fa1b5aa8037284593a47280be3c578720811c6671b394047c460b68e01ef652c3e732df646e30bd917854e48feb93af9f2c650c1a2209aa533ddffb3b54367e443e7e5c0874e453e74bec687761bfad069c88217200bea7dc86f0a4cf26e1461cffbce818105bb201e17ea78f0ce764da8cb30d5c9c5f65ea7230e73741c8e84ded4dde3e47fa4c49fa0b1b54e57d4cf9e6bdbcfee869ceb228d734dee64e65cdd91412fd619b454c0b98679a61be1adceeb60bcd16e0fa4d6251ab5e61aaad51381cfd3154843f05ea8dabb14557b976555edf5464accd728d1b4b399127d50c62f404d143f39465a98996c9e04638dd960455fa4e6e51a35371aaad90f815fa10117df3d3601ef8f6c78a5ce8602a8b79b1ce7d98ef7c69fe2c51c137b9d81545aa851a98ca14a67eac0453fe6aa4cfac521df54188080afb6043e0b015f63093c10d97991ce2f4f33b3f3d9c875ae452374c9c276ba13dc6149dc2622f110f7fa6c87775c3271a94148d5eb34aa1e30547530caa0eb2d33680862bd58c3ba4a1733d6435106dd10deea9a9658d08137c532c99a61a8b2b9115536376555d90c47fa2ed1e9eb6f5e2af6f24dba65cf840b9ae83742275734b56fd6e927baefb744827bdcaac242360018898c792b32e6d2ac8c390a19f3b64c8d99dd1e83a391316f47c6bc237b638e41c65c868cb93c2b638e45c6bc5367cce21a63b6f77a1e26861c870c791732e48aec0d391e19f26e64c87bb232e40464c87b33f5caf65e77699261089b888cb91219f3beec8d3909f5f3efd7f4f3b5afb786f4f327a39c7a00e5d4aaac72ea1c94530fea72aa7422a7e44678b65bab4f41b9f510caad87b3cfada948d1d53a45f9a30d626c6aaa1720c533d98f264c43d21f419d5f75af7e795b5813c9d351d3658da6e952a2bb59d36506027f5403dec9107c26025fab01df61083e0b15dec7723048371be5f6e3badcf6e6021d7f17bdd669260a4c72fe5cc4e2091d8b239cd43dfdd2b1c96e92fe3cd44a5f67d94a3f1f39cc931a8769d6c3cc612e40d67c0a75a35abb3f877be37bb9ef465d88547d5a375267a8ea1c9441eb2d33682e62fd8c86f56243d617a10c7a36d36ed4904486d974a32e4635f70654736fccaae6be04e9bb090dabf93577d22dbb7b2dac91f46eb45c8b9b3561e7a17afc39548f6fcebe1ebf14f9d016dd58494f331fba0cd9f4799d4deb3a0e7d207584f716943f6879ae2306dd26ba961563d7a2988b90e90751f17686ff8eb95ffca77a4373bc616c72cf6a13ebcf47fef602f2b717b3f2b7051a390daabac9c8b9cefff213e2c96fb08ff4e6d97dbcae5ed99ee9f520c6053eceed7f7d455cb5fdb4f8d648eaa7c523e4d4fa7d81b645c4ebbba7784ffcefb4423b0d5d8ebcff25d444160331e77849619d6e2eb38994bfe60dd52b74d2c5b4d6cb11cb69ad2b11f2765be48508f9155be4ab50987b5513e656f5320b735723f0d7742d6b43f06b10f80e0df87e43f045c8e0af6b0c1e3531f8b5c8f9df08eb1f36cc51fff03a24fd4d9df4431cb97f280fe5890020d62f987eadfb7a9d7c312ef356c47271f26284fcb62df20dc8d1766a1cedfc33cd1ced4604fe8e067cad21f84dc826efdada6409a2fd9ece2603cc68df8c9cf47d9d938a2d67e5376b73ffd1ea5b747cc46a900f22f61f39b81559f2435d0f6ba0992597224b7ea4b3a468aaa9962b24bb0a9b35f7ba903c8acfdf3f317f5de636a4f2c71a95e71aaa7c3b02ff4403feb521f81dc89ebb74f6ac97813dc51bd385de4230bf4553e8f8ef54fb7b61f033a3bd36bcffacff66b889bd9721937caa31c90143932c47e09f69c01b9e6d067e27b2f7e73a7bd7cec0de13bd5eb758b225069686795786272c2b7fcdc77cb0e42e648add1a53b43234c50a04fe85aed01882df8decfc251a74ca3ce29a7fb0fc1ec4e62b1d1bff6b66f28765db7a4388a6bbb4dc8ba47e8dc675924d23bdf4ec862d57221edfa46b208ec9c172c4fb90f46f75d28313081d9de437a7cd3ff17b3f92fc9d4e72c58064cc20bb3c780071d9a3e3e2ef54139ce9366d18af42c5fb7b4df1de3ad8ac783f88c07fd080171d6206fe10b2d58fa8b4f6567679e2fc32b1d7c348a59f342aad3454693502dfab6b4318823f82ecb52f537b65e35f6b904a3febda00862a3d8ac0f76bc09b0e35035f8bc07fd1804f33047f0c65c6afbacc28a9755e319c2f1a0b26d9f13852ea375d76182af50452ea00528a27e29231ac771623c4eb90dcdf7572759f364b959f5dfc7e1231f943c7a4b812bfb3cbd2a790cc3f33a933b289814f2327fa4be3445b869b39d17a3476f0b7edd8c1333a64519fff93b8a04c241c8c643391f02c328ff8068c6a9ef23a2542ccb301e576249a6114f7df4a37fbcee746a45254a35277439536a11ccf8b5ae6f87388764c437b9121edcd2827e2ba9c28ea24dff7c82607b62055f235aa2c3354e5799403456c73e00544bba886f62e43da2f22f0020d78ef9166e05b51b4281605d1a278349b68b10d295142a3c40a43255e423e5a52e7a3e534d142deae26bb97ad5f460a96d228b8d650c1ed08bcb406bce92833f05774e0626ea24c34753226623219f32aa27d882e3019d27e0dd12eaba16d3487b403d12ea7a1bddb90f6eb08bcbc06bccc6833f0371078050df87843f03711f8a11af05586e06fa1225c515784ab688a7072aa7da277636160ad657685fa6da472258dca5f1baabc135547956daba37774c8627de26151bbbd4ade45c0875b02bf870c5d4563e8da63cc0cfd3ef2ad2374be2526bc741bf3143a3d124b24c4ebabe281f1597d4efe03a4ec911a659b192afb21023f4a574a0dc13f42f95f6899ff1f23e0aa96c09fa04276b46d21db850c5d4d63e83d8686fe14b96c759dcb0a7db8d5ddc97b3d74789601ef33a4540d8d527f192af53902afa901ef32d60c7c376ac8d6420dd9da593564bf404ad4d128b1d450892f51b61f83babda2e13adef117218e90b2df24d3bf422ad5d5a8b4c350a5af51bed443f9726c56f9f20d52a2be46890fc79929f12dca9706ba7c29eed52043bc76c708afe6c82657be430a35d4c5174385f620f0461af07ae3cdc0bf47d66aacb3d6215ef01ae7b6e526bb96124b23677981acb56baf19092b9a58ee07549934b1ac4c7e44566baab1da4a43abfd84ac761cb25a9fc047affcd689f837dcc96633c1bd48b9e335caad33546e1f023f41035e748219f8cf3a70d1cb6f16b55f40b41f313f51c37cb421f35f509e37d7e5b9ff0957bf9af797098d4aa4fce17cb104432c186aee96a32686cb867e458a9ea4ebeb182afa1b52f464e4dca97316ed9ce9de8c7b369bed1c40f25be8e48b971ef0dc89ca23bb3994df91b94fd185f78966e6fe03b57a5bdab67aff44b45be942e02433da7fa1b6426bd4566893555be16fa4445b8d1225269b29f10faa7dda59d63e0751986b9f8330e74481493a684c32cdd0241104de51e7eb86e05104de49d79439c70c3c0f8177d6b5f60dc1633a7011324e45ad4a9ec60cee15621276e248a1d3745961a8503e02efa201df38c50cbc880edcfbf6816d4c2b8af2a16b262536c4d80508b85bba5aaf9723be683ad97b43689adbb5ebe3d63363dc5f6633d8c590fcee99d67a984776b55e711d23b1c8ae47547c6639c8289a0a5d0d439740caf63435b61837f65faa3451ad2492df2b5b6327796467ec52c8d8bd35c68e1819bb3482eea381d694c610e8322888f4d555ce33cc82c82108bc9fae1f32d30cbcac0e5c54d0fd3515f4c18373e69854d0e574e0a26d74066a1b9d9955dba83cb2d000dd9c9da1852a200b9d958326cca1a8000eb40ce3159149ced64ded1a9aa412021fa401df62085e199964b02e26957574ddaece6e24e27687ff8abd89ed0e430c86e818c89b6d67c224bbb87838f2c2a17a2f6c65e28555507e0ed3e4e7bc73cdf2f308043e5cd7fb32043f129965440e0ae75188f948dde88221f342e464a3744ee63548e9e5ca42c9bd4c5ca82a5267b46e41c67966ea1c8dc0c768c01718825743b61aabb395d82e24d9e9b01d62ac8e141ba751ec80a1623510f878ddecd2f966e03591d526e8ace675ca9537787a27de37cb769fad5a48c189bac862a8606d043e49570d1982d741d69b8c9ae6499fe35fe3e9fba8d9f8dd3148b9737413ee73cc94ab8b949ba253ce7fa5c77f91a6ad37903885dcc45cad7a48f254347aacbecaa363905d9d7a2ce2320d15103d87e41a0b737bd4471ca6eb3854496b0f954b961fb342ac6620e79f4d1f669fee0c75c4b62bfe67ca1b3833bd41e7616ef83091df10c99fa9935f10905fdf63d0c0485e23246f16aa8c6778fb910df73638194f5bec98486c8c24ced649cc1351dbadfa9b1ac968a291d1e068371919e8fc9bdbe60491fdfbfcb62fa30ef1cef85b10894d6326b8bf87796308c29643d36c7e736ed474f39bf3a262f39baa295a67c30d6d61d314e5e8f9284767baf7cc30cad1e3908c0b908c96ee7d2d8c641c8f645c8864d43496710292314727a388a747729b013359cd90acb94856cdac659da82b7162dc28d2e33f2c717e636d4a1625eb22977f0dc5242d4099bad82b531552f40a938eca4e73d4d8b944d3d8297fb95963e724043e4fd79232043f19815faa015f758519780be4ba97e95c577c0846f41187787becf9fb0acacb3ffbb82ed7c59b8619427bc609f7e3e977b389f75310b3f93a66f296b682d964afaacefe8df49648fa02545d271b4d3dbdfb8718be2bdb0a49bc1c3715d537d19392b36b94b546ae7685aeffbed0ccd5da2005af442dbea43ae22594e10907cbcea1da22f90b718fc437ecf4443b373b676a87245f8534d7ed7fc505cfb78189fcf6285bafd664eb46c36ced8094bb0695147e935c9eae3551a723526791469df15799a9d3094d285c8b2614aecb6a42a13352e27a8d124bae3653e25494278bd100b73a2e63fb398ad3907a3768d473ae3153af0b02bf513712b8c80cfc7464bb9bd0f081fcf9a6e4c6c7a271325c5913d5dc70594257c465898e8b504a481553a553bdf9e8eca47643e6bd5963dea5d79a99b73b1a4ebf2507c3e93d10f8ad3900ef89c097e600bc17b2f96d1a9bbf6568f3de08fc76dd00f37566e07d908fde611e6bb2fb5a4b5fa4de328d7a7bae3753af1f025fae012fb3d80cbc3faa6cee4495cd5d59553667a03c5a816637b801c29dc7ec1b3f6722d9779b347efc05bed9ec0f320065e03d9a0c5c6b98816721f07b35e0d36e30031f88c0576ac09719829f8dc0efd380af36041f84c0efd780c76e34031f8c1cea01d431c401c7fc8b4643906aab34aa9d6ca8da5004fea0067cb021f83064b7875010f0bf373bdd2b72ad9d91de535312fd1013ab0d47b21f46b2935fe998ee7517b27fef650492bd5a27bb92a3fb52888e43765dec9188cd2368de6190f7caa2f0607e0bc844de28246f0daa9e93e157959b9dc6a35125f728aae4d66655c98d419a3e86876c78c14376cb1dc6a2e2fab8a6b86e5f6a565cc721b33d81ccb62e2bb38d474a3ca9ab086e33536202ca93a750e58f6375363b7f4f44ca3dadab886e37536e12526ebd79cb37bb2fc24d460c9e410c38a4890fc08b31dba4dcb6de8a82a9861f1d3e07317856c740b7902d8c497601670ae2b441c7a964a8554ce44e457237eae4ea76a24b959f9d05a6e9988811cd4dd1d4ef7f8979cd14f090ef7f4dd7cd40557793913ece7f3703d5c7f1773669e24a1f40334e663351cf69e268831a428fca297a64226db38b5754c009a36d5de638d3dc7ffddd7f8bdc7fab9689b0ac9de5dae2cd72652713cd76cd40aef83c2a02e26b687e1e882dbfdb79616a8c63bae9f74c24f7059ddce2de7d13bd3695ff45f4c22c46b76721992fa2413279abdec22c0bfb6c24752b92dad3e17792bb78e5618c9732b3efb948ea3694afe2d59471de06e433bd4f3365a7ed7928a0bca4092851c380723e52ea65d4a1c3f1b2b7d3dfd07d2e40d2b7eba457ce286afb2cb28bdd172253bf9283d83d0729fbaa4ed9422f2ef0db36621702ffb35fc13772e40f7ff5f23c7bba57bea6197bd95ca4fa6b1ad51d43d52f42aaefd0a95e2eb4e8143ab5298feb182978316a8ebeae698ecebad3ac397a0952f00d9d82159ce0c4c554afde1de10def157a9fe5f2ebe8e1c6d307f390926f6a945c6fa8e4a548c9b750d895736d18edfd63aad2653aa9a239fd7634759d589ee3e89db32e16301fd96ca7ae27b9c2cc660b10fb7734ec9d2cd85f8ed8bfab1b8037647f05027f4f03dee96e33f02b913bbd8fba2f3dbd803e25f1ae4d72d18b1f0183e56842169b4d2d440a7fa05178a5a1c25721f00f35e03f19825f8d862c3e4243161f673564710d52e2135d84b9c74c8945087c97067ceebd66e0d7227ffb54e76f759cd42103f46972f1099ff0ef19b7c862cdcc7588ef67e99a66e8ebca26d2af47d23fcfb469865864d7345b8cf8ec4e37953555919ddd54da0d48fe17a809a37e675d9e50cb2e4f6e44c5e34b4df1d8bfd2ac78dc841a805f691a804575b5544803700962feb586f9f0fbcc98dfac0317fdaf6fa296db30dc8232fd5b5da60b8489f41524936cbd1549f90e4d92245fcff7b7dae3af5a71509ae89defe8b5bda61b0edb2e456cf6e8d854d514fc4c596517086e43fcbe479338a31212bb7ac5de2c776e47aefb83aed0dd6fe6ba7720657ed429534f532765f6d1ed42ef1d1d5d266453332d43ac7f423553d245e4cccf2e122f47d2f7eaa497d7446264331316772216fbd2d920174ba4ef42d27f4e37b338c1e137b6ec72610562b03f1d83417441d486ea2a631306772306bfa49bfec8844976c1e91e142c7ed5048bea0f9a058b7b11f86f1af0320f9b81af44d63ca0b3a6e858e83f50df5cd909aa5a16f1e53ea4e8ef1a45cf3254f47ea4e81f3a45ebbbc9365e612da497106b796e2136381ced1d935ff2acefa60add26ff68fac6e754f7d7246f404e04e0893480373ae164e2e54213b33c80ccf2a7c62c1b0dcdb20a81ffa501df6d08fe2002ff5b035e74b519f84308fc1f0d782543f08751b7fa20ea568b3128f36ef56ae495e2153cb08082d7f267b780e21164b6689e26c31f3133db1a049ea7015fb4c60cfc51041ed380af35045f8b323c9e07323c3fab0c7f0c295144a344bd47cd94781c8117d5800f36047f02b96a81ce558f701c6969318fdbc935c4785ad32646bea77873d42274fadfc83071e87548e9621aa5271b2afda406bc81f8604b64b2f36f4ebcf775d1da7a13d2c3bdeb8c368152bd940a38f9be434fc75f4038de3d53cfdb55260c297cbabeb86bc13cc5820d6a09ed9b7ae7fe1b8e75bdd777c5fdc9e972a7a2d7c51bead216a4939fe2751c38e95f224f4cfaff97ccd15281a790cb96d4b8ec2e43977d1a95d352ba722a467a3a48334f855ee5925d495c8fd42aad51abe95a33b59e4101ba0c0ad0876415a09f454a94d52871d663664a6c40e0e574167ac20c7c23022faf012fb3ce0c7c1302afa0015f6d08fe1c023f5403ee3c6906be198157d4802f3504df82c02b69c0b71a823f8fc02b6bc0df35047f41072ec6af0fcbd3bd5a357783c9ab552f22e687eb32f41933e65b5180aba20b7035a89ef63fbd2537406a7b434023dd5f43bdfd9de4edeaa73a7512a1f03c576636dbd86f43163e4263e157b677696962e19790858fd458788ba1855f46163e4a67e1e64e7059c3705a56c63ddf218125fcfc86263709277b2d8d195efd3a9dfacf7e6ed5f39a8693bc0913be5bdccb0d4793bcd88ecc55a831d7d786e67a056574556d51d2808764f4ab88f9d11ae6eb3798317f0d6574355d46cb5310dd956cf3dbfa0223fb1d3a772036d5756c74531099b2ca6e94ef75c4af868e5f858cac95cdeb756f201e35753c8e34b293dde7b8df44ce5a4be3ac5d9e3373d6b710786d0df8f986e06f23f03a1af09586e03b11f8311af0a29bcdc0df41e07535e08b0dc1df45e0f534e0a3b79881bf87fcf8589d1ffbabb5854726c713c4ca6ce1a523bc754023bdf5bdc96adb74fcf97da46c7d8db2cb0c95fd008137d0b5ce9f3703ff108137d480ef3004ff088137d280577fc10cfc633489df38cf7212ff1344bb8986f62c43dabb1078535d0fde10fc53047e9cae97f8a219f86708fc780df80243f0cf11f8091af0d85633f0dd08bc99067cbb21f81708fc440df8f06d66e05f22f0e6bab2ff9219f857288a9ea48ba2e215a8015273dd5f52dd3cd14592dfd31868b864f76bc4e4643499a1936a22f11b64d8161ac3cedd6e66d86fd188d32968c4a96556234edf21b3b542d5e02047fdc4b4fc013e31413bd4bd7994d4ac3331ea1ec4a7356ae68ac66263f7df88c42295cede4bfee215e6ec971a7c8f78b4d1f19077d018e4bd47201a06a368af6653c7fa01e57d5b94f7edb2cafb1f7572c482baf63a3962314307f78218cdf6fe144915b61e0bfb0929d51129d5292ba5f6a28cebaccb385e23d2d4fde7af551a4e1326d9bbce3ec4e0541d83f21283a40bf3a2b1ec59fc8c589c166607b19de2306ffa609a93dc03203b06fb11832ee98b90dfd66e1b606222fb1724fb749d6c714114d5e4d69626b27e45f540575dbff335b37ae037a4483734a1c2461ce79e986d917d0790e4ee3ac9f262b31989d3d94bff1d49efa1935e52e33cc9cb2672ff40727beae48a64722d8e899c3f919c5e3a39eecdceb1ee5f13097f2109bd51f1e3b14ffb45e37f23d97d74b22ba695ddcd0b8c53bc915bd3d76bfe415cfaa250c05cccb7de3f8864f5d3c92a21c9b2d9f0dfc90352fba3b21294eaf52ab2901b4172cfc8dcc3ba3a62bba1a1c6e5278a649fa9932d5ecde0917ba1abbdfc3c247f00aa5ea72add8da18eff1d946c19c41083b3507c6606dd12112bfbe1f238923e305ddecbd2877803c0a68b70f391ecb3519f45175d78795057afb698e9cdf58ccb6a48bc08e233084d64a4f269ef3671c4fa4c7e7fc1dfa82c1b3645119bc1a823cc6cc4863bc3bc7683597e14208943501b85257672258e0f9447b3dd688a21c94351bc9da4d424acb389d4e248ea309d54b1e9c564698821bb7e71092473388af1fe9e3ac17d76cc5f4e2d89e48ec071d6979bccd3ee4e707f5a13f9a590fc9128cecc908697921f87cfa6249546b247a17c9ee92d669ae674f0ecdd2b8b654c6590ccd1a82c8da63294dcb7393b0f3b04491e83258f504a6f767b47974592c7a252cc3ec616ce2677cb21a9e39067f9ebe7f94b08bc2d6236b2cb23d9e371c414134de3dc9343bd018a6c5be61590e409288e4c73f88b6ded9ce0eed626720f457227a6976b133f2a22b993502b69b4e75bf2f6483c0c31c52b6926d22b21e99371991ae24d894fa70fc6085f3b338bf73b2b23c9e7207b8ff15e36b7957b984eae68644cd10c868cdf65361872b80edc2b1d79f6fbc554d1817b8e683b197804429e6e8b7ca40e5954c233dc0b87a445ae89918f42c8336d910b913566d95aa32af2bdd91adf1bfc9999ef1d8dc0cfd5806f3404afa60317b365e7e565f0cde63118b83a32f6f9b6c6ae81285f6049b926a27ca12de55a2826cec9847248d0ab8d80e75a02d741c01759021f838c7cb1ad91eb22e44b6c91ebe99045bb6c5e26c6a882818f45d5caa539a856ea237b5c666b8f062844cfb70dd10d11e705b69c1b21e4cb6d911ba3787485653c6a8280afb4046eaa033eca4d2ecc04383f02818fd3010bffbf2a13e05f31e3e311f0d596c027a0a27d8d65d16e86fc6d91adbf9d8890afb5456e8e90afb3453e09215f6f8b7c32cac0c59619d80251bec196f229a8f8dd6859fc5a225bdc64698b56c8164b6c6dd11ad9e2664b5bb44155eb2d39a85adb22f05b7300de0e197ba9adb1db6b901bd476939171cebff95a6f1f6f87e7692e7e7befea18af739fc4f43bfb421aef3e1df68458e074ba37a03cdde312fe32ef6d3a3f8a2836f35e94bd3d4fbc282bde49f977f9a2d7633be8f25df8c91d9914859005501d11f0324be04e0878b92570675404eeb42d02a722e4bb6c914f43c82b6c91bb20e4bb6d914f4771ec9e1cc4b1ae88f6bdb6b4bbe990451c5b9989df89720e80bbeb80c5e8c97d990097c18c7b2043df9f0343f744e678c0d21cbd50f95e6559be7b233b3f6869e73ec8ce0fe5c0ce7d91391eb634473f04bcda12b83fb2f32396763e03d9794d0eec7c2632c7a396e6188080d75a029f85ecfc98a59d07223b3f9e033b9f8dccf184a53906a1c8bfce36f20f46f6783207f61882ecf194a53d8622e0a72d81872173accf81398623f06772003e028d2f3f6b39be3c12f9de065bdf1b85ecb13107f6188d5c6493a58b8c41c0cf59028f45e6d89c03738c43e05b72003e1ef9def396be3701b17e2107ac2722f01773003e09816fcd01f86404be2d07e0e7e8c634c476f691b1ceff624ca3a3e3bf3fd3cd19ea8c75fc6595b91dd17829132fdd8e2d3605b9ffcb96ee3f15e5f3f61ce4f3341db818b27c2513d6213300d3750e748c70a091ff1307faf71ce7d58c87c25ef386c28411fe0d96f05372ba2c1624766492c5afe17eec4cd42678ddb64d300b21bf618b3c1b21bf698b7c2e427ecb16f93c1400dece4100381fd1de694bfb0244fb9d1cd0be10d17ed796f61c34ecf39ee5b0cf5cd49b7ddfb2377b1132f4073930f4c5c81c1f5a9ae312d482fec8b2053d0fd9f9634b3b5f8aecfc490eec7c1932c72e4b73cc47c09f5a022f4076feccd2ce97233b7f9e033b5f81ccb1dbd21c5722e02f2c8117223b7f6969e7ab909dbfca819daf46e6f8dad21cd720d6dfe480f52204fe6d0ec0af453d84ef2c7b08d7e98045676d8f659fe67ac4f87b4bc68b11f00f96c037a076c18fb6ed821b11f24fb6c83721a7db9b03a75b8268efb3a57d3342fed916f91684bcdf16f956e477bf58fadd5204fcab25f06dc816bfd9dae276e4760772e0767720f0df7300be0cd9e40f5b9b2cd7218ba55e7f66928d214bbdee44cde8bf2c9bd177a1019cbf2d0770562023ff636be4bb11f2415be47b5029746276a5f05ee4cee27b7db6eebc1255dfd14c588754dff72173e4599ae37ed4b88b65021cd2b87b00318e5b325e8580f32d811f44a62862698a8710e3a2968c1f46be5c90035f5e8dc08be500fc1114388ac72c03c71a14f74b6462ec90b8ff288afb2533010e89fb6b51dc2f95097048dc7f0c19b9b4ad911f47c8656c919f4065e510cbb2b20eb973d91cb8f39328ee97b38cfb4f217394b734c7d328d855b00c76eb11e3432d193f83802b5a023f8b4c51c9d2141b10e3ca968c37225f3e2c07bebc09811f9e03f0e750e0a8621b3836a3b87f8465dcdf82e2fe919671ff7914f78fb28cfb2f202317da1af945845cd516792b2a2b475b96956dc89dabe5c09d5f4271bfba65dc7f1999a386a539b6a36057d332d8bd8218d7b264fc2a02ae6d09fc1a32451d4b53ec408c8fb164fc3a2a7e756d8bdf1b08b99e2df29ba8fc1d9b83f2f716b2747d4b4bbf8d801b5802ef44e668980373bc83c01be500fc5de4228d6d5de43d547537b1acbadf47557753cbaafb0354751f6759757f88fcee784bbffb0805bb132c83ddc7c82d9ad9bac52788f289969477a162d23c07c5e453047e520ec03f43c63ed9d6d89f23da2d72407b379af73e25939c0c99f7fe42072c3e6cd53213e03cfc72f497c81cad72608eaf502eb6b6cdc5af11ed3639a0fd0da2ddd696f6b78876bb1cd0fe0ef9487b4b1fd983ecd1c1d61edf237b74cc813d7e40e09d7200fe23b249675b9bfc84689f9a03da7b11f8693900df87c0bbe400fc67047e7a0ec0f723f0ae3900ff05b94a375b57f9152177b745fe0d35287b5836280fa006654fcb06e5ef3a60b164bc5726c0214bc6ff40c0bd2d81ff44cdbe3e96cdbebf50dbbaaf65dbfa6f04dccf12f81fe4c8fd6d1df920ea729d61d9e512d3f35aca67da528ee890c546380332a11cb2114e54072c76113b2b13e0905dc4f2902d06dada228690cfb6458e23e441b6c8f90879b02d72111db2a8a686e4a09a2a8ac087e600bc00810fcb01783164f0e1b6062f8e9047d8229740c8236d914ba2523ecab29497429447db522ead4316b1778c65a3a00c021e6b097c08021e67095c16018fb7042e878027580297476e31d1d62d2aa0a031290741e3501db8b7c3be65c3a022627d4e0e5857426d8329966d83ca2817a7dae6e26108799a2df2e1c8a5a75bba74154479862de52310f24c5be42311f22c5be4a310f26c5be4425406cfb52c835511e5f36c291f8d0ae0f99605b01ab2c50596b6a88e6c71a1ad2d6a205bccb1b4454d4479ae2de55a28385f9483e05c1bd1bed896761d847c892df23108799e2d725de4d0975a3a743d44f9325bcac722879e6fe9d0f5912d1658daa201b2c5e5b6b668886c7185a52d1a21ca57da526e8c9017da223741c857d9223745bdb5ab2d7b6bc721cad7d8523e1e515e6449f90444f95a5bcacd90335f67e9cc2722cad7db526eae432ee72617bb178ecaa4a66a80c14fd28037a8eb2623bd9c7f73a79b20723beffb61feb7c4c4ce3113dc6bc3bc5d62c6bb6843d3ec617383ab43558d1d3c5b44145b787bd9dc18137bd9544cd1301d0fb44bcdc928f36fb2cdfc160879892df2293a6431327f732625216408bf258a0ab758468556c816b7dadaa235425e6a8bdc06d5f7b759d6f76d51fbf5f61cb45fdba128798765946c8f0cbdccd6d01d90d72db7f4ba8e08f84e4be04ec8c877591ab93332f20a5b239f8a90efb6453e0d21df638bdc0595c07b2d4be0e9a85e5e99837ab92b02bf2f07e0dd90e7dd6fe979dd75c0a235f1405815ad0a10b53310d0039965550eccd21379ca83969ed20b39f743b6cedd1b213f6c8bdc0721afb645ee8b901fb145ee8790d7d822f747c88fda229f8190d7da229f89901fb3451e800acae39605e52c44f9095bca03516b779d656bf76c44f9495bca8350ac7b2a07b16e30cac2a72db3700862bd3e07ac87a28aeb19cb8a6b1862fd6c0e580f472eb2c1d64546a0fa76638eeadb91c82e9b726097513af0f26ef2b94c72f3780c3c1a15f6cd96857d0ccac92db6393916213f6f8b3c0e19e3054b638c473dd01773d0039d80ecb1d5d61e1311ed6d39a03d09d17ec996f66444fbe51cd03e07816fcf01f81404fe4a0ec0a72283bf6a6bf06908f9355be4e9a8eedd6159f7ce40945fb7a53c1355bc6f5856bcb310e5376d29cf46567ecbd2cae7225bbc6d698bf310e39d968ccf478cdfb1647c0162fcae25e30b915bbc67eb1673902ddeb7b4c55cd454fa20074da58b10f8873900bf18817f9403f04b10f8c739009f875a909f58b6202f45feb7cbd6ff2e43c89fda22cf47c89fd9222f40c5fc73cb627e39a2bcdb96f215a8987f6159ccaf44b6f8d2d2160b912dbeb2b5c555c8165f5bdae26a648b6f2c6d710d2ad7df5a96eb45c814df599ae25a648a3d96a6b80e99e27b4b535c8f4cf183a529162347fed1d6916f405dd99f2cbbb23722ca7b6d29df8428efb3a4bc0451fed996f2cd0879bf2df22d08f9175be45b11f2afb6c84b11f26fb6c8b721e403b6c8b723e4df6d91efd0218bbefc1fb11cec8c8d68ff694b7b3942fecb16f94e84fcb72df25d08f91f5be4151ae406f59cff78cd575b67b44b7f8a7b7e60166bbe0eeac2a776ad9713d7aff54a271fadf5ba1b150171ceb608dc83c0a33900bf17d5457971bbba6825621dcb01ebfb503988c72dcbc1fd88767e0e683f806817b1a5bd0ad12e9a03da0f22da05b6b41fd221577393c5dc73355268a7405f1c85d00fa33186e271fb3186d5c822256c2df2082a8f252dcbe31a44b9942de5475137a774269443ba396b5137a74c26c021dd9cc7902d0eb1b5c5e308b9ac2df21308b99c2df23a64e6f296667e12f972054b5f7e0a011f6a09fc343272455b23af47942b59527e06e55e65cbdc7b168d051c960970c858c00664e4c36d8dbc1119b98aa5913721e0232c819f43b1f348cbd8b919557f47e5a0fadb825ca3d0d2359e47e6a86a698e1790cf1d6deb732f224357cb81a1b7227b54b7b4c736c4ba460e58bf84dca3a6a57bbc8c58d7ca01ebedc8d6b52d6dfd0a625d2707ac5f45b63ec6d2d6afa19057d732e4ed40c0f52c815f47c0c75a02bf8182477ddbe0f126426e608bfc16426e688bfc36426e648bbc132137b6457e072137b1457e17458da69651e33d44f9385bcaefeb90c502d1e3e3b95920fa010a7827e420e07d88c09be500fc2364f4136d8dfe31f293e6967ef209a27c922de55d08f9645be44f11720b5be4cf90994fb134f3e788724b5bcabb510ddecab206ff02d9a2b5a52dbe44b668636b8baf902dda5adae26b44b99d2de56f50aba37d2694435a1ddf22e00e96c0df21bfe868e9177bd05044a74c80438622be476ed1d9d22d7e406e71aaad5bfc888c7c9aa5917f4246ee6269e4bdc8c8a75b1a791f3272575b23ff8c90bbd922ef47c8dd6d917f418ed1c3d2317e45f9d7d332ff7e43b6e8656b8b03c816bd2d6df13ba2dcc796f21fc8ca7d2dadfc27a2dccf96f25fc8cafd2dadfc37a27c862de57f9095cfb4b4f2414479802d65b1a4408b7c962d7244872ce67607c6ede776a33a70e11c675b3a471e623d2807ac633a70e11f832dfd238e580fc901eb7c1d78593739d43d7784065c2ba02e16500465e630cbcc2c8a980fcf11f30294a1232c33b41832c9484b9314d7018b56f7a84c80439ae72510f0684be09208788c25702914fac6da86bed208799c2d7219843cde16f910843cc116b92c429e688b5c0e214fb2452e8fcadf64cbf25701513ec796f2a128164db18c451551e5323507954b25043e2d07e09591b1a7db1afb301d7231373923ce37a7a15d02831f8e6c32330736a9826c32cbd62647a03233dbb2cc1c89ec716e0eec71142a36e759169b42546f9d6f596f55453978816d0e1e8d72f042cb1cac8680e758025747c0732d816b20b7b8c8d22d6a22c6175b32ae854ac925392825b59139e6599aa30e72e64b6d9df91854fe2eb32c7f75510eceb7ccc17a08788125f0b128f72eb7ccbdfa28f7aeb0cdbd06c816575adaa221025e6809dc0819f92a4b233746c0575b02374125e41acb12d214b9c5225bb7380ee5deb596b9773c02bece12f804047cbd257033e4168b2ddde244947b37d8e65e73847ca32df2493a6431bd745326c608995e3a19012fb1046e816c71b3ad2d4e418e718ba563b444ae7caba52bb742b6586a6b8bd6c816b759daa28d0e586ca57c7b26c0215b29b745b6b8c3d616ed10f2325be4f6a822596e5991744094efb4a5dc51872c5acb77c5ed5bcb9d10ed15b6b43b23e4bb6d914f45c8f7d8229f8690efb545ee829057da229f8e42dd7d96a1ae2ba27cbf2de56e08f9015be4ee0879952d720f1db25815f9603c077b6023da0fd9d2ee85683f9c03dabd11edd5b6b4fb20e4476c91fba2e2b2c6b2b8f4fb3feddd077c1455d706f001690a0a6247546c182ba9143b251405418a5d3124012281c424347befbdf75e5e7befd87befbdf7de15bb7e73efec30cf267b935d769fc9397cbcfe7821c9eee4ce7fefccdc72eeb92ee95b7220bd93ebe0b7e6e0e03ba73ab86979dc960e49332d8f5d5ca5be3d07a5ded575f03b7270f0dd5cb5e4ce2c6bc9eeae52df958352efe1fa20efcef2839c98eac066b2f91eff7b6ba62875ca923713d0bea78b655e0e58ca5c07bf3707079fe4ba53dd97ed9daadc55ecfb7350ec0a57057f20cb0a5ee92af5833928f56457057f28cb0a3ec555ea877350eaa92eeb47b2b4ae7295fad11c947a2f97f563595a4f7395faf11c94bada75a77a224777aae9aed23f9983d2cf701dfca91c1cbcc675f0a77370f05ad76df0996c6f837bbb8afd6c0e8a5de73af873393878bdcbe4f96c4d1a521dd90c4ebc90ceb5d9cc28c64c57915fccb6c8b35cd22fe5407ab6ebe02fe7e0e0735c26af646b32d755ec577350ec7d5c4f9dd7b27ceaeceb2af5eb3928f57eaea7ce1b593e75f67795facd1c94fa00d753e7ad1c3d750e7495feed1c94fe2057057f27db0a7eb0ab0ebe9b651d3cc4e5f15e0e3c0e7579bc9fadc761ae237f90ed910f775d371f6679dd1ce1fa083fcaf2233cd265f171b61647b92c3ec9d2e26857adfb3407b5ee1817f46759421feb2af5e73928f5712eeb2fb2b43edec5f165961c27b838beca01c7892e8eafb3e43829d581cd24d037edb39f043ad975f06f7370f0535c07ff2e07073fd57513f93edb9bc869a98e6cb35ea7f34936d3c43edd55e41fb32df219ae23ff94ed91cf741df9e76c8f7c96ebc8bf647be4b35d47fe35db239fe3aa1af3b3ac1ae7ba8afc5bb6453ecf55e4dfb32cf2f9ae22ff916d912f7015f9cf2c8b7ca1abc87f655be48b5c45fe3bcb225fec2af23fd916f912d791ffcdf6c897a63ab2792eff970ec67cf7812f731dd8eb90dd812f4f75601328d3269d033713287345aa039bb64cdb740edc4c5be64a57855b229d0337975bda552dda75c8b25a5ce53a72fb6c8f7cb50ba3439618d7b83ebe8e597e7cd7ba4adc29cb125f97eac0ddfc2f97f40fbc5c9336579343afed3ef4f5ae322f9565996f7095b973d665bed155e62e5996f9a654073621974ba773e066422e6f769578992c4b7c8babc45db32cf1adae1277cbb2c4b7b94abc6c9625bedd55e2ee5996f88e5407363d9ee53a64dfe3b9d355eae5b32cf55dae52af908352dfed2af58a5996fa1e57a957ca41a9e7b94abd7296a5bed7f5105c25db87e07dae22f7c8b2c8f7bb8abc6ab6457ec055e49e5916f9c1540736233dab75c87ea4e72157a957cfb2d40fbb4abd460e4afd88abd4bdb22cf5a3aeeab166b6d5e3315791d7cab2c88fbb8abc76b6457ec255e475b22cf293ae22af9b6d919f7215b97796457eda75835e2f0737e8675ca5cecbb2d4cfa63ab049c7b27e87dca46379ce55f20db22cf9f3aedbc78639b87dbce02af5465996fa4557a937ce41a95f72957a932c4bfdb2eb72ec93ede5f88aabc8f95916f95557910bb22df26bae22176659e4d75d452ecab6c86fb88a5c9c6591df7455e7921c54e7b75ca5ee9b65a9df7695ba5f0e4afd8eabd4fdb32cf5bbaeea3120dbeaf19eabc89b6659e4f75dd09be500fa0357a937cfb2d41fba4abd450e4afd91abd45b6659ea8f5dd563ab6cabc727ae226f9d65913f75157960b645fecc55e4415916f973579107675be42f5c471e92ed91bf741db934db237fe5621eea1f79bd46476e739cfd72ac37d89be055d82d3c83ed3ea7db7f8fb01b819aed3e27fb6f09b6fb1cb1e095a5de2cff3be61563fdbfcd4fabec77eabc4dbc89fe7fe3ec4f2bfc23ceb49b709ae346ef19e2ff5ded1f75aeff778537d47f579937ddfe86e0bdd1c69dc1f6a255767bd1e49f04e52bf2cf7062336751eaff99e999cd3ea3df3ede6e6f1a1e33f9a83bf8efaaf28f93491dfcdaa53e2c95fa960bd4c7f90edb7a83fc1fd5fb3fd8ceffd3e0cdb65b924e4b942eb09c627f32d11be9ffacdc1e68cc02bd3afb8a54c70bbe87af1c683772cde4ccbe719dd9f05467b6a9e3cc26780d7603d92afb77b06dac29f508ff5fc1db8d78e34f62b437c9dbcbd6ad86263f331bcdd678664bda32df299333fad6754623529d51a1e38c5cb6d1794db0afabb3b5d4bc3a7767f09deb0cb6497506833dcf793d05a5adf14b3ed12f7f85ff5ff00999eb26fdeb30f927ee9f65728edfbbce71db54e75849be8f35f89fb4d9e2784ae23e657eb539ab32bf869a4f307dabe6eaf4c2dc797e70398d4ce534a1d5eef7cd0b65eff0a3cb61542a875d880ec3b2ae2fee1a9389c84f2e91ed52890cf4bf9ce0ff7e73fdcfb5cfcc29b63c9549bf1fef17233cb32d78b5dd08bc2af109b77c84dcdd057f769ddfe854e73724e367aeb9878ff67f3263c13336f5d90d4bb45c3867f98beb2cc7a43acb91c47a6dbebbb7fd35e6ac826de0ab12cfee7dfcbf5dcf8d85b99a7f759df5f6a9cefa0421add871f60835f6f599b463c725be1bdc195ab7253bdf253f36957cdf466d8ba8453ed03fd73a2b1338965bbbba2665c436bceb27d1b1323993df5c67322ed599f46f74267835677f2ea98f96c9d9fcee3a9bf1aebb79ea92e11d7ca4bd16eafd3a34d5de979a3b9ff4ce73e1ef737fb8ce6f42aaf31bee7c5a05d74badbd5e822b64e13ebdcc8f9ec9d9fee93adb1d529ded1619d4cda0b59aee2799ebd6e85faef3da319d6b0eef90d95f73a98f96c9d9fced3a9b9d529dcd56695d732df5b232bfe6a29f64726effb8ce6d67d78885fb3ac7f333d78d69ebceb52dab29cdb40b928f91bb3bc9bfae33db25d599addbe8cc1ad7bb68e4a5d2d6a406ff5e999b4fe03f5739774d55ce6dd3aa5dc3fcb2575a73d38209efeba3fd7f97dab69b395c6bdee54d9874ca73de2dd5396f90419f24fc9c66245ae3b91a8768e32af1eea94abc7906cfa5e4724f71f422d2ef736472566d5d67b5c7c28d200db5f7e6e9b6e62ddc584874dde5ea935bc2758e13539d6389f393336dfc49fe8bc2731d69fbf5a5b6bca99e48b97ea6b6739dc79eae7eeec2de275af3ced0de759665a9ce323fed7ec7b016db43b9b8977770957e926b4c39ddf65ca6e55fd83b4247d71994a73a837119dc99831a173d7f82f7a43b5a14e78852279741453a9f6273add74c3fc585bde72de93a83ca74ee15ae9981549f5df633030bff392de53acbc9a9ce72505a77c471fe8b27d9d296d95ad5baadf3ceae339c924effb0b99a9859ff30d7a3f45d5ce73535d5796d96f65d3eb3b3727f5a0b734e4bbbcea96ae147665abae2e27c322fe33abfbdd2b9a764f23c70b7a2f8b3c25d5d67392d9dde18a3459cfe592fecd3a29beb9cab539df34ead7cce6c8d655d1ad353690c4df3d939c2b657643d3fbbbbce7446aa332d4deb8e35ca7f71b57d6e867382ee919fb89ea2cbb9ceb3269d5e6ee367cc607ba64d3f3decb9a6f3fddc3e7d96779d636d3a4f9fa6e718f50b4d39cdeb4ced32f3628d4b3bdeff77adfd7e7a67b77063b02bb8ce6f6fd7f84b73e717b413a237a4ffd4c9eda7b6a2ebacea529dd5ae39ae99aeeb2fd3d7e7d6642597497d3a23d29ca7516e9e2c2bbbceac21d599157b0b1371168e2356f9af1d65dfd1e085710bb9796aace23a8b99aeb67b7667d1f8fe931c8b919b73eae13aa759a9ce699366cf69825fb2ea46e751ea9931dff099dfd27b3329f9aaae92cf4ee7d996fa199e4e5b25ce9e474fd739ce49758e058dce71b06d7b04b11c61df63bcffbd965a19055edf1cb53f5673957f6eaaf2efeca85dee08a5e069967c5d6472cd6513d1b43077f8d55d1efba433be96f9e7d95cf917ee135dc37506fba63a8323167ca2f1c42525d794e4d8cbcccae13ad2783bb71bdedd982345bd5cd2fba592deda6b3c3f3dd7fe2bd3bb5bf83ed7777375675bd37576fba737fbdef4ec5a1a4f89ebccd6729dd901a9ce6cbb8cef79c352dcf332bb8bb1564aaced3af303d31b3f886200331f3fc0f841f74f72f519afe33ad383326909b6f4190711a6c13d2f88720cfaa4cd47590ef17f323311659dc939adeb3aa7835d6df4749e4dcdf963499bfb4433398bdeaeb33824bdf99fd475b0a538c1b8ebdf7aaeb33c349b2b2dbd19a0853bd785fd3cf35c677a986b9c20db18f7b8da8f0bffe9afef32393c95499f66fb6ccdaddf72af4b5bf8b26fe02afb11acbb4cf3e3190b572b37749dc591e9450fa5befe5a5e7f16e795b791eb1c8f5ab8d1a8e0b32b4f391a15ef3cc7c6ae333b3ad599add3ecf583631ea9631c16b6949bb84a794caa520e4bb38ea517f714f7f3ac8feb5c8f4de7aee0aa6b66e4acca8ea1353ffa99abb3c8779dc5710b37835a9a68e1ed68ef094da36ed39b350be32e83f577f56944226772ce05ae733e3e9d11aaa6e73cc29e73a537c7bff22767f4b92ddc7846a1abfc27a42aff862d96df3c8d06dbabaaae9988cea6afc8a4cc45ae329f984e0c49a6e66159b93395c5ae733ac9350eddbce7c2459d85c7c9a4e425ae929f9c4edc66f81ba356d7767685db242fd5387ff459e4eafaedeb2afd29a94adfbbc5bac45b2dd0cf55d2531726e66dbc6756688cb19af5295b4d2de7dc30e3924daf9785ff2cfabbcef0b45467589483b67173f1970bd76a1ce03a87d3539d439ee78aa20dc73b926b5543e2bbb92aeda6aed29e914e3fdabd2ebce511abb8a3bb36739de999a9ce74cd349e7375f6b3c8556b777357f9ce4a55bec6ab6e9bb6764724e64f27db9fa4336a982be92d5c6772767a2da25467b29dff86ed622aff96aef29f93aafcc35bb8cfa61e3f93b31e6b2bd7d99e9bce8cdc042853b66d0f3c562667b0b5eb0ccecb74e545d8eb083f97a6fd26cebd69a0eb0ccecf7e96bbf9b96cf7fc7726e51fe42aff05ae5875f75ca43babc4587b0d053186c94f45f3ddf2c4bc65d3cf6ce13f97c1aef3bad0d52b4ffd2c1f65cf62aa7f2f0ee392aa6d999ab66319e358435c677151aab3e89f618b24184da95ed032094a596effd5605b970dfe816b737636a5aeb3b9d835bb98de6732d88e034f6fa1a4ad391e39d475e697b8ee73e99df940ff9e966a8428f76730cc750697663337d5f2daa478c7f286bbcef2b254673922cdb3cc24ba3ade7a39c275be97a73adfadd2ae97e6eb39ad7c6edbb8ceed8af4c636328d577245632c5ccb685b57e9af74953e93f5cf99b48d1626fe67a4abf4ff4b676426557e8a603420f7990a47b94a7a95abefb6f071b115760cbb36f1aaedbcdce63ad8ce752657bb668652b71eb9dea35da5bc265529d76fd61be7af58e51de32aefb5e9abe2c81da794dbbb4a795daa52aedbe2738b55ceb1ae725e9f4e399bf6f7b22f6747ffbf366d3afbff2cb59f5530b25a63dfd3e01fa7cfc6fe8fecfd35a8739b2ce8f96c92d4f789be6f7ebf1903377730137119c4086de4f56ae10837f8041dda7ac1ffd66b63f8cccddc2cd26933b99144f0ce6a7be428dac5e4e5353df7201ec4b43336f1eff755f65d7bfafabbfaffb57416a9e249cd77539d5dcbe7b4bbff9f7995c97a576e7b4da6fd33c9af031d1367141ecb973613238bdc99de683ed561894fb56d1f13d06267e216a636b55c8a9bcc6f5b22751d5aa9892c5e1da9ca1e1c207c4eb5315be7990b2cdffeff04ffa81589c9f8ededf56afe54246eca2dfe6ebc9653fdee8ded01c2556a2d1e0e07a0521d6e155be18220953a2f186cd8afdaf33ab66f9b6f3e939b99705d2c9cb9174cf32a17ccefd7d9cf5403d42b2322a85b98506677a7b0b164868c6abd20dc6394ff968a74ce4e0056ff8111d6ad4cac656dad8aee6233bc20b37c8d3de488446f4003d9ef9d23b2db98643d93ee608de9f08e36dc763d2aec63c74cb216aa806cd72782bc9d09b9345ca8c3ed7dacc25eb065fedf7355503db14b447507fb9e367141d750e79372b77d23ac3b9958ab5a2cf37c0c72ae0f4eccb999ba66e60ae6daf169b58f867111e35dfc06c768cb5865796aecc08f198ed40075d8f911d4dd321f08052a20f7eb1d41de135fdf2058da3ad0bfcf55d80edb288b57662fe33a15709f8c89e0e631e1ba7ac99daa19b60853127d592d5c8ff488b8ee8da32b65de3225519fcc21b4dcd9e6954550f731a1ba25353bc2bfab13f54a4fd3e3acfd22b0fbf9dda9e43bd838ff0da62066a069a89aeed490e111d9034cb2a52c5978f9454d0d0d48a71d17213dc84432fb5c865da5c69df32854c6f40734b0edd725627b887dff4adeb3265ae9382ed10fd000d6e9d608ec61265877b87fd57bbac7d0f68331b447f8cd89e49b7eb04be3341550159511d4a3fce6c438bb00b9d62e499e635bf815de2c2f4cf1a401cc8331ffc798601d2c98797b1047a70167e4d611cee371ddabc2cb2e0a541967d11a94d4a8d39e89d09e60a2ade885833a51c73ad8a7d0ac1330e312385aa6a33931e7aa08ef49fe8d3e482a68ee554140b29e66c449f747504ff187ab4d2d339dec32fb24c47aa501ab17f4199f6662999dbca3745a2654bad6bed8048e44cdd57a9faf4ac9f8c41bf00878863ff2ea1ae98fc6fac3d9a5a87759af02f2879d23c867650e6117a9807c608308f2b9b81b25e33c93e529786468ea407d531aa13dcf44ebe4054108f5b600c156a61a80fa5f1701bdc004ea688166c265a881e72018b57891dfdc082f3a7c08e819a27e614884f5521c58058ab10e823bd3cbfc0b4f5b3bff3ce079853fef38da469846cf386d2dfd17ae88b85e65073c358ea8d015f0547d4244f51a7ba830ec14690e01c8db36027b9ddd8b6caee13932d17030f7301d756da36111dd1b71d5b5e8c2d457d73ed926027b33eef88930384003d43b7b46506ff1e7b6c3a0395d73dbf3f68990de8e2b5e5feb40cdb53050f30e136be5166ef34153d520cef4c2754e1a00ef849bfdbbfce76494d837782a46f50d3175d4bd4eb0b0e63d766b3fbc50f5069ff487e093f7e36eed07b3925aa6729f3925a2fa803f6a9adca0d01a7632677284f6213f5adad4afb0ed352931d5b68bbded572616236b69be8ed93582fb8809d739c58519641ad6c0f4c8e911d3c7fcfb57e3567e99dd6c48c7a5387c5244f549dc61735a9bb22bc39ab64fe35eeda1b9fb5d0d433d9ff1ef5fe68e556f9baa95aad6e99a2c1821d3e7fc8bd23c0987d85fed4a2ba801ed91eb23b42fe21edad114cbfa454504f5251fca3452831453a67e85b77c0d50b57b45505fc5dd0d2af54ca6d81a2537f6476021e9d74caa55bc54c91830fa466b7c6ba7e723c26fd80b655aea14cd51f3ac1cbf47c4f62dff220ddb62e6aea66df1685ed788ea3bfe9cf760db3cd59b8de7b04111d7f7fc567e8dbd2083756bee04cf2ae06e89e07ee067b17007356dbf604ddb504b59bde04ea781f1efa911e38ffcced2e005eb8baa55b5d26e9c1631fdc49fa90cfb91a6b655aaa94bfb8d8d907e66d7a56802a41e2e410d4c6f6c1531fd12770c34ee1a1ee691d780d6737a84f62b7f6d64325a78a7d234fdf1405504369fbf922d79a4a271d769a0dfe734bf444be0e641f054fc2dae90a7c66b8e340df7ccd9da80756cdfe8e0439b1c7cb0b770f95f33537667aa35bd06d3f30c99cd6cb9393664ae3503a3e24afe3b669ecd6b66e8392fcd549279698411e46590ef22af85be6b5e1ac991f2b24ae195cdbb8bb27a7761e21349dd26c96bb27c3c2fadeb3e2fc31589796d5acab89a97765e89bc34bad7796d5a5aef11bdc2b5c8212f45647f5eca864baac55b791946dbe62d54d8565e9ad984f2328c69ca6bd35c2ae1bcb4c261f3d20ad0cecb688e2ff5abddc7767559f2b24800995c97534de1e665b5e834f59590fa95cda747cdcb28fe232f8381d1a87ea48aef4dfd53f378a9b1f782e6a30652bf3bbaf334974a252fed30a1bc8c1b8779590cb7e4a5d5760fcf2df58c515e33e314e1f19bcf9bd2f8ea693eb37aea7b5daa4e5a9e338839bccbbab3d286af70270208cfadf9147379ce2461792daca949fdf3280a2faf9960a0f0134b9d0135f591a389adbc341647e5659c8e232fe55ad9bcb4e7baf3321a8fcd4b2b8156f82cc5e5a9a15dea5c19a96b5faab9adbc859c138b36e4c04676b49146bed990e38fffe77b65e49bbd32fe34085fb50f10829ee75fcc9ee7ea894fbeca9ef60caf3ad1266fbae954705ab589a7d30cfb1cecdbb83c3d9b9467ac5f156678e16e8461ef3355c9964cea9fce4fe76417a68ffaf61251a7fe6ffedc67705155d81b4ef20e71b5f6a6675e4c43ecc3421cdb3642fc278e0516583ff180c9db8a4df4fa37cd80913bce15589c5bb78b38ff95c4394025e78ec0f99f24ce02959c43e08e6936d812c359a892732e70b691c459a492f322e06c2b89b35825e74bc0b98424ce12959cff02673b499c7d55722e0f4ff6f69238fba9e4dc08383b3039cd8051b9ed03995f6d8a9932bb51eec8fab2c8d6f222b28e71d4c029ce3a88c5374d75626fbc0b8bf39136116727499cfd5572de009c4b4ae22c51c93916389792c459ac92b31f707696c4d94f25e759c0d94512675f959cb3817369499c052a39ef8286d23292388b54722e09b5b3ab24ce42959c9f40edecc6e45cc96bbe2389519b06b31f0fb3431b12e6e7d08d5c561226b166d2303f01ccee92304b14623e0798cb49c22c5688f914602e2f099338f446c37c043057908459a810f33ec05c511266931da515609e0a982b49c2cc5788791260ae2c09738042cc1f0173154998fd15627e0b983d5a13735ce25066328d7c99d3e2e166b48f30579584497c00d1306b00b3a7244c62d38886590798ab49c22436da6998b30073754998c4ee240d733660ae21099338d041c3dc17307b49c2240ec1d1300f04cc3525611207876998c702e65a9230898d761ae60980b9b6244c62779286f92060aec3c45cb105cce4c95ee2e3a7078bb216c25cd7954259a492f207a0ec2d8592da28a251de0994eb49a12c5149b912dc2bf3a45016aba4ac8681b7f5a550f655497917d4ca0d9894ab2428abfd171946f3d20adbf4496e1445079dc81cc7ecc802ed0ca01b3241833c13f55e908120756e1c1adfda2cbe815ec4b711932f4c78d4cfff53e9cdf2823515a6c086718e17d3fa72da85bd1444bb6dcc840cb2824cb5f95fc6d9ac38266785797b98878786475bd55306b57013265e982acd1d2a88136503bd3a5b1fe7da5e0e8db51b8bf50d60edc3af9341e288200350415c17346db67125b8a0f3d98d9ec98d5242e14365b4bd5bd6d943a648e2aae0213318ea610193d2e4eb99697f38d61ea0ccabb5476eb20341eed07ab2d03604b4427ec326b878ab1699e7f11fc057c4e4ebe135edb3042996c67943bc6dbd41894c6dc1f78245a4d43c44b485a43f4037b0388e80fe722fc891d5d06cafc52c36214e33d07a2eb32023518924ce7e2a390f07cebe92388b55720e05ce7e92384b54725602677f499cd4295a1ae786c039401267914acebec0b9a924ce7c959c6f41d77133499c052a399784dab9b924cefe2a39cf07ce2d24710e50c97923706ed99a93638d39f551e6c1ecf756fc9a99bcdbc5446f9ae51d9418820b0e66764830b9d49becf6a660547d5d2fe2dc9ac9192432afb6031d0df650668accb14b978230ab5d016e20130e771929b343bc310dbb2dc11a35ff1de80631e9bad8a3d525329e9ba4fa5312b33a53145eaa5b01dbe038666afa367a94c450e77ab3f0d680c7c690b82ed7998981dc582e57da906e09f4544a9974e1de22aeb6e020ffdfe65fd4860bad065e0e97efd0d6640ccf94cad889f5f0f8101887c57121e72f32cfdd77806e781c61f6e975eaa859ff68fd900e70571c21095363ff7869c0dc4612267105220db31d606e2b0993188b4bc36c0f9823256112576dd330db02e6284998c455db34cc2500733b49981a23c4bf85a6d16849981a8768bf07cc319230896b636998cbc065bebd244ce2da581ae6728039b675e7618243050b8d35e606daae5d44392e8e454a99e495265ee8b4dcbd93608e70bc3450e2c54e03dd0b4027480325762c69a0bb03e80ed240899d4b1ae81e00baa334508df9cf2702e84ed24089037334d03200dd591a28b1d94403dd01407791064aec6cd2407704d05da5811207e968a0bb02e86ed24089037534d0dd0074f73896cf9bd0837a2f5a1c1a4df8ea5eaeb715f4def7886bea77d188e1e80374135b73e02339c7b4c6dce7c51049b4671c711ce6728eb261843f8ea946d286e2bef222c6b2382ee6a245e662fe0e2ee649ad9b09030f1853268c792cd64a602d97b3e6a150694cc70a709fac90c4a97335631be0ac94c4a973356367e09c2c8953e76ac6cfa18f334512a7ced58cbf01e7d438fae0aee7fb20ffad357696b2ccff69b0008f3817445b3b71366400ac92064a9cada4819e05a07b490325b63e69a07300749a3450623f9d063a1340aba58112c73169a04702e87469a0c491761ae861003a431a28713e9d067a3a80d6480325467cd0404f05d05a69a0c4863d0df44c00dd5b1a2831e283067a0680d6c5318c5cb8c80c23bf0ee39df54cba307968302f6932519b03699f8d3cd38bf81ae298524b6fc843e3ea8b1aa09c29ebae488d73a7dd15bf681781ce9206aa71b8e333009d2d0d54e370c76b003a471aa8c6e18e570174ae34508dc31d6f02e83ed240350e77bc0ea0fb4a03d538dcf10180ee270d54e370c7bb00babf34508dc31d1f03e801d240350e777c08a007c631dc51b2c80c77bc0bc31d0731e9c2cdb74c7dabb09bcc94f97fcfb58709863ef4d5bb9dbc08ef60269ed99d67aabd482bece55a67c30aa7301b3cb4adb53a01da21ad81a6713fb28e807668eb0eab0587d2bb44ff46a03cac3583fe87786631caa40425b13378463b12e55bf0dc3d3c8ee76ef122f3dc2d86e7ee114cbaee5e34cd30dd0b378d9ce2e95f2b711b5cc8473209cd1a38f34bcd9be67a61726e73f13628bcff6d0d6c47c5b14e22d35512d4fde769eb24de85d0e9a325b216a8643d12588f613f62eaed5b2aedb7867ac9fb8aeaeb9dac0a17fab1713c9dfb2d324fe77b81eeb83802f7d31da1e9af727c6604b4138f97c4a933ba6717e03c411267814ace6de11173a224ce42959c0700e74992388b5472de049c274be2d43955f011709e2289b34425673b78149d2a89939aa98dc6b91a709e2689b39f4ace42e03c9d3dd5106ea935cd3faf323bd160468cf48d0fade1456867b4e6544354f46003561a252d18ba3b0cf29e19472cb9a1aaf0ccae8bc1984f2cbd705a4d5c1dd67b9f15c70046df456600e35fa8796733e9566ae141929cd98a9a778096dbea40788c9c230993f84ca661ee0798e74ac2248e8ed330f701ccf3246112e31c6998b301f37c4998c4d0001ae624c0bc40122631648a86391a302f9484496c94d3308703e645923035a6fd1c0298174bc224ae4fa4611e0f989748c224ae4da4611e039897b6266672c424f532a7f5c49f05cccb2461121f4034ccb701f3724998c4a6110df31dc0bc421226b1d14ec31c076943ae948449ec4ed2307702ccff49c2240e74d0307707ccab24611287e068987b02e6d592308983c334cc32c0bc461226b1d14ec3ac04cc6b256112bb9334cc2ac0bcae35173a254fe4125b99b489dce9103574bd14ca2295945f00e50d52280b55529e0494374aa12c5149793574236f9242494d6843a35c09286f964249dd74904679323cc16f6152f6485056fb2f328c337c090358e1cd69069538924923bd1c6ae7ad712cd373ef1285a3ecb8508f38d841cb4fd015e28d6e6bcd8b1e0f3791d96ca72d6b3e0f9eeab7b3973527e7c718ecd52434686ccbb0d8cc2143b63be2b857620ddcc1f718ec1f6888b7ad37c87fa1df934d7c6f82178413126b222d88f02678fcdcd9baf74a2c3ede2b898fa047da9258674258eb5d4cd6d513ac0dfe655ee5bf74e2823a596143aec3bf07f92f36378259feab82fd71c99dcb9eac1a7b2fd0de2d9596dad9a4d17e014ff87ba4d252479768b4e5403b8f49bba4e7d917985f6cf6cd1deabf88f8acefcd025b119ef5f732c156b575d124ab33c73369ea46f92f362b2c267ad36c2d1d9458f3131cd2809ad517150a51f300f53ef66229b3e5c15cff0de5de48ff8506b09289465b61b63da0dddfbafd1e9cb0d038f7f330f4cc1f8863ee27bdd626b5e9de85857932d4cb072561126b260df340c07c48122631928386390b301f9684491c76a361d603e623923089911c34cc7d00f3514998c418231ae61cc07c4c122631629886590d988f4bc2240ebfd130a701e61392308911c334cc3ac07c521226711c8886391d309f6262f6f23299c218e305e924820ceab5febba8cff72a16ef30e8603e1d475d2df7522736699c5c47e3c65a7b415d7d4612a6c66ddfee04cc67e3c81393efff996513dccef4624b044ee3eb01e3e7cf31f9966fb12eceb5ffa23e7e6803c0c701e3f3fc0160336f6346d26b6033187d756f0fb8745f60a28579fccda53bdd5b94f2f83700e18badf928c1c3917303d330af878bf8254998c416230df326c07c59122671ac9286793560be220993388a4ec3bc06305f9584496cf8d030ff0798af49c2248e08d130af02ccd72561127bd934cc2b00f30d4998c45e360df34ac07c531226714e9c86791b60be25095363c8ff1d80f9761c03bfe13a1f130458e6055b108eb40369b58be058654f18f87d87c91b6655cfb7131595b6ae9ae256598d32fba67d3c13e9665e156c29a78ff3192fe27c97c9b986e79aa6482fcc9a782ba0c502bf0775f53dc9b8c487160df70dc07d5f322eb17945c33d01703f908c4b7c84d1708f05dc0f25e312bbac34dc5b00f723c9b81a17b79c0cb81f4bc6250e03d2701f05dc4f24e31207ac69b80f01eea7927189532b34dc6700f733c9b8c449401aee1380fb391377152f793cc1bcd1cce937973544e3464e3f414e862fa4816a4cc3b23f807e19c7f0210ec90cb7235a15fe6d208c40a9573d20732a0c1f7ec5c4ece435ce1852cfe3a2e5aa69ef455c5fc7b1927de11e3d1a9fea6bc383e79bd6cd188207c48c21c4e7f93c16eb6170817f1bc700767a932da659af71ee6a4578f87c2789933aaa4ae36c0b9cdf4be22c52c9d905387f90c499af92f30b4809f4a3244e6a866e1ae7efc0f913933348b356ef055942a2a6ba398c89756ef05f6a9aebb3ed21cca6cb81118d9496f862b41791fecc245dc74bee5c9acc35c66196ffc37091977963d3babb284401ac0e6dd35f98cc26c5a1f9a5b55e9032a831ad3eba35a186fecaa45bdaf3165cf243edafdfdbae50325f135787d02eedbe00373f8eae66befdfff0efa189f1a3e1497df61130a6441ff4a08d20fd08b4bfc5917929bde7bac660f2fd81f277f69d31180e19e71bd4db27b9f96a174b4b7c76d3ee8c9380ee8f3806865dc31d4d97c1f663c63fd140b7819cb37f4a032536d869a02300f42f69a01a176b6f0aa07f4b03d5d8301f00a0ff480325c633d140b706d07fa58112639868a05b00e87fd240892d4e1ae81000f53a090325c62ad1400703681b69a0c4994c1ae870006d2b0d94388749031d0aa04b3041bbfa5fd4da5f1bcea6fb97879d5337df33c5d6378e54e94578ed9878cbd9da1884c744a3efa912a0d31069f96d8e8559f4f64cc430e4301c672f4faa7de18e30ee31248d2b95bf84d1f50efc1a1a8c70d6dad0ad60755d8dbd3bc692098776998f81c9b58e4cc4302a2e9de01993b35b63be91cfe081d34912a6c614191f01e692923035a6c8f80430979284a9f1c1f31e60769684a93145c60780d98589d9f2a45a70a8603b13620792f62c7f129ee54b33299b6ee358bf20e980be6ea2399b906d19265baae0ec0909b6b95ea93d4c959d951cec1f64ba6d6bce4834e1a9b9bae7b3682f85c0c2ae4cda20cb6c55027388fdf595f600510a0c7d35b31c6a663726df52fe17a6873dc9179862df5c660f4523a32d07d802c89665df036bbd284df9382f584551ce645b9bc5b63cb07567b2aded250f544429794bed808579e360cb6a8ab568ad406b034d9de598c8615c70fadb8d69dc08e23e185c5b5e1227b58b48e3bc0c385790c459a292731be05c511267b14ace7ce05c491227355e83c6792270ae2c89b3af4ace32e05c451267814aceff7911670f499c452a39ff01ce552571527377d138df02ce9eec380d330234c6ce3936f86f4f1ed228f3c259c8b1b66833fdef1307e0cc2a510ae85d306eb95a9cb3e4c118d12cfbffe162bee6068589d368b441e1fda1d3b9ba645ce2e4050d771ae0ae211997385c42c3ddb45d84db4beeb83c7185066d5cbe2bd0aec98e8c9b681b4ec9c09af77eeb09931a6b31f1564dbb5e8ef6dfbc97ff77b9479e297a9ed506f81350d796884a7cf6d350ff00d47524a2129ff934d45980baae4454e2b39e863a13507bb7661448f2e00931ea9d36cb7410f4a6d68b8332559ec3687f4dcd590ecf8461bd3c26658f1497ba7b77ec309c9b78f7eccb223d115a9eeb33498b525ce8c9991083c6fc74fbefe0444c6f6ab2cd51630a9b9ceca7d4f6b6ccabc6dbb66b58e38977db27db903e84a3a05e6fc0fc105648eb6e6beeb3d4da4c0b9b5806eeb51b4a8124d6481a646780dc480a24b1c94f83ec0a901bc731d6ef0ea7c5d86403aa7111420d706e228993baaa9dc6b91f70f691c459ac92732be0cc97c459a2927367e02c90c449dd8687c6d903380b257116a9e4cc07ce22499cf92a39ef863e50b124ce02959c3f006789244e9d8b5f4f838bbdaf24ce012a392f05ce7e4c4eb35d49b490c6ec6f3c85c7455b44b3b91771f58f6308d9152e965cfb88a3f1b49a77324c6c0c882388a1e9c29a45353e64140c256fcaa43529a28315490d49ab94c859693664c1f580cb7b33490f97beccfcb1b44b7c0e3c5c3697c4494dc7cbbb6302e71692388b55728e02ce2d257196a8e49c029c5b49e22c54c9b931706e2d89b34825677fe01c2889335f25e76730a831481267814ace2e503b074be2ecaf92f322e01c228973804ace7b80b3348e9e7a8337d533db332dfa3baf4f05daa152690b54d21e028fa86171e4a24bbf2fafef16709c17610e978449ac9934cce3017384244c8d99658f06cc6d24616adc7cec18c0dc5612a6c6a9b5230173a4244c8d697a8f02cc51923035a6e93d1c30b79384a9314def1180395a12a6c61dad4f00cc31923035f6db4f04ccede3583a609606542e580d640a1c6d6d1bc3ba76dac2c12ed0951ccb4fd61b2c1c8c826562e2a3f5c40f827a382e8e9c0af976a023386a4c789dda90f0de03bcf1ad1b718461311ab3c0dfd02ea29c10c7fdb06411bd1f7682fbe10e71ecc79649523f62b3879638ad270c03ef280d94d8f4a181ae06a03b4903250eb3d1409705d09da5811287da68a0cb03e82ed24089531434d09500745769a0c4e6120d746500dd4d1a2871d88d06ba0480ee2e0d9438f446036d0fa07b4803254e59d0403b00e84469a01a33227703d03d2581162a055d0b560d954903d578c9af09a093a4816a7c28f500d07269a01a9b4df3e11e5ac104ede9252f1434092467dbd56c81c8a2b5e7d6b7504f2b99acbdbc4c52f88df1a29de306fa25a8e2f256b178d706dec9ec3598612ac9c916b761c1b955f0e0dab3e0ccff42b829ad39e1919c3b96d883efc09a3bda18263ca6c6919037bc73d6f83571b2bda89bdf4b58e3e2eabd6167832a398b0b0abd6295b148cbc07d722f499c252a395706ce6992380b5572fe096dcf6a499cd4a63c8db31dd4cee99238f355723e01b57386244e9d61b1df00674d1c7b1635ed11a5b71c8b38234f0b023b0adaa2b5927189f12334dcfd01776fc9b8c4013d1aee48c0ad938c4bbce7d27007016ebd645ce264090d7757c06d908c4b9c38a1e18e05dc99927189d15134dc99803b4b322e31968f86bb27e0ce968cab31edc0be803b47322e31c68f863b1770e7327197f4bfa84d9a89aa63e6aba5cd428df722b07de2de293693e42dfaeae2e63096b56f1cf3fcb89bdc385fa3d6abb56f6a307d14ff5fe5deb40513811af794eb09ab4af68b63342bdffeff60ffdb333cb375d9342fd8c778863d5c8dadc37a393702cefd999ccb26380bfc3f33ed8b8203c4b4ca89361cb8220c071e10c7aa4f03681688058f9d98f868f3a4f7c3a3e7c038e24bc2c9e7727b419bc2ccb2ff327b16260f570ff20f5663a7a0cdcfa9d3d0b4cbfb67680a1dc4e4ed6e79c32cdf3b7861f2f431fe9f7aafca9a987ba6be1a3a016ae8c1721b471a47fb3781da79486b06f10cb18c9312f126c4defa19ed48941321dee45026e5325e738164f53cbaa558b5b02d5ce087c5914dc4550b93e7474b54a666b919eae1e1923035a666b915308f9084a93139e5f58079a4244c8dc9296f04cca324616a4c4e7935601e2d09536372ca6b01f31849981a93535e0498c74ac2d4989cf24ac03c4e12a6c628bcf300f37849981a93535e009827c4b1762e1d4c3399569718e3a46ee03c8fc57a1fccfd9c2891951a524363ad02d693e2183572c533272f9cd5b86876aa17519e1cc7e445b137d18eb757fb12b1655deccde2bb14f84e897b687882ff7795fd1da5f630e667c1cce4743be56bbe0ad623136be67c166d095ce4a7326957f392e7856a1b4d582c6a0b131f8731f7d3a4c2121b5134d85da011757a1c8109aea77de379cbfe4c4edacce5e6504fcf90c4394025e704e03c53122775b5078d730b783c9d2589b35025e76ce03c5b122735b9108df31ce03c471267b14acec781f35c499cd4d1261ae7afc0799e24cebe2a39bbc093fd7c499cfd5472ae0f9c17c4c1996e62b6012a33823f00f1c5174ae2ecaf92f35ae0bc48122775e69dc6391a382f96c459ac92b310382f91c4d94f25e7e9c079a924cebe2a396702e7659238a9eb83699c577b11e7e59238756e9df22f705e2189b35025e707c079257fdd65bd7f08b386285af852eacdb1bfa1dc1eb8c24ed255f8e71d08e99bde1803a0ff6bcd809be484abc5ccf0595acad5c930577495244c6260370d730fc0bc5a1226317c9686b933605e230993f810a2610e04cc6b256112c36769985b02e675923089317434ccfe8079bd244ce290310db310306f9084498c4fa2611600e68d9230890b086998fb01e64d9230894b5b69987b01e6cdadb95a3d79ec88d8ffa1ed2a73304c01df228592baff268df217a0bc550a65a14aca9781f2362994d4f5c134ca55e15e79bb144aea58118db2160212ee9042d95725e5d3502bef8c6341967b8c1d1b44b8248bd833efc662fdce8b58ef8a3b9969facb60a8d36cb4853097429dbd5b322e71b493867b19e0de231957e312ae65e1c1354f322e71cc8986db1d70ef958c4b1c1da5e12e07b8f749c625b61668b8ab02eefd4cdc1e2970dd3bca4eb087a126ffebcb22bd17481f90b3c3570137a29e960e633aa4f47d50122735a29ec6b90f703e2489933adb44e3dc12381f96c4a933f7cd04e07c4412277525278d7315e07c5412277525278db30f703e2689335f25e75d1002feb8244e6a2794c6f92d703e2189939af282c6792a5cec4f4ae2a4a6bca0715e029c4fc5b9b584e95406b42621bae9b9cf4cf4d85dd329c4e13dda64cab5d0e97c3a8ec914dcd928d856a2c1163b48295466dfbc8f6762ed356fc8f3ac17b13ec3645dceffa2cc3ffb06ff2543fd7f55f92f9be4ff6d36881aef7f6fa0b783cf6c7638d287580c88cfb6e69c69f29d5463d6da4a088a788e49d9d5ffc22c9d996c6b65b5ffe6ed6d924073c060704edfc05c3ed4c3e7e388bf339b434db5f9172a3c9389a1ce16dab0cef162cab6487be078d0da7c815d13a39ddfa24b3b063cde6eae80f722136fd51477c49647dda9fd1fdae57d1b4c1fbf241195d8aea4a1de02a82ff373d2d67bc1cacdd1de6c3bb556e7377acc03a8deb624f5357db68347ce2b71e4a46df01f3855fe4b33d9ac8cba449b760ffd0e3a94af4aa5a52ed7a6d12e07b4af49a5d5b98f7b153cf95f67d22eed7f5167cf7e90ffffa63b59e10df74c4eb0691e715f38da9d7439b893bec1df3b3368bc4fb78df7323bd011dbe6b8bc6deea1eebd1947ff27bd11cdbe2a3730db0930df9284a97103b33d00f36d49981a37301b0398ef48c2d4b881d904c07c5712a6c60dcc4602e67b9230350e058f02ccf725616adcc06c38607e200953e354efb680f9a1244c8d5b384f02cc8f24616adcc2b902303f6edd99c8e050c1063bc467392d035d19041c7cc24fe99759fe4ee2854ecb91b8290cba7d2a0d9478b1d3403703d0cfa4816acce2b92e807e2e0d94d8b9a481ae07a05f4803250ecad140f300f44b69a0c481391ae80600fa9534508d7bbcae01a05f4b0325763669a06b02e837d240890d7b1ae85a00faad3450e2401d0d741d00fd2e8e48b97ef147cad1a67d7b41c0ebf7add9634fce99a831cbec40a0fc8149d9c552ceb651ec0dde50fb42734013d8a5af06eee8456c3fb66e9a2a3c604c69aae6b158a7c150dc4f7296571572bb92b491cde5e0e2fe591267a14aceffe099fd8b24ce22959c4b42edfc551267be4ace97a076ce97c449cd3b47e3fc05387f638716868bfc82629ab0c21976b5a459e0a7b791d41f1a49bfc7d1c729b4d199357631554c7199bd5978d700de1ffc3516c1522a7390327ba098f86875ef416849fe29a78ba8718782fe30a9fb179372432f79917eb90dea37c530458e56ff34b7b06a8cff4ed3ff31af1be897abcaa32eddaf62d5dfbe80fe771c036eb8747fa0af51e1995515a39ac4ba9317edd3e2dc77851bc23f712c5fc11b42260b58f4d1f68386fcbf71dc6bd36d79ea6b75ce85a7fe7f710476e1655fead7c4e05e3bd88b12a2d02f79da6af42980e92d19c33dd4d50618e499255626accbdc4d830110e24389d6a8fa12d6fdb691046a52f1119b5634d01be129df561a28315e8e067a1d802e210d94f86ca7815e00a0eda4816abc879e0fa0eda58112e78c68a01703680769a0c436280df42200ed280d9438944c03bd14403b490325c61cd3402f01d025a58112233a69a0d700e852d2408931c734d0ab00b4731ca0d19869cba94c890f255a5ffe011863ea220d94d86ca2817e06a04b4b03d5986cf702005d461a28b1eb4903bd0140bb32414d6862e582b1cf91fe0ba724e2eda6287cf46ce9456cdd986ca9321eba663e313091f8f8a1ed9fb913d4c56525a26adc94743740ed2e1195f818a2a18e01d4e524a2121f4534d4f180babc4454621f89867a14a0ae201195d893a7a11e07a82b4a44258e37d1500f02d49524a212474569a88701eaca125189f39f34d44f007515266acba138c1a1f4e6b279c08b287bc441e9aa9f436cff7e528292d87c3aa31dab4d0aa3a1ab322997f1a2a8a6c95e9517c42f690e03df0ec2167b32e9c2551de98eccf7571970330e6ae26a923807a8e4ac00ced5257116a8e49c084fef352471ea8cae3b0b387b49e22c52c9f91070ae2989939a898ec6f90d70ae2589b34425e752f0285a5b122735292a8d731de05c4712673f959cfd80735d26a7d9e125798b46339f69360cd5b957568117c1f566c22deb455dc799f645c10162ea40d25614758275eceb3101c31545ae0b190f3791bbbc8086f90f3cb3f324616accbbbd25dc13d79784a971e7a157a1666e200953e3ce437f03e686923035ee3cf402606e24095363569a5700736349981a175b3f0b989b48c2d4b8f3d07380d94712a6c69d879e00cc7c49981a771e7a1a300b98983d33c04c0e8825369268b93aff02d64289ac052a598f05d62226eb1a295827f87f57d9df516a0f637e56e90d4bbc25399515f121f50c0bf72ec02d968c4b6c4ed170ff07b8259271890f311aee2980db57322eb1b945c3dd1b70fb49c625f6ff69b84f016eff38da09e1bab86014bfb964811312af20d6d9be2cd6c360f474009335553ebbd47576b07f90e9fe6fadb15f050b1289832cf359b48f428ddd943d59172d3c1ce2ff3dc9b7989258824883a3250234e19721dc6692268dfbab4c7331102ef1cd25710e50c9b913706e2189b34025e708b84b6e298953674e9b7d80732b499c452a392f03cead2571527779a571be019c03257196a8e4f4e051344812675f959cab00e760499cfd5472f601ce214cce0efe17d5aac3137b791155696baeb78c8a6eda931a13523540a0e2502665772f8af4349b4598c3980d76e6c615eb49231cd226221cd69ad3c68d678a881371b46d4fd68564e7c3256112c31369986b00e6084998c4f1491ae68a80b98d244c62638786b924606e2b0993f80ca761b603cc919230356ecdfc2f34c34749c224ce9fd330ff04cced246112e71e6998f30173b4244c8ddbeb6d0cf7cc319230890bb468987980b93d1373ed1498e9ce8a639022b1c69a84c414e4df603078ac0664624da621bf05c8e33420135b0534e4d1803c5e0332b1b540432e05e4091a90893d2f1af28180bc830664628f8c863c169077d4804c1cdda2215f02c83b6940268e7ad1900f01e49d352013671068c88f00f22e1a9089330b34e45b0079d7d65d2a191c2a48d34a1dd8a1e5bc7d18bacfbb49c224762e6898cf03e6ee92303566637e1130f7908449ec2cd030df04cc899230894d291ae6db80b9a7244c62e39f86f93e609649c224368d68981f02e6a4d6cc609f1c9c46bcc869915535d0ca2c974249bd5fd228bf03ca0a2994d4352334ca2b81b2520a2535229f46d91eee9593a55052d78ad028074374c0142994d4850d34ca3ba0564e656f816a120657f83facf146d9e50b65fe5b2bfd37d0d868eb904d2edf90ad2a8e9403539c757051dab06f05082fdf2b8ef1cc30938379b1797bad672253c2dc0d15761433fc7b90ffc6a9fe0166d91a6c723f5027f26875f74d78a64fd3804c1c4da2213f0cc8d51a9089e39f34e49b0179ba0664e2883d0df962409e21a5b145dd7d89d6d83a1a286ba45052635a69949da00b502b85929a259f46f901d4cabda55052b708a251ae07bda93a2994d4cdab6894757081d7b7e6bae7d8920fd242d6db40afaa8149d92345ad6c39371e31f086961b6f33b8d067c6b194dc5cc853eda049859d318a6ddb205a0ebc9fbd8870561c29355c17381eceb42ca90379b41ce47b437283d99238a9194a689c0702e71c499cd4117b1ae720e09c2b89933a9744e3dc1338f791c4a97303a1b581735f499cd4f9771a672170ee2789335f25e7c3d07cdf5f122735d086c6f91b701e2089939a4298c6790e5cec074ae2a4a610a6715e0e9c07c591743ddffe7ff8f718dba1acb71681c950ff6bb3a223ecad4fb4456d5018acb802d01edc9a8373c93555e3ee61ebc190f1214cca75bde489b75aafda8637040320eeb1a531f0ba81febbaab8339c552ce84130ce74a81668628da641b785e1e6c398d0bd52dc1c32e32546ddd3788b81f770fe26eb532de240ff85e589020cb6ad8606fb30abe601d2d2c0eee9458047c431e05cb0c80d387f098447c6d1b46af001abfc976616eb449caca3c5889c004daba3a4d252634668b4f74277f56826edf25ef3fdab41febfcdbfa8cff7de2cc6cbe0e23fa63519c333a53276624d25bf0f8cc7b2192bfc7f4cb641e3d5fe9b830ee8b8c4e55c0e1efa821bd607c6e35ab72b8a8b1035ae81df1e5a96c7f35b96c14049836d0699c50b0d71358b7880f0ec3e21eead29d37f7a53a398684fef7ce8bf9f28199798c09086db07704f928cab31b67e35c03d5932aec698fae501f714c9b81ad737ad0db8a74ac6d5b8ae692dc03d4d322e71949486db1b704f978c4b9c59a5e1ae03b86748c625c643d3703702dc3325e3125745d3703704dcb35a73b420792984c64d3ab68489ebb3e3da026e7a52b28398c60b68b5713718903ea775531fe00163ca613e8fc57a8117b19e2b278eaa907bcfa445a82c0f17fa7992380b55727ac079be244e6ade3c1ae752c0798124ce7c959c6fc210f68592380b5472fe0a9c17313957487016fb7f2afd867a902fdc14d84cfdcd89aba9449be67b129ee917c7353735d12f68bd2dc8747b8018427669514f8f425bf392386aa201ac4f31c5acbd26ce01c84b99905dbd287c6cbaffb28af8f068b123eb03de65ad998a20f9f1421c27a23d5a0e863be2e54cca55bce6873206f96fadb1610f65f61e59c0cd3842bb437683b1a12ba48112279569a05d01f44a69a0c421371ae82fed22d0ff4903258e14d140bf03d0aba48112278c69a07f00e8d5d2408993c434d0df00f41a69a0c489611ae83f007aad3450e264300df42f00bd4e1a28b1614f03f5a0d974bd3450e2201c0df43fa8a137c4d1632f6ec41a438f9d86b71a8cafdf18c7263f66dc2879b5dca2338af9b91761dec4c4ece47f615e6c36951ce2051b48eaab7b4b01d7cdad3b5aa47d6dc72d40794b6b06be0cb143c2931294c426f919ed489495f038b9358e159a612281685e67b0459cd1a49e4627438ddca0dd1f07c1c3e6b6380262320d87a12665a305c43c0facb74b64a5a6bfa2b11e01ac77c43157ee0edf9a9074e90f603ea2bab0386f87b9a13b2571f657c9793170de2589933af64ee31c049c774be2a4ae89a371ae079cf748e2eca792f378e09c2789b3af4acedd81f35e499c052a392ff122cefb247116a9e4fc0b38ef97c459a892f379e07c80c9d92dc159e4ff99e57fb3da97d01fd2b526dc2b1f8ca336a63b5dd15fe5eccf3630baf49024ce012a397703ce87257116a8e41c09431e8f48e22c54c9793a703e2a89b34825e76dc0f998244eea4a741ae7e7c0f9b8244e9d711dede151f48424cebe2a39d700ce272571f653c959049c4f313997b19cf5fe2166f82f1be795db229879cda19e0957d0d7031ae245744fb7669842f24891c609e065a133f90c9372bd1494c9c94fcc1cfb746fbafd77a9ff67a63d64e98239f860578fe0175267db8f6661ef0df5f659295bec52473869f5761a34959e9342491ddda4517e0c94cf4ba1a48e6cd2284f04ca17a45052a77f6994ff83e6d18b5228a953bf34ca1580f2252994d4794a1ae549b054e0e538b6da69bca79179b13968b8a5992bd84be7de5c5f414d7d25ce48cf729b35a1ce0ba33da7daf9a164dee8bb44da43da9268af07da575b37f519a6e2c3a044e2eab66eac1abb3cf49f5e93b3311f71f53aede23f0d1a4fafc7b16ac82c7ca9b4e348d3e39a14a625877cd78bf0de606f6e821bece1a626a36d5fbdce1eceac1fa231ae4d6b2a01e39b713e806625c86abc70f3d2e616c4105771d016c41c0d4da7b7a4eeb345edc1d3d29ade0a49cfde964a4bedd1d3683f81e7fb3b5269a9437834da7140fb2e93d604b2997beb245f608a37d27fe19444eb748ac279a3cde011f55e1ceb835d931fc92d4e9dc94c1f03ccf725616a4c90f63a607e200993b8d68d86f930607e280993d84ba7613e02981f49c22436e469980f02e6c7923089f9bb68980f01e6279230350e1fdf0c989f4ac22436cf69987700e6679230358e6dbe09989f4bc224e68da5617e0c985fc8d9819848491b947b126685be8c73bcd31cc88cb687615dcd8f77121f4634da4360bcf3ab38b2ca65b2a495780fa52d1bfc06c68bbe96064abcf869a0df03e837d240897d761ae8a700faad345062bf9d06fa39807e270d9438de4903fd1240bf97064a1cf3a4817e0da03f480325369b68a0ef00e88fd24035665bf800407f92064a1cffa4817e04a03f4b03258e81d2403f06d05f2481162a6dd8bf03f120bf4a03d5d8f57c1b40e74b03d5d86c7a0b407f9306aab161ff0680fe2e0d5463d7f37500fd431aa8c6c191d700f44f69a01a9b4daf02e85fd2403536ec5f01d0bfa5816aec7abe0ca0ff4803d53838f21c80fe1bc7f243e40ce291c77943bc6dbd41fe0bebfd1706df1be345eb4106fa25a8f226321b51552cdead6036f43f39b3f4fd5586d69e07bd7ab3b18c184c8da1b51702661b49981a436b4f01ccb692303586d69e0d984b48c2d4185a7b3460b69384a931b4f664c06c2f09536368eda180d94112a6c6d0da2300b3a3244c8da1b59700662749981a436b2f07cc2599987eefca2e5eadf63081000d8cb68875032f025b8a09b686e7ea91a7b7ae9d581b69b84b41086d67c9b8c4fb260db723e076918cab716dfba73092b4b4645c625b9486fb11e02e231997d86ba2e17e0fb85d25e312fbf734dcaf01b79b645ce248140df777c05d56322e71cc9486fb2be076978c4b1cdda7e1b685a6d872927189f35034dcbfa1e62ecfc45dc18bd20a4ef4cfabcc9be67f7bb0e53407aab1dc136dc188bb2ed0120ff586b1811598906106d170ada859273a65c18f17b59cb7ef40dacb1599ac1b382ffe604ebf28b10343adadb14126dc7aff156162c2e85fa55e9dadcf41ee311af9862cf267e17ebb12937c7527793af75b8ded84ffa036af1cc74dc21df283078c29cdf03c166b1ddc7b5761b2266f16b4bddd30d5fca948641ca7d1f565d10df522ba1e4cba759a3cb6caad83c9891b46489937369d3968ba55a5bed6411e34b3566532af99e29e1a34a9cc5d7386b78ddd38a8b6d9f83f8db17f4b403deec9046e69d3abe42697c600a0fd8072352665b801b5e91298a65375e211144bae715a6693ffe061b47a1c33aee93ce1cd36801aa7afdf82b6e81a9230354e5fbf0398bd24616a0ce07d0d30d79484a93180f70dc05c4b12a6c6e7f74b80b9b6244c8d01bcaf00e63a92303506f03e0798eb4ac2d418c0fb0260f69684a97198f929c05c4f12a6c600de6700332f8e09bb704ca9c69becff6756de2dba8933a703eefa4cdc709ff974578d0e50990ce649e8ad6f2089931a214de3bc05383794c459a2927347e0dc481267b14ace2d807363499cd4f1241ae705c0b98924cebe2a390f02ce3e923875a6797bda8b38f3257152579bd038d782da592089b35025e70f503b0b5b77be127b44c4f14e5a8fa83ba47d298a3b5e6982ff7795fd1da5f630e667952942c5a8bbd2ce67d13640bc523193b6c8736df88bd174d9c7e3117bfcb478bc0ed0e32f8923682cd390316afb8016347635d4edbe71443e17796643f55989ba6a0a6ceae79cb8021e7ab020ff834759bf38ea67be6d1d54dabb6a50434d34de58ff3be6f794f9df1fe51fa4c23ed0e801e5bd59acc74083abbfa406d70095e90bef01ce019238a9b978689c9702e7a692384b54729602e76692388b55726e009c9b4be2a4cedbd3384f00ce2d2471f655c9391138b794c4a93331f1155ec4b995244eea2a7c1ae7dfc0b9b524ce42959caf00e7c03806fad2c3d4b8c6a3070c840c8a63a02f1c8d0a527105431ec9a883edb2c4baa4e11022add79e447b59bb8876309376d546b495162e38c8a2b676f95c18611a12c70853885ad58832f919af6f84a91e204ba540126b240d7230400e9502490cbea541de0890c3a440129b4734c80b0172b81448e242051ae46b0039420a24713a9906f920406e230592b8428e06f933406edb9a210ec9cd1f8d17f70110e2309249d9c3cb64679b20e905f5c1434b7c710af47846c531cce10ec0c17e8ed95f51e36aa45aa8a1db49e2d4b9b86b7fe01c2d89b35825e7d6c039461267894ace5d80737b499c852a397b01e758499cd41ccd34ce02e01c2789335f25e7fd305b395e1227755f5a1ae7afc0394112a7ce6dac4e878b7d07499c0354725e069c3bb6e66c6532a7c6cc217530fcb1139372354b39ce3fff5aafd6becc44c28ff4ff55ee4df37f32cd420fb21917a7250e3bd4ffdb245cabe0c1f2322d7b11ecce71e5a70be629834504b1846bd396131c0597f82e4cbe4cb79d36f74c628e3a5a58c23c00dd551aa8c6b571f701e86ed24089531a34d0db00747769a0c4673b0df47600dd431a2871ae88067a27804e94064acca84803bd1b40f79406aa31f8f07a002d93064a0ceaa281de04a093a4816a8c34be1940cba58112074378c9ac00b482ddd19cead5d8feb8e9b797d9c5ab15b086bd5e613fbdc48bf82ae308d76ef011cd061299ec2253a872d7ae9da0664e964a5ba092b616c6e7a7c411099fce08282e2fd0986ba10cc642a74a44258e3bd150f700d42a89a8c4673e0d751ca0ee251195d832a5a10e07d469125189fd271aea3040ad96884aece5d3508702ea7489a8c4b1281aeaae803a43222ab19d4a43dd05506b24a26adc48724740ad95884a9c7da2a1ee00a87b335197f79a0fd119e4ffdbfc8b5a3769f9c09e878e695d1ca139eee13d1cdcd3b80c7615a0ac6fdd28a7e0507a93af4e6e175136c81a742e54194dd20686f6664a03d5184dd21640674903d5184df207dc3d674b03d5184df21780ce9106aa319ae41f009d2b0d5463348907f7d07da4816a8c26f9116ae8bed240354693fc04a0fb4903d5184df20b80ee2f0d546334c97c003d401268a1d286fd97f0503a501aa8c6aee767007a9034508dcda64f01f46069a01a1bf69f00e821d24035763d3f06d043a5816a1c1cf908400f9306aab1d9f421801e2e0d5463c3fe03003d421aa8c6aee7fb007aa434508d8323ef02e8514cd0ae09d082469374312cefa6c52f1f08ddcca39978bdbc4c52058ef17f6e4218cc3afa817e09aab8f1a1552cde22086638a635a78e47fb6fd9cbff57b9d7c09d3aeed08644b9324c1d1f1b47a2d5e6c319cc72056a24e8daac3a7903ec8b709c1448e2838706791d401ecf4fd912641699b8e0deb89d67b683345b434ef60b36cbff5e95fdc9a4447c087d2f43da52b03fe1a174829c2c4d854ad3592e0b0fa1132571eaccbff80fb4374f92c4a933ff6247a89d274be2d4997ff105a89da748e2d4997ff127e03c95c9d9ddf3ec9258b3cd73b5edf74cf08f5c61f727aef4467ac156d0d53c425af8ecd25e44785a1cd9e8c31d12cc3eefb353eec315d362ae25587da1afe19e793abb095f6b7f6db854bbde3fbbba4472c0319e4935506565cc4d8006498b47ae80ba7906fbf236b91926fbdf98e9bfa401b2358cf38235f0e5fe57fa7a419b02e199712417683a82944e7a01e2c3873638b7155ce667c53154eceaa90ff2df5a631f4be60115348e88210bb48ee5fdd0633f5b1a2831a88606fa28809e230d9438dd4603bd1040cf95064abc87d2402f06d0f3a48112473d69a0e702e8f9d240898d791ae8f9007a81345062d8170df42a00bd501a28313091067a2f805e240d9438974903bd04402f96064a0c4ca481fe0f402f91045aa0b4617f04ccb65f2a0d5463d7f37000bd4c1aa8c666d37400bd5c1aa8c686fd5e007a8534508d5dcf7a00bd521aa8c6c1911a00fd9f34508dcda659007a9534508d0dfb0600bd5a1aa8c6aee701007a8d34508d83237300f45a2668170b1afc5a0367c2172abc600f781a1b6dfff7115ec4765d1c81dce985d510bb96b4909a4381f27a26e53a5e723c48bddd35c1ccbe577843fd1755fbff4d4a8432347fb16b6cce2f034322373099576ae1ce995c638b99bd775a9d3d0d306f9484a9f106700e60de240993f83ca7619602e6cd923089ad4d1a660360de220993d817a261f602cc5b25616adc1eba08306f9384491c47a2617601ccdb25616a8c905f1a30ef9084496cb4f3566f40effc4e4998c419221ae68b80791713b3670698c99bf368dc49e61e884abe5b226b814ad6a9c07a4f1c9b4984c32233ed0b8383347713d0783f9d06b78079125135de574f07d47bf90904fc4fd1ff61ad2dc42c3b206716ca84abdfa3d548fa86e876f122c8fbe25e3a33c1ffbbcafe8e527b18f3b34a6fb07f90e9fe6fadb15f99575337919acfa2fd1deea6f7c7b10c36dd79a3fe2a67deb7804bfe01499cd4bdb7699c3b00e78392380b54726e0d17fb439238a929ff7853c4c0f9b024ce22959ce703e7239238a9837734ce1781f351499c252a39e703e7639238fbaae45c069eec8f4be2eca7927303e07c821dad14a44babf30f33da7f5ba91d51326fd0c756e4456c4fc6510bd3cd313b80d999a465987dac4dc4f99424cefe2a396f04cea7257196a8e41c0f9ccf48e2a4c680d0380700e7b39238fba9e43c17389f93c4d95725e77ec0f9bc24ce02959cf3a0a1f48224ce22959c9da176be288953e98650503b5f6acd6890e4ecf125cc38255afef813214ee9654998c47e390df338c07c451226713e9d86791460be2a099318f141c33c1c305f6bcd1d37921b47c4a505b4c4bdfbc2d0f0eb52288b5452fe08946f48a1a46eea48a37c1228df944259a2927265b857be258592ba0c8b463903262ade9642d95725e53d502bdf6152aee125c76c56f92f0f37d709e3339b9b52d3b82af850c07d9789dbc9ffc2e4df0e529c8ff21de6f0b86819b8bb7911d77b71ec2d687ef1645b1bc363cf48bc8486478b136e0378efc7b150c03d1a843d1b5c2a40bc84bbb1585f05d60f98ac1d3cb3f94399ddf4c1e4eed077b75b19a83e8c63eb11ac7feedd2d83242813990b51698950be8186ce47713474cca677c33c139931de33fbac4e49fc3b1089619b3bdae623cfc2de421ff347cbebfd4398b513a9371e196d13f4d4d9c356301f37b48d4806c1c5fe899c9daf0ab8cd70dad3bb1e6ae7a79238fba9e43c14383f93c4a933edc910e0fc5c1227752488c659019c5f48e2a48e51d238d707ce2f25715247cf699c25c0f995244e6a0a481ae72b10a5f1b5244eea34198db31dd4ce6f2471f657c9791e707e2b8973804aceab81f3bb38d69887a3e975f63065f600a946d3c725be1b6c564f1c88a3f5df0f81a190eff97910d20d35d037e3330aa6747f900249ac9134c88d01f2472990c460411ae40480fc490a2431509006b93d40fe2c059238ee4e83dc1d207f9102494c4b4a83dc19207f9502498c4ea7419603e47c29901a035ef604c8dfa44012138bd320a700e4ef522089e9ee69901500f9476b46b325f7c135e61a5e1f28ff6452aee6358d661bedcdf64c1eb7c639089be629d217db711044b2fd251556e3c68a6300f66fa9b01a632fab60bce81f266cb7046c918dfa68f0bf6d0e64be536b4368cccbf4f1bd06d316ffc631309c6fff3ffc3b284ca9ad83e665a6f831441f2dc15a28f5b61771fec7e45cd633618441606b99ffe3115e9078b4ca6ec154e5ede3e90c2eec0e805e6722e0d2fe1726c56d79e2170fb61316e610e68e4883a305556f04706d9870e17ac7f4667874466e6c0d77c5b6923035eeff331030979084a971ff9ffe80d94e12a6c6fd7f3607ccf6923035f6c93701cc0e923035eeff5300981d25616adcaf621dc0ec240953e33e151b03e692923035ee803a1430979284a97107d46180d99989192c2badf782953fc36d87b1025600d52bec778ff322bc2e4cbc65bd681c08d7416a1f489b07b56f692660cbb33b1802486cfcd04200cb6148771926e52a5ee6e918898f195acabbe3215cb5ab3450e2a386067a22807693064a1cd6a0811e09a0cb4a03250e6dd0408f06d0eed2408943c234d06300743969a01af3b01e07a0cb4b03250e73d040ab01740569a0c4a10e1ae80c005d511a28718898067a0880ae240d94d853a2811e06a02b3341c3ac6ec819a6dda9b0634ae1df83fc974ff5df66d2940589504cfc30f1f2a7cda81f01215bab48c6253eac68b807036e0fc9b8c4db020df778c05d55322ef12146c33d06707b4ac625765b69b8d700ee6a927189832c34dc2b0077f5d61ca24e4e89af71df8b363044bd069332ccc219867397db1a688a1184caba47fe352efe9f0235b4179375fd46ac263a7e8e7f88305371102bef4e3689af1be897a98a0b5ec5021f0af5784d26f83a8dc06b6049c2a2cf7c39d4ebb5e2b85db83bbe78404cda4b6c8acd63b14e8539d7b599ac9965b529f45b071a634bbbc3aaba75247116aae4fc170667d695c459a492b313d4cede9238f35572be08b5733d499c052a397f06ce3c7ef059103f159e7f4cb153b466ffcff01c5f3f8e790157e3a8e94ae3feccf8145a305a3db4373790064a8ca0a281d602e886d24035ae871f09a01b4903d5b80e7e5b00dd581a2871888f063a1a40379106aa31b7c87600da471a2871b284063a1e40f3a581121bf134d0b1005a200d9418e347039d04a085d2408951a834d009005ac4ef664ef5ff99bcb669ac25acf00fad0f6f672fc22b66e22de37f6126312abd6936398ba977b82d943eba9e405712c7d4717aa3451a17d0ce04cabeb2ee89452a073b5e8139cc7ed240350e76bc0ca0fda5816a1cecb80d40074803d538d87133806e2a0d54e360c71d00ba9934508d831db703e8e6d240350e76dc0fa05b4803d538d8710f806e290d54e360c74b00ba9534508d831d8f01e8d64cd030b5af99539f6c5f667ae9da3392dcee457c03997ccb01dfdebe42a53d54b81f7b2c88b49dd9fb4268c2a0d61df8c0e06e8d695dce01cac1adb9fc60881d8a9be4d1e3e4cf6847a2dc0cee8c43f8c3c041a2e9b1f6979b078bd9d4be227181ebbba487c37db19489b73cdc17a77a4196307388452373fcfb70390f8d23e2ada4d1451d035e6f16deea10cc3a2c8ec47fe92c0708a6c5f48da8df0b98c325616acca2783f608e9084a9318ffcdd80b98d244c8d79e4e701e6b6923035c6ab5f0f982325616acc237f07608e9284a9318ffc3580b99d244c8d79e4af05ccd1923035e691bf0230c748c2d418067315606e1fc792e87430931744135b9cb425d1ef03eb5889acd4863c8df518601dc71f4baff782dcf261fe83499ed9aa6c9affb299fecb2679261f020d91b601ee482f421c1f67d2949989a90877a28970b2827827a58d67de0a83c11398acaba7b8e42778c1be8373bd527b18f3b34abb99de74ffb7d6d8afccaba9dbdacfa7d1c265bf431c8ba4d39dd2d5b960a5146aea8e923807a8e4dc19387792c449edc5d338b7818b7d67499c852a39f703ce5d2471ea8c7fbb1c387795c459ac92f33de0dc4d122775274d1ae712f028da5d1227350d2a8db30770ee218993ba190a8db3003827b66610575474f2e83cad0f5f03511f7bc6119369a8667966537b1358a83d68660de02b6bcd18b8e49a489cdaa0d5c419f0049f248592bafa8746f91550964ba12c54497926505648a1a4ee814da35c02721d544aa12c5649b91e3480264ba1a4eead41a33c056ae5142665772f8a1e0ee783c2295fdd8da0f72057e6d4b808a7da1e4c85edcbd4c545489b9878d18b08ab5a37a1386ee68013bdc410c36e2cd695a179be17bf6656fb2f28b3897530c58eee49de6da1664e93f2a8a1c6b5d3280f87b664b5144a6a4a131a654768004d974259a892f275a89533a45096a8a45c1dda923552288b5552ee0d17782d9372052f1a97acb42b214d5147d8b6a5d94328a696250df20b787eefcd84ec91a24eb61ca045ac9bb400adcde132af8b83348c7b4bae97ae0b9e188a4daba517c2e55e1fc7e55eb0885eee9fc1e5dec0845cda7c5289618cf17e6f3c2840b82c9a0647cb66d00fe066cad93fa5803be34d5b0e50076342b324715267bc699c0703e76c499cd468211ae760e09c2389931a2d44e32c07ceb99238a9919634cedec0b98f244e6aa4258db31838f795c499af92f3291853df4f12a7ceb5e6bf03e7fe9238a94b52689ce7c2c57e80244eea92141ae7ff80f340266717ff8b5a2f7975e42e5eb0de8cc6d693c5b6b117b11d14c712be06bfe75de5bf74e282e1b50a8b17fe3dc87fb199319fe5bf2ad8b7821cdb46a3fd0a6ae4c15269a9b16e34dabfe1517488545a6a702b8d7632d01ecaa45dd6c3f5e6a3bdd9f60e5ab760e57970207d3146a3e08e7a581c491edd2b28e6da7f51c7d969790afbc064efe14cc65e19348f067bc1eaf232fb9d7afb0e2aefbe6d49bc45f0703a22ae5da3a7fb2fabf0625b4b419bbad814ee9147c65137d39ba90cef9ce62e3ad02f419547cd7d50c5e25d1aa6d88e92fa74a786d0d09eeed3e0b23f5a2a2d35668e467b24dc148e8923e9bd99415fd492debf0788c7c631bb3e60119d5dffc98b208f8ba315ea6a3e45ad50626f88d60a3d09eae3f14cc6359c4ffa74ee9825cc84cfb43be63e109d7482645c8d8fa3a9807ba2645c62e2331a6e5fc03d49322eb16b4ac32d01dc9325e36a1cdedb0a704f918c4b4c5141c3ed07b8a74ac6254ef0d1707700dcd324e312875c68b8a300f774c9b8c4b59d34dc0ac03d43322e313f320d7737c03db3353bba832d681d773ee010d67cc00018183c8bc9b89a97bc52a4c2d6be326b114ca7244fbe0407d6bbf76039d4cfb3a5c2121b5b34d8a76196e01ca9b0c4ce2d0df620803d572a2cf11e4b839d08b0e7498525b65e69b073e11e7b7e1cb0f9f6ffc3bfcd93bfd2c6019a8d4acd6f32d4a360b2db14b441e1f0771e0c7f5f107782fff45bae1adbadbde0667061ebe6d1c103c6944787b65dcaf7d08ebd484e5475a17f5fd5b827e74a108575b124ce42959c4b00e72592388b54722e0d9c974ae2cc57c9f935dc3b2f93c4a9733fe33f80f3f23886fd925ba523fc370df44d1afc374629dec6251a4de5f1b44c6951d61d01f78ad64cac9e5c57356e157d8017515ec9a45cc5cb74339fbecc0b9f56378ba13bfa3f69a0c458161ae826007a953450e2101f0db43b805e2d0d9438b447035d1640af91064a9c36a181ae00a0d74a03254e97d0409703d0eba4816adcdaa727805e2f0d94388a4f035d05406f90064a1c0ba581ae0fa0374a0325f69468a06b02e84daddbe9c4293b22256dcaee31e8bfdfcc0fdb09723d1ad27a2f58703e3cf1bd6868a45e618d3c0d26e86e89e312cfb7334995b6464674a3ec855d667f5217c7b8126d5a6e1700bd358e3150f7b41c16df2c5423f68bbab0386f05cedb2471f657c9791170de2e8993bad284c6b92570de2189b35825e7bac079a724ce7e2a390f07cebb24715287e8689c3b03e7dd92380b54729ee1459cf748e22c52c9391f38e749e22c54c9f91c70de1b77e0e204ffef2afb3b4aed61cccf2a17e48e0a3245ceb03d28e2ec266d03c06eed22dafbe2a8a94dc31a825c273b7865f68d15aa0319ee869a7a3f3f6f698d3dc088440d1de291f396d2d83a03db034cb64e1ea6290c6a1e8d8b9657a714b81e6ccd91cbe4860f71549db7cf368c5c3e2465eb346a1b9246b917c46f3e2c8592da7ea4517e08948f48a1a4b61d6994c703e5a35228a9036c34ca2ba0adf898144aeae01a8d7249a07c5c0a2575248846390ca6719f605276b394e65826ad60f0b6915eb0f3f6f88487bea9db895ec4f7a4bc7d3a893592d63c9f0217f7534c52f345b58dc6a855d8e92b849af7746bde03f170d47592b4a0ff53a191f30cff1e38cb0b4305c6db2429410881de7be00e50139f8d637c315cca8f9081c6a2967e6247783a3f2767151a79ed04ed429f0dc315cf4be2eca792f358e07c411267b14ace6d80f345499cd4a4bf34cec9c0f992244eea6e0934ce8d80f365499c452a39fb01e72b9238f355727e08012daf4ae2a4eedf41e35c0a6ae76b9238fbabe4bc10385f97c4394025e71dc0f9461c694e4db445b4314af8e398b645a131bee4458c6fc6bbff51eaa8a06189378cf60fb19767b2c83570c7309f61d15e0bb46f49dd5a8a3ab94b5b9472035cfc6f4ba5a54ef6d2689f8046d43b5269a9d11d34dac140fb2e93b6bb176d88363df1cb83b568da1f576b03e17bfc517a53d3cc10b389ab9c191f1f6dbe6835e07b9fc9b792975942338d69a22e84e7fb079230354ebf5d04981f4ac224268ea0619e0b981f49c224a635a1619e0f981f4bc22426dda1619e0e989f48c224a684a2619e03989f4ac22436ce69982701e667923089210b34ccd300f37349981a473a2f06cc2f24616acc417c03607ec9c45cd34b8e53324186653652c984ba9a0ea4d91fa3f9b4501a133fbedf2e02feaa75431231f04b634aa84381f2eb38721965b2409f7827a52d827e13863fbe91064abc9bd240df06d06fa581127bee34d01701f43b69a0c4de3b0df42500fd5e1a28f1a144037d19407f90064a1cf9a481be0aa03f4a03d598eae46900fd491a28b1374f037d06407f96064a1c05e525e301d05fa48112474269a02f00e8af9240c93b5ff12e7908b0992f0d5463d7f32900fd4d1aa8c666d3e300fabb34508d0dfb4701f40f69a01abb9e8f00e89fd240350e8e3c0ca07f4903d5d86c7a0840ff9606aab161ff2080fe230d5463d7f30100fd571aa8c6c191fb01f43f26682f2f935c3563fc9f9b3dd6cd6e1903fd125479d45c0d552cde75218b88f91069bcab7aa972c18eb507abb1ab944aedcca779b139891832c22ed18684fa9b17a1b661a2ae6551c7f9e75febd5da9735f86f18edcdf666d89a596f972ad4faaf996641072566f1835f30d4ffbbd2335be8e89bb55f0f88db32895b9ab54f5ef645ec477560d5d67561d67e0926e5065ed3701dbcc316a5c8b05d0f7b1445ff2af57f459dfd45d498930d59b5f70878a8b563922fe37f51ef05998fcdbdd61cb5cc3fc428ff2d869246d79b4537162efcf64cba9ef0c09a699ffc636c21c2655df55ee39dd8352fb4391b6a6407266b57600df288d5c785378f85f732d4c98e4cbccc56ca9bb5201a8371bb429bb49324ce12959cab00e792923875868aff0577caa5247116a9e46c0fb5b3b3244eeaf8138df369a89d5d247116a8e4fc1638976677336b13634a9312bdf45d12fda051f690933cecd1d32869c904368146d232ec3e4f6da3a63ae6aca5d1d1e2ea27035dd7387ae8ae31d0ff3f3df44e90c3b61b933cd5f663e9e715214e33d36e042bc278d3b271f4e0dd532478c081b6c69afbef44e66433ad133a0342caba3359cdafaeb693210d6a77d35a1beea8cb31b196b6470b57cf0db1976d99953097b4be47d16a00b7bcdcfb2231e28e765fdc10ee8b2bb4e694c610cb38c90b1622121f3167b4235156c3d37b45feac66e9822c8b832d5d307fd94a536eb44d77bac2a5bf121375052fd8b03198d50c7f3d8eb64ff0bf5f61efa31a77bedc1d20578e63ce3d5cd21d5cf0c1419aebad6b4c877125dc3d5761a2864907d269534e54bae5c46370ffec2109536306872700735549981a73d83d04983d25616acc61f70860ae260953630ebbfb00737549981a73d83d00986b48c2d498c3ee6ec0ec250953630ebb7980b9a6244c8d8df6db01732d49981ae72aef04ccb5e31857cf74549d9ab49236aefe0c0428ac2391b54025eba1c0ba6e1c03c9f97626c84c00a717314f5f7e401b5f5a1d66827ac7110392ee1a24eac63dbc85dbc0b99e244eeab65234ce9b81334f122775c3481ae70ec0b9be244eea76a634cecd807303499cd4cd76699ce703e7869238a9e3f234ce03807323499cd40d23699c4f7811e7c69238a9bbc3d2385785dab989244e6a1a751ae7d7503bfb3039c30d230dd5a2b761e42fc0981f47588d3b223e38143dac8616fcb52a44c317c4b148b0b0d180480cf590163eb32a0c7814c61d39977aebd2a6c1dcd42416f359b47d81b6288e078febb1d3783f84fe2a774418d02ee22c96c4394025e778e02c91c449dd9494c6b9195cec7d257152b791a2714e06ce7e9238a91b3df3f22800677f499cc52a391f03ce0192384b54727e0f9c9b4ae2a4862fd0383bc3937d33499cfd5472f606cecd65ceb413c7916833ed27c045bf451c1dcf70b9c114cfac003633edd158923be84663fcd2061072b3a5a411cf012a13503f0403c85b49e2ecaf92f33ae0dc5a1267894aceed8173a024ce62959c45c0394812673f959c6700e760499cd4050834ce59c039441267814ace5bbd88b3541267914ace8e503b874ae22c54c9f911d4ce614ccee5129c05fe9fbd7d854a7ba820894a4cf3ecb4942a6f409d1cce4f0fe09e674fee07e99b28ee069023a44012073e6890bfc265bd8d1448e2fc3a0db21620b79502491c2fa2415601e4482990c4d54334c8530172941448e2da601ae42900b99d1448621b9206f938408e960249cca340833c0b20c748812466f7a041be0690db4b8124e69ca1413e05906399904bfa5f04dd42f3a7426d76cd75006c5c6b865c2737bc35de0df78590ebf171a47e0e276fcb6db23d530c53e4f15e98c274a89dd49dee8df40fd214bc712082c630849f200c6142ebe627c6cdc5923329d058bbb158bf819bc20e4cd61e5e261b3986836fc45e10ed3e7b27d4d41d5b337d4ad3b8777d97fd000893d9491226710c9386b92960ee2c0953e303691dc0dc451226712c9317640898bb4ac2243ed369981b00e66e9230894f731ae68680b9bb244c62bf8986b90960ee21099338b649c3cc07cc89923089a34934cc02c0dc531226718c9386d91f30cbe46c7757a0341f67158c364d92c4495dd042e39c0b9ce59238a98b01699c5b006785244eea62401ae776c059298993ba909ac6b934704e96c4495d484de3dc0438a748e2cc57c9792704154e95c4494d4241e3fc0a38ab24715233ced0384f818b7d2f499cd48c3334ce8b81731a93b39b17e5e932070976648b29929dd6a9bcca8bf8aa997c9dbd68d36f937c7cdc02427d810a2b01daf4d6dcbd32f912d6b89350350c6acc6052aee225c77c8406cde52d24de0f69790bb78765fa35ecdd7e27fa3f9e652f67f346b31bfa48ff3b267446df9d7037b8a86b9970cb78d1260dc12f8fe92142bb1f8e8016e2de71e4ca2cb0177070d498f03ab521e1fd09f5ae2e8e3b602679ae35e612be165a84f5d24089012ebcdc1a00da200d94d8e8a1815e01a033a5816a5cd47c2580ce92064a9cb8a5815e05a0b3a58112276f69a0d700e81c69a0c47e0e0df424009d2b0d94182cc84baa03a0fb480325060cd240cf02d07da58112830669a01700e87e714413e1368a63fdbfcdd1cd98e528ffad66b023868d137bb3307b419f7dff38326536d8dd26cd6047b818a5c24e4c847f0ff25f3cd57fd32cff55357641163963514f16ed0f504f0f904a4bcd5e44a31d0eb4074aa5a5a62da3d156c30de120f6c0718317aeb11ce3bfd0240b69b08033148eb89baa12c21d1cc7de55ae09dd41febf833949e2a008ed81f42cd4bf43e278baa7372fde8fd97fe7456302e6a19230897d771ae63e807998244c8d13bef58079b8244ce2339b86d900984748c224f6d76998d301f3484998c4be3a0d736fc03c4a12a6c618b7298079b4244ce238270d732fc03c46122671ae9d86b93f601e2b099338cf4ec33c18308fe387b2fabd04ff0de5de0e5e10ba55e3bf60a6ff82499e09e8d21785b48d17f11ddfba51991844a871f3e383db459427c89aba28511993340ec62d4f9406aa3126693c809e240d54634cd208003d591aa8c698a46d01f41469a01a63924602e8a9d24035c6248d06d0d3a4816a8c49da1c404f9706aa31266920809e210d54634c5229809e290d54634cd230003d8b09dacbcb24d3eb182f5a6939d02f4195474dba57c5e22d84e581673379cdaf0e07448237d1b0682bd8cc3517629d1347127c131f576917009aa29a029b71a4399ef6f56c2f00e4b9fc359461bddbbed12e6934385a92e66100775e6b0ec1613271ea105c873624cab56008ee7c3969220abd629593bbdde041728124ce42959c7f43b3e742499c452a393b40edbc481267be4acee7a1765e2c89b34025e78fc079491cbb5984393a66f8df9c9dd80c2419163708218e142dc17aba7f0a17fca54cd2a5fc2f4ca37cb2ff8d99fe4bf4b62d0d554876999cb625713692d6b6cc87b6e5e571aca2683a6891ce3a0ae2854d5b45b1115cd857c4b1bd7691b7e86daf7d1f5cea57c63190d17f111dc85811228afe17c7d2145c3139c27f4b34a411c35a49dac0da6ca88f57c5911acad4c7998bc4a57c0fd05ddd9adb232637c5358654ef0b94d7302957f3167eed23319688f6ccde10ee92d74a8525b63369b08f428dbd4e2a2cf15640833d1b60af970a4b1ceaa0c11e0bb0374885254672d0600f03d81ba5c26aec70ce00d89ba4c212a3e368b03701eccd526189719c34d8eb01f616a9b01a33785c07b0b74a8525c6c6d360cf03d8dbe2889a730d3d37dd47b540e5fed39f4392f2dba5816adc83fa0b00bd431aa8c6dd7e5f06d03ba5816adcf1f75500bd4b1aa8c69dd21f07d0bba5816adc2dfd4900bd471aa8c6dd7f3f06d079d24035ee00fc2980de2b0d54e3cee9af03e87dd24035ee9efe2e80de2f09b44069c3febc7611e803d24035763dcf05d007a5816a6c361d0da00f4903d5d8b03f12401f9606aab1eb791a803e220d54e3e0c87100faa834508dcda6b300f43169a01a1bf66700e8e3d24035763dcf01d027a4816a1c1c391b409f6427fb4b5e0132ce7fb9298689761eea99d4fb343e5ab6f8015ec4f7541cdb7e97f87f66f9dfacb611cddab7fdbe12f89e6ecdc53443ecc4f0242fc89548bc90cd13814279000c793c2327c2596336d943a0563ecbcebb30d53e402a6ccdabf34a17acfea8e7c17563c17500b8e7e258f09aeed399ba8330edeeb82d3c9b9f97c4394025e71ec0f982244e9d2398dbc112c317257116aae43c03385f92c459a492f376e07c591267b14ace2f81f315499cd43cdc34ce0ef0287a5512675f959c6b02e76b9238a9bb69d0384b80f37526a7f9c2bc983af643635ad28b98de8863d31157ad4bee71539fd7b43ef78350e7de9484a9710797e701f32d49981af7b09c07986f4bc2d4b887e50380f98e244c8d7b58de0598ef4ac2d4b887e5dd80f99e244c8da9face04ccf725616a4cb87213607e200953e31e96bb03e687923035ee613915303f6262f6cc001373721632ebe83c16eb7530d8f6b144566a402b8d7512b07ec2645dd54bce1fdb602334c27c74c9c0c14183b003222a6d8bc65d6dd841c7f68d0e3eb4c9c107db813173a2e5b6fc41f0c026de30cfcc77575adf72ffeb915e957dd79e7e2ddbd5ff2fb34f6277ffbf54df6fd3a6ab5fa2526f8e5f3cf35d73bc0a7b6cb3d1a82959bd979fefbfe45353317a242a465e9b65fdffafb5276be2962659a02a5bfe327be47dec71f2ec4c7e9dfd6c06f9ff5fe5ffacc21b6e0703a7f947ceb3890953e5bf1de7050909cae1d3cc6b6346966636f9795e9bce0bbe3fd67a94f9afafb5764109cafcd795273e98c156d86899b3cb6bd3c59e49b01dcb24fbca69de2ef635e6c82b36f3d351f67705dbb1d6db540bb5fe3b5c197df3ac74f24f1aef28119436f93523fddf667e6be0692a53b5f5ab4d943d48da58e7976fb45faa527b37aab167be9c3df399fe4f6bbca1febf8c7e780ee3fdef0df476f0c6d857e7d930aaa956a4c2fec6325b8a0ad87cb63e51ba7a2fd80d63a8fdcd416a53f3f5dc463f1fef1f2fb818c2e3e6b5e90e250a2e296337c3d619539a7189f7e6a51515171c2ff9555179936b4897c42b27f9df9b62cf704a62efa329fe4f3ba5f869f44906df1d676f570d0b8e16e5236d7cb42ef682afb3d2954d7edad9de04672d28a7a9b1467baebd5db4b15756e830ca7eb6e6a765f6eff1f65a33f78a3e05fecbda98b490416a8f4d1624f508ee28d3fdff82afc2efb77c4c737f68fe689f999b409bd44f87ea9cddd95a3aa3a8e64c4e18d7dbefb674a62d9f9ffb2ed9a5994fa54fa1f92c16e5f3ffdc7cee5d139f7bdb3e45e67c0b7250f75a2ed117e637b725b5475cfb6ce3ad437c2d0feee0c1d3ce14339b5a6eee78c9c7abb2bfb74fb1cc1a9ebb73ff12ef6c6dfb942c6c0dcfbc445f316b7870b4200b54a3630f4be3ec527f0e8dcf397a55adad0f650bea4270bd9be77f451a12abd9d696fb6803fdafa6d873adb2479dee85ff334f4ed3833137a6af999e2ba771c7186d1b0675f6b0158bef20c11d24dfdc41be49bac8f2cd45f6ede2da9fd3daff1dd37399a4dadfe23295ffc735fdfba635fd87c5353da735fd47a667a7a49a9e724b9effc7b5fba7a6b5fbe7c5b53ba7b5fb97f8eee3c12094f953b1b8a637aae9bf36ade9f317d7f49cd6f4df989e196de0fbffb89effdeb49effb1b89ee7b49effd91a2359dbf9353e9ca2585cdbc3dafe57d3dafef7e2da9ed3dafe0fd373b9a4da3ea6d1f4dce23a9faaceffdbb4ceffb7b8cee7b4ce7b4b133d974daaf3a3bdd989ea19d6fee0408beb7b58df4dd3af517d6fcbfc7cfe1fd6f725989ec92d1aacef66aabfdef65617d7f6b0b6b76b5adbdb2faeed39aded1d989e3d3cd7bc521023d7e0bfd49cf26c7b0813be1304ba2dbe02c22ba063d32ba0d3e22b20a757c0924ccf551c5740109a18545f73cf2ff54c52a0c5f5bf71fd5faa69fdefbcb8fee7b4fe77617a764eaaff18f4b9b88e87757ce9a6757c99c5753ca775bc2bd3d3cc3b8535dc84bd9aa39a028eb2a7b8f86e1ed5f46e4d6bfab28b6b7a4e6b7a77a667d7a4bbf9702f0880c760fac5753dacebcb35adebcb2faeeb39aaebe6bf956ce36282ffde8ac40a86d1feeb2becf1fef3ffd7feff00412ce3cbbc020c00 serializedProgramBytesString: - serializedSignature: 98b6ef795385526302eae15f0dda50581bb060f7ec80287ddd88714567f079b73bcb30446ea7d05cb4b4ec3e208a2f8d762aed9534cb92d3fc43b693a32ff108 + serializedSignature: 85a2ccd10bceefba2142b5754b41544f0926830d24cfbb29c89fac21ae8b81cde4f869a8a6bc0feb2ec87e6d54b94b88f747d1780d9ae44693ae94f56a105003 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset index 542798c..6e0b0df 100644 --- a/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset +++ b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5cd95bdb46105f01c69823dc6008108790e01c6003b99bb6014280e6a25c3dd294cbe6e8c7553034bcb5af7deabfd3f7fe59fdbe7466b4b257f2ae2c192f8ad3e00fadb59266677e73ecec68a122c1e0c7b803876536cf26d9305b622976c0f6e1db24b47bf031cfacfe397604ed161cd7e0da1d162bf024fe0c1a5138cec2d931cbc093276c03da1dbabec0d2f07d169e4dc319f66ec26f1aee32aae0a125f68cbd61af59a7d15e80c4323d74ccfb0c94cba881e3043b83ab69620a0749d0a54e382cc09563bab6074c5bf7bd65ef48ac3db8b601cf1cb15da0b94e146b9a2a187d61667399654f59847fafe26da5d057c95b789a55c36faf706ef05fecef13e889fd57f8f790d087bf31ecfbf0e1c3bf0e7ec2c2d875bcad15fa6a791be174ae0ae72427efef17e889fd163ff5bc6d50f0d3c5db4b02ed267eef357edec6db56de3fc0cfbb857e6c9bf9f5eb021dab1fdb46c7f54b423fb6edfcfa0d078f3dbc8d0a3c4679dbc99f19e4e71d8efeb8452b6490b5ce80fdacb1439620c5de64deddca7ab2b043910d55702319a4613360ba87404062d54be4331936c646a556dd65d40b7c4fd2710deed821a238986388bff38640e676e193165cf218faa7c9a3d12977e0ca307b092d3eb5ca46c0c9de3aa82cc3b0bbe0d669b608c743a2b70a6ce7df594824745fe733f340d38c2e7bd063017a08e7bbc4e1021d4f89d334713f0b7d198a75fb10ed26a07d4fa3e5cb7e04df65632e72c8e43cca838caadf0c65969a9e8134c87d82e2ca678d04a11184befa2677c3aa0445fd3ff334f1194333c8e0c435cb698c106486ad6f9425686e4be521e85fc67c092dfb5e64af78fe8272a4e14a067af0a96ddebf043e829a4029968082190655775bf2cad14393182229735610b28b3dc612388d183d05c476031de9c50d9c894a2d5e28549544219cea3364eaa3146141abfaec94cdfb76e83e3763942ba7da8b7292d53cf7894b66d642e3abd0ab90a187d1dd58d58a9e95552cc0f4f102aeadc1fd690a51d83f0714d7606ca4374e23e43211fb13eeb8d678c63542b80e0839d2793953215e29439c52bd9d0b447c8c53dbe7f7ef728ad664bd43ab93239bbc33e4a14e79c70ae8a0d6b30eea480743793a2825af2aad5449b49244add4cbd88f38d847ce1584433275d38ae78f0b5177a1547f9a56ce6958d6aeb35f788e668d7b40f9197264e57af3d06e1217d8bfc12701f7b1dccda3218b4f0edf04ad12a77c2c58f44b810bb80a32d34632d398943bebdb04d0dc86b14e29df3d819164238442724768a2113e2ef9558e532d731c9ca59a69416857ac814bf0151a1f4324f288281dd1222f93756aa7a3e7f95b58ed6f61193f78dae2c591436ac2352a415bbd1076e13822238c11a24de21a49748df6ac2d7690a50c3326245053140d7648ebc352cbb0275cf6fb2dbf7c4505aa13d200d8a9539e26b53cb5b28847b599f75a239e9b4485a68edc74a1a23207967a4605bd0d388ae8b8c7b74ecfd35f9474f9c44597ba2551f9789dcc4251a35d5e4c3faa36957a95e977ab4c1f6b8ab518817d9964836c1c74c99e6082d425998b1093a701b988170975b847af67f7e823f778ecea1efaa450b946a34c93a4dead4034b9cc433ca23be63bd0bbeb0aebec95ce548d00b8eda295f3718469967050244c31b20d7d5ca8b4df24d33e755e6cedc15cf7ef32f742985cabf8b6e58a43ab04b514e97ea6aa3fb8f3a042b0591699d17fae498c2dd96833066e11ceb81b53c7dd16d968a8af0115084ee2fd6ae2ad2a51aeeb10a54d361a4e9d37545327be3632b3c638b316da2a2758a4308a75fa4d52e29ee69cb15de648641bbf0634215a5995f50af7391517b6e05cc73488a5fb5e89fda91df116e9f09eeb74586a19544edca1b2c5db2a5bc477fcb571a9cdbb5849a7cac3867478585425d5b04aaa44515275c9c6c16430c93c64d77d6ac2dd32c2c8c88834dafdfed44fb4bb2c238ea7a35eb8765967f7a8601f53c17eb728d87b65e360ce8e3e95b72698665631c6aa241657911c8695c50a381bae2b56e8159c751dfb65756455ddd9cf7aa34f25eb7d99acf71db216e2c42e538a028e25d96b5e7ec03bc4d027beaff023c91595240f64923c62e27b28f7b750a614c75c8a0cbfd78d6fe7b565a0869af7234f4c25cf43993c4b59cd58453ab14467beb245bd6cd21a08a59ccdde390553a259069ca75c380dbc9ed2ddc35c12bc9a028a272411d2cd3da31b87ab2a1c1ec9709861aa69cf7b89c46eb55b9232195e978f222baaf991b65f25ed6399b4eaf29e8c0fbb5cfb25f6bf6b2acebf9071ae4e3117b3e99b3d76a4e1d10c10b0aee7f39d5b67f8e17b40c5f713550454f1ed4c8ced1298bdbf511d22e56241f6f5a81f49aeab24f9521531bc70604a7100717b05e2e309696187a2f899ab0ebcc9a703871b2a1cbe92e1b0e81231bc548d4c7c30193ee556793eb9dd92733f280caa50f85a86c283a2ed1a5f231dd37326b73a341a57c9f25426cba46f598ecf298bbf792e0c1fc3c0fc748a5bd319641c074439033412548c486667f4c22ff970ec3d88f468398b20e17ab6dae24e619ca9f7686eb2526dd72b24852c3b1916f213513aef2f95f3b72686b944162d409a2a339f9aa413a8d52aaed58a04d5836e17694d85b9406fabae94db90ffdd4826016b6d60e0f264259bce7a4bdfc46548417e9c2f3f9dfc0c11016b5f5b09b631a3118e03bf29aaee1cc3077fc2a18a24eae9994e30c304266eef4c4157c68b3c1f013c312307cf944e788a7bb9570e10fe2340f85c2784d122dcb51c00fc8b5c341c72107f5eb289a3b82da3f9535c2339c97b4a648e885eca39e55141fd63e37c5a9cb2e2e70efbf1a22c312e8990f122c3422ec793e76649ccf166fee7e957b295926300a1d7ca5628467da33346d5933e57e8012482eb810d5ab98d3ac73acf76f7882d2ad57911a498c85429240f2f8281ed813ed81a75c1562fc0f652276cf8a6c55f1492ce8aa58334aa0bd23a01d257c158e2843ed8e2ba608b0ab0bd0e06b6bbfa600be9822d2cc0f646276cf83673c3d394bf40a01e512a8265a4f2b3c51e01d4399da0e2c6664c17b062ba40343151d50658bf2ec0ba05c0be0dc67947f4c116d1055b8500dbbc4ed86a396cf6f7121a21d366692d02640bc158daa3328c686d026c8bc1c076bf0c73b95a01b6a560601b2f436beb10605bd6095b03872d9ddd8591db4d93d4075c581770d50270df05059cc669411b700d0270dfeb042ec6fcae63f377b8955f75a54a80f7079df0a204db0492d5656d492bbfa5d96501b41f83993cc6cab0241512607bab13362cba7a5bd16a03b14f17885d02883fe904d15a59e02a36b75b44e3dc1bd30559a300d9bb60dc55236cdaa21c1360fb59276c2d1c36b77d615a21bca50bc27601c2958b70567b19402364daca004d0264abc138ebc3329c162e09b0ad0503db3d7db075e8822d22c0b6ae13b63a0e9b7357a5c62599b6f9b455006d2308d0ca31096916404be9042dc2413bcd6e172ecf857f8d0058faa2012bc712932100b679d18069dc59a2cd253bd927b3e72d899926fed70d618b99f755705cf1ba32ee52b5899fe3bdb1b975ac99e38cf903fe5922de636e4a5b13b69125e80fac737f96e96d73b73bcdc27bbcb6114a43ee3fbb25b38f52ec5b93497a9e3d6cf52e5a49d01fa17fcaf2e3bfa1ace66a2733ed24175862b9fd926fd811af02e34fe83ff373288cb95f0000 serializedProgramBytesString: - serializedSignature: b1b2283527644ab904b8f8e07d71dc2cdd6d570338c1f5e100d442c2aaae7ec4385d5daf6dae51c28fa453b4e8947da2c8d2071efa260d674eea091b11df4a01 + serializedSignature: 154d1b20eec07dad05d4e71577c54d41b7b661b1788836b19d4d411db890334d854d18c68bd194426a1eadf78980b44ad9644ef1f77ea33c791128e52e77c105 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset b/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset index cd74815..2c625a9 100644 --- a/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset +++ b/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c94c5f3f0f7422f4a51a40a5111a29400a189a8f422559a082a04124224404c028235d87bef15152b362cd87befbdf7de7bf767799fdd673737cf733b977b6e6f2ebbbc7ffdc0f1b4d9d9efcef6ddd99c7ce6fd17ebe9fd358b4d6323596f369315b1e56c99f7af91deef52ef7fff4add9fca2abcdf12efef42ef594f965bcb97fcbfeeb176dedfe3bdab4a56e57db9822df47e4bc5f3e9acd8fbf778efdb62ef8adf5de4fd29f6de8ad5f73e9ac946b1296c326b1b6b538b8859e2a34a792fc6e3156becfd3d82adf69e160ba57820f9e2515befafe9de934af16ca9a7b47a6f2edb47446ba9f76ca1f74d052bf3642e10121b171533f10fe6ff0c93bfc3e5ef6ede9f26f2dff5e4bf1bcb7fc3f7f97d1ebbbd93bc3b02bcab648ef4fe34f0fefc21af47f9d74d46c9ebd1fe756ccb908ca640c618f93b56fe8e93bfe3bd3f0d19cbb92205fd933ddbddd761e117f27a07ff37b69f947f25b8f618c4d47b1342ef2f916178b2862a4e13e5371706758f95c5df8ddd249f4d0a3d5332f9b3c9e019d7e9aad0f329f2fed5f27a47f97ca9bc7f0db8f6f4c919177c8fed217fa706e5d73c9f16929f2fe52d0b315a26e5abf456e1ec0cd273bafc9d21bf592e655c0baef96f39f84686e7e5aef833a8a77a3e0be8e9b1add73cc836a0c79ea167b3e36932ffd814eca6a5d465ff10e3fd7d06f50e963adc2adfdf4bfece95bf73e2e12d78274978ca96facadf7de2df0dbb4edeeb297f0705d383ed2b75aa00f11ee4ebd7e083d0b7f2375605de9d174a77f5ee7cf9ee0af97c3db8e6bf957119e2dffc9bc1406ea17cb612dc53b28b40bac03456cf8bc1b7bae78be4ef02e47989fc5d883c5f1c8a73a90cef8024ba8eab45d7036ad1753fe4b9d275498abaf602cc61beacf4d3bcd103c006f8fd55209d56f9ef34ac0ac95a9d18efd881e0bbd5e09e92c3c3be2e2477ad94a1caf89d588d1d379a28ef9569eca2572d76a19e6376a19e2bd64b91e78af532e439c2ba8653b27ca3de9dcf92e79b8300d7835862deededb36cdc495ecbb2929533bc4c51bc61fe1b91285bfc9bcb1e2adfd9df97334ea55b85fc55f651190fabcb54792f5979b9c27fb7dec4a00eac19d02bd9f74de5efca5ade4f26a399fc3dc04046739f5393c549de1d01de55e1acf2e32fdee3d7bb49ee07833438583eab2fede3fad0fd06f2fe0da1fb0d91fb8d90fb8d83f76bda1e87005d0e097e133b547e7323b8f6f46c56149271987cef26a03394a79e6f087d572defdf0ce204bfab46be5b13faae51e8bb35c8778787be6b1cfaeef0e077ea7e4d1bee10f9fc163f8e4d5599bcdabf6e766a0ab694ec99caff47b260597ea4fc3d42debf155cf3f4f8c50fbf79572947a5df512139472597d37c5c121d0f65c176fc8121b647876ce56829f354a9db13c0cef9f363e4fbb705e589fb50dec6a0bccd3e91ef57cbfb97c8f76e97f70f0be9a59e6f083d1f07c285cf551aac97f7ef00d7fcf74a24bc35a1e7e1f00e0769039f1f117c2f769d7c7e67e8faae2469b35928cec7ca6fee06d71ebb16b9b5b03bb21676ea79a6d82979183bf51c637754f0bdb4d8a9b85ecfe2e576fd904d9e20e5dc03de55f7f9ef792c68fbe7f9325a2a9b6f1092779c7cff5e700de5de107aaecaf21b818e8af54df17bb11bc13dfebb9605db656ba55eb00e817a9d140af7a4905eca1eee03d7b0bc51e1dd1f0a6f2dce5fc9ae2963af678132b6457ff9fce8682cd9b189acd871e09e4c3b763cb8a7ea2d780fda806cfb0c54f59c2aab4e0469707cc8364e0cd9ec89d1d807e2a1d20dc643bd077556f5e8c99a789c92241ea782789c0cde57cf603ce47355f7d6c83f2d148fd334f13825c578a87afd744d3cce48128f33413c4e07efab67301eaace6e1c927f56281e6719c443b533ced6c4e39c24f13817c4e36cf0be7a06e3a1da30aa2cba125c7b7970cb71a1f7ce6781fa575cc37ca8e46c0cca69d31249f70b82bc129e5f18e229c7c7621785f4b828a4c7c5f2f90341fd13eaa8fb801eea3bf8fcc150fcd78638ad95f12b0fbd776948bf4be5f33521391b8372b61a8cd8d565214ee1e79787385d2e7fd785f45817e27405c2493d5775eb7d400ff51d7cae3885ebc0ab58b00ebc2a24ff6a162fb775dfabe70fc9fba721ef5d130ae79a5038d786e2a9daa1a08c88c9714506ca88b6aaad9e6edb5ce6ffd8cd21bb917d89d806166c536ff0e3d656b67fdb2a7d553ebe2524e7965ae47c9244c77358b06d7e260be6915b59b07d72ab2fb35d4fffbb76aa3fa7dae6b7056d4dc98bdd1692b73128af7db57c5ffec69e66c1f6deb921bdd4f30da1e7e340b8f0b94a836758b07df98cfc7d16096f4de879383cd5be3c3bf4fcbce07bb1e758b07da9aea3b4cd37b260db7ca3cfaec33db5b03b3f2427cc2e547e1bb353f23076ea39c6ee82e07b69b1537328ca9e2f66f1fa53d5c797807b326fb1b5ac26df0f91730e4cd62bb1dbe3efc7545c2f95d777489d1e06d75eda749c9f4447598ed6b44b555eb99305cb71196fb64e13fe15200eaa5d7a25b8a7daa577817b2a9cbbe3711df4837ca6ea8c7b40587781f7d533985eaa3c6f18927f6f281eaadeaa2d1eaa1d04e3a1daa5f769e2717f92783c00c2ba0fbcaf9ec178a8f1d74621f90f86e2f1a0413c54bbf4214d3c1e4e128f4740580f81f7d533180f55ef350ec97f34148f470de2a1daa58f69e2f17892783c01c27a0cbcaf9ec178d40fc97d9205ebf727e57355bf3fc582f57bf87bf55cb523ae0d3e67eb351cae8bc7a58bea4fa6db0e50faa83ef1f3529f47c0b5f74e973393c852f363aa2c7f8105ebe717a48c677c9d73eb07c38ebdc882f57325b80fe56d0ccacb5573b4d5f2fe6b2c58e6df00ee43b9afcaf71e0d5dabb27b7379ff2579ff1a70cdc3fd24f81e53fd9c1be5fb57859e6f0885137eaeda602aafa752ef2add1e0eeab68daa1f54bb55a5cdad719bd98ef9bfdb7e1292ad6cf6e590ec97a56c15cf503ab18d71d93d8e4564af91b25e09c97ec597bdad9ae7be3d24fb8eb8eceea342b2b174bf3318369afe8f85aec3e9ff7a28fd5f97bad645fa0fd3a795b8d6f553547bfb0d16289f6aece74d162f57de04eff2dfb75830ffbee5cbedaecaee06a130de61c132fc9d90dc7743cfdf95bf6f031dde96bfef8598bfe787ddb5b11f6ed7f9a1b4ff2094f67781fb50c78f5930cfabebbb7cb9ddd4fb2aeddf0fe9f1beaf4737b5aee2ee20cf9a74d8508b7eeabb71a1e71b42cfd700fdc173c5b4e6fb0f43e9afbe3f3cf43c2c5fd5576f84e4ab74f88805dbd51f85b885e3736fe8b90a4fb5bf543a7c12b2854f42b6f2290bf4eb6be4df177aaee4df1f7c2ff6190bb4cb23e7d1cf90e7e13c1a8ed7e7a1787d1e8ad717c178d570fe222837217ddf04e9cbcb6e55be63e5c003f23a1365884afb2f99be0cf98ac5f3ef57e05dfefb350b96215ffb727ba8b9f306a130be0df1fb3624f7bbd0f3efe4ef3740876fe4eff72c9877bff7c3ce9be8879ba7c69aaae5f31f43367d17b80f75fc8505cb10752dcb901e6abe5295213f84f4f8c1d76347d947652aad6a2b43c2faa9efc6859e6f083d5765c81dc1e78a69cdf73f85d25f7d7f78e87958be2a43be0cc957e9f0330b96213f87b885e3736fe879b80c51727e0dd9c2af215bf98d05cb1025ffbed0f3701922df8bfdceccca90df91e75819a2e2f547285e7f84e2f567305e359cff0cca4d48dfaf40faf276941a27ca4619a2daec7f317d19f23f16cfbfff03eff2dfbf59b00cf9db979bafe6381a84c2f837c4efdf90dcff42cfff93bfff001dfef17f73180be45d71ed85dd538e7ff6546b68abe5f31ca62d43c47da0638e5afff268e85a9621f96a4d8eb4999c58480fc9365fcd5b3c18e489952109faa9efc6859e6f083d5765c8c6e073c5b4e6fb7aa1f457df1f1e7a1e96afca90bf42f2553aa8754477806bc82d1c9f7b43cfc365884a8786415bc869188c578e5a77745f48fe7da1e7e13244be97a3d627a55986d47c9f6a19a2e2d52414af50deca691a8c570de7a641b9e1f415d7a00ce9a1d6e6999421a1b1879c662c30f620aebd77fab44c224b8d9b48fbcf69ce0265468e5cebd6679caf779fea60d8394adfdb82f272360bc9db1892f70b0be6afcd43f67803b80fe5b660c1fcafae531973c7ca5a15f7962c71cd870ab7150b94bf392dc17dfedb3ac4adb52f63a05a2bd920246fcb909d6d1992db26f4bc8dfcdd82258c3bd6c86c1bfaa66d48e65641dbadb19bcde332c53b807b4e3bf9cde3e0da8b57bff2e0fb6aee1b7d7f2dd01f7ef7300be653951f559cda87e2d43e142795fef705e53395073a84ec538d8f2a791d83b620aed577fcb753c87e3bf9f129b827f89e2ae773b696ef3f01aef96f6779ff86907e9d437a3e19bccfc018b1fa46c541c41596a12a6ee3c035b4f3f0f75b197edfdef0fb1686dfb78cf67d4d7857d7f2fe03b584776f9adfb730fcbebde1f75b197ebf45f07b95076bda308a8face3fae6b178790bc38952c7a9b23997c5f3811c43cad946cab9125c7b79735059e8bd5c162803c435d47bdba09db0e3c17dfedb453e7f2a24b74b48fe937ebc079d189453134e488efa9e1d1792f374e8f93120ee51d7aaabbd718ae3762c584f6de7331b9ce7eb3e78be7c5ff6f173ba06d92979395d43f23686e49d1b9423e68a92c54185d72d94a6dd7c793bfd107a2f2f94a6cad614ebee211bbb12dce7bfdb87d254e939093c07d74cada77986053928793b84b8ee20f5fe22f87e8d7e3b066d4ec9a991db23a4ff3af01dd42ffcbe9c231aa2f2e6959a78411b54726a4b9f643676a994d513c850e1f562896d2ab9162ba7370bb6a97a81fbfc373fc434df9731b49d94d32024af2f0b964f7d4372fb859ef793bf054047b98635a77ffc9e78aeeef1df3e52ce75e0dad36b67555e360ce9352014ee80905e0359b00d33507ebf3614defda1f07e08c951fc1bc419a9673576d78b05cae82107836ff97b1719d881b2a58906321e03b292c950ef3f2eed60700aef7693bf4fd4223b998c2781ac54f453f9fa2983309f06b25209539585cf1884f92c90954a986abfd37306613e2f7ffb00192ff8e93be98314be4ff6ec65f9fb8afcd5ed9393fda59ab24beda57d185c7bf96eb7f949c27bd597c9b7388b6b3577fa867f7fb26a9ba8798ad7e37a4c4965fe32d93339279203f7f9a97ae01df00eec6fa9e76a8e31151dde93e1eca409e77df08e2e9c0f2284b38ffcdd0a84f361308d22ef414cf64cee95661fb1f46d58c5f3630319724c817d62ae47ce10161cffe4d79e0d8f506df1cfe4af9c6f4b794fba6ad77c2a7fbf8c7f57b42ea8438d2e70efbd1a535776f0b57c67284bb429b51e35bcef573d2f06dfea9e2f92bfdf20cfd5bedf6f91e78b43bacab9b39c5d92e83aae165d77a945d7ef91e74ad71f90e7615de51c5cceae49745d538baebbd6a2eb4fc873a5ebcfc8f3b0ae724c3007fa2409eb7a3822ab187c9b4cd75f91e74ad7df90e7615d7f97e10d4ba2eb3d88ac62f06d325dff409e2b5dff449e87755563d7c393e8fa1722ab187c9b4cd7bf91e74ad77f52d4355c668c003aff8bbc2be7a17246c9e7ebc135ff1d199721feed957f63a70665f07f26cbb7b11808db2be3c6cd40f41d1d0f2b96a3d73726cbd09cb1217da57f9b9c3140df31bebee1f06af445f26e405ffeef82901cd5a719976813b1fae01d9dec0621d949eaa198ea0bb562c9eb32f5be5a4bdb58ded7d547bbca7714a3dda53ecf826b1ed7bffdefc62b5f09aa7db726f4ddc3e09aff8e07fcc7fbb2c6cbf98ff18b43b2c681f7a02cf59d1a0bd2c539accfc4900ce93b68f73e88ad4d02b6169a7faa492be9ef2047f9075a0faef9ef6410d7c920dc26e0dffc7702b83741eaa55874c2df99f00ca2fb1e40f7e688ee6a0e6946487769c339d3e5fde7c035ff9d9668d335e1ce02e16e8e84db42be3b3b14ee6cf9bb67285ce94728672688bff253a4c2557e959e05d79ccf23889e7b013d5bb140d93351f5efc236a8c278381846cdfbc9d20086c1af5bcbdf364cdb6f89817928950f850f2f995727abf5a8c9f2ba9c038aa97868f2ba70c306fb53c9e4b5f7df9d914ab924e76d621df1b0b57e5376f2994e9a2fbfefc4823e52928529e782629d9384b96f6298b12e32dd9395252a8c5cffdd5dff48e15d355706dab13973a41d3c0fae55daaab2973f7fa176f9c2d716b4cfb92c689f737d9653d4baaffce06fcede80c1362c985795ff313546bf2f0be655c931679fb88c1cd59f046b77b5fa2bbdd53880f2e5f330b8e67a1fe9b316bffcfd3e29c8e7ef27f3a1a7d2467d0fdbedafcbf0e7b3e018f97ca9cf37be7c9eed31f9b1ede46fd790cc4229f345708dd9a8fa46f9d77a49de57f3c94580f902708fff2e64c1b1cc85beee5365d936f589e07735f3cad877df2489ab1a8f547d5d9d7f37159762c07907796f5188f3223fcc69d785be2d49fc36d60dbc03db50eab99a9fb83a745f96d539a52c68cfa5f2773160bb3851f71cd55e0ff92ecc91be0ba7cd0ebda7fc8abdc482712a0bdecf5902ee43f98f87e42bdf122a3e3b86e42adf5b2f836bccce547ddc03e8ac6b8ff60cb14c96af94afaede49c255ed996580abf46b385de5ddfe49def926a85f4d7dbb3cfe6ead6d0fe553703db8e6bfe52cd8f650fbd3d5b84903dfad62a00c01632a3155c626f37918d61bfa080bb71374e594aac33a69eeb563c9cb5e954eb22c8d299f87c9c66bd7483d95cfbb57c0b5971e3393ad7f92eb5366aaf548e1b8039f6e31357fa4d24cae0599a9d691ca3e554ced29937ed47294afb797c1351627f50df471a66c63007847970f0602fd3c99b3427ace3a98d51ec7daec52f9315c0fae95bed02e5726da5e42b8d0f7e0a050b8edc02fbfaf7c68a632f6aae4431f85b5c54bf9125a0faef9ef41a17849df3139d0276238dc4341b8b5f56daa43e156cbdfc342e14a7f5039d03f9b9cf38aed049ef1df352c5897cbfc111b22afd518daabe05ac589ff1e11fafe8824f62afd48e61c19d74bfcdbb3b7d9aabd3a18dc076959f39edac322db5db1a17878b15d58adfd811a0ecaa7d86be09aff1e1dd2e3685f8fbd6684be3f56bef73ab8c6bee7bf470106474999e70665c67605cf617ff02816cfab2a7d770ba64b6c1890afee0d07f754186acccce354a8f6cc876df43886976bc9cae591f277540a36017cde887f7b3ce6ac0dd9c4f12196ea3db5767f740a3631a6769b8829dfd1322f68eb3d594ece5576abca62e5eb29ddb2985f6beae2a49c659b35363e09e714ebd9981cd74a56e747d52f61ae54f9b57a185c7b2cf74ed6670ddbe44940e7503b23e1dd53c0bb13f4efc6d4d895f241b51e5cf3df53e332c4bff92ff491a5fa1ec0974c8ef47395738694f906b8863c94bf8d8de0dae3b16f59e87db5f645f9977a135c83f7639382dfe528ff1a6ff94c73941f99c9219d1b001953923c9b9ae4d91e499e4d4bf26c3ad38e1de5281f57fc1de5037c2678c67f953fab17c13596ff67c9df3d812efc57f9ac7a155c633254bf48f939db2bfe4ea16acf0df0d3649eecefc7e604758663624caee1893a2616a97d733ee0a8c656c27940f6577294bfadf5e09aff2a3f5d6f806bfebd5a9faef659aab19324f3eeb17d59ca634f4cf216e54893d03d5946e7285f60af806b8fff7cd556d7f529d4bdf680cdbcda754faaabf26903748d295fee1dc0bdf966e1c454789d814c3506b935b8375cdeeb02ee15ca7be3d20b3b614e45f9597b165c7bec17ac92d7ca8fdaf3e01ac841bf7f20180eec37c6d498cf2ef237eada987e7e180b65ff3db690c5f33bd7612d0b9607ea5ad5a76a9ce152161c3bb954cabd2924efb2b8eeea5bb53f2956c482ed02f57c0390a17b1ec59741325b92e33b35f9e1b138cba16bcd64277d26fb5331382696eeda95cb258b6bc0b5970e4572dd634ccd3fc9fd8e5a9bff12c80cb5e172d685e4aff3e517abf24c8eb9a93d6bb5e7a9063131773a8e15b34256cef2c5e6453e1296ea5135eacbda0fa91173cb625725e3a7d5f060abd86aefd362dd493133c5393455acc0cb23ba9362da8b7eaa0a7da4f8bbd07ba354087d372721883b1382e0ca9579ff1783636e2abdfb63c52939fca09b52ef496f36d1fbe55fcd677dd95cefffa094595eb0656c857735c3fbbb5cc89befa99df8666d51e247e284bf99e6c9f44fec59eadd5140cbbdeb32a1e174f1f74aa169b1d07ebc77af4a9c1fb48c95b011deef2a115a62dc2bbc7febc29c2191e975d41fdc83ddf78f0752c934ca8b0dd73e5fe49fff4b91ba48118ebee1bb321fd6cf172b278e4f4889ff63e817327ce1c87829a3af40160bdcebc7f2c59afe690904a3c73131867afbf6790f64fd93c6454f862777471183780adff9c3031b965e7462f706c1a815b07cb114a6532d514b0696cbcb13b3e651a2d0a041fd3e5cd130fe980ebf587e333d8bf8fdf74ac57bd113a0a1a8fc820920860e6678ff58e5fd2913e5db724f247f3cd5fb53e809e2ca26a44f1f2eac91409c5881d6a6260639470759ac6d9a5127368e1d15971c73e39a58c431e78bd654bb24c68885259a4bf5649b496597b76f3868caf85dce68ffc6a4fe8376eeb3d3a50df4e9d354a44f3aa16229544f97424db39d0d6a2ff793a54fb39a78c5d387ffa767d81cb1f1da74c008d6d7116c563736ce754fcfc6f9844caf10433dbfcd93da60320d30820d7404c568d1cc2c129ce269b89f6c2da6c7b045ca0c5b0a86ed1362978a0e18c5861a8a7d38c5563ab59a84d4e21a21821b61825b1b0a6e8c09dec25070139d416d96ed2cc99f2d17520abd77a39b131f83ec112ed6f4f6d406c993b5ab805953535dda70845b69b50a274e1b3c719a6192db9a4a6e8e496e672a79339d41091f21d96faba75747f2b2a66dca75640796aca91db586dc5c474f8c94ed4d4a2f710849fd6b84f7ed628fc34a312eb0c2fb5e37e4949c68c7944bfb4e82662ed30d8445d30823dc4267f91cfbd658b2878dbf036efc2d75c279889d5329a63be1825b6182bb180a6e8d1504b9a605c11698e46d34926351246fa9cb242deba688e9eb7525a217317c2df21609b6a6cf12db252d60b0f031f36fa34b15ceaeab5ea570b26c8727cb56ba641186bb471693451d751e3d51b6f7b46c955a23a29b48933609d14a163896226db102a97b060aa4765826cc33cddeed31c93b984aeea0b323514e9566a50e9cce46b1099e8a7169cbc528380fa7528cd1967a754cb17717fe7bb427b5422477bc36529292db1d5ff8bcb5269d195a24f410e6d78b31429d3173ed88a57b4fd374ef8449ee652a796b9d4589fa29bb0398fea860595aa5135f86de25e556693ec3462793eb80a57a675dda70827d30b5c2c9938f274f174c78df0c08cfc5acaa9fa9556d83492e3095bcadce5e45ab674e164bc0119ef29542a67f7fa6b0927049a1de4a6ebdfd6b6204c685455ba4734229162d5cbed4aabbd828bd42bc171306a2cf150345ae300d11cb23dbe9ec81a71a5fe5da2414f9013a331e889b44574cf8e00c08df1eb3e49d4c2db91b267988a9e4ee98e49d4d25e7e924f3762c5ff19ad8400c4bee864bde412799f7e2f83a26935edc8e98e05d0d05f7c004ef6628b827267898a1e05e98e0e186827b630637c2d4e0f23195471aaadc072b3446a522384981d117cb22a34db3483f8cf2180de548a3060598e4b1a6e9d71f933cce54f2004cf278531a037592799b8b6f01486c733d302c4a9b6b10a6f60453208331c9134d25ef84499e642a79082679b2a9e49d7592f9d0015fbf6f3a743014b390a95a0b89d62adf052b99f6302c9976c5b49e9601ad77c3784fcf00ef613ae17c6e6946cdcb71e1ff79ff25086f8e0b1f8e693e53a379d3889a8fc00c7c96c6c02395522331267b6a9854ebd44ec26414267cb646f8a911858fc684efa511be36a2f0311ae1f962f8750dcbee2c917e71f2582f663c3438479f382ea556a74ef37e17092df87dae45ed8b9a93f736e7d4f001bd4d31ce3a9aa5bec49a3e167c2b4e53d17ed3f757f99c5f9e653a63bddfb13a83e7eb21f87e20edcabb79cc9fc2e0e12f93abee968bd4e4f74bbddf843cd108cf13e3b0126e5f4d09178b58c28dd7653831b6beac4e33dc68ef6fbeb4bb52fc7ba54cde1922ecf8124493acc47744451b9c9e2f8cb65f0a469b09ed3173dc1d2b7f0b35e56fd758b4f27702267c8146787944e113b1da74a1a6368dd45c9c846591224d166111b3c8642cff17ebf27f0b91ffe7793dd47922218b84a9cd139b492a44191625ef4fc1c25ea40bbb25087b9ec88e5535e5e624a94b94d0a7ea42e7b57189a61aeac3aba1c5f1723f1ccede78387b60b12cd5c5722b19cbbede9f9535333e705d73fabca7619aeca7d3a47380f70891b58bbcd69797358456cbe4df5560662ab0fe3a8266d3b1b45882a545595a69314357218829d16cce75a7b2b7425fac73674ae151e34e6891be8ce9a7bb936e4140c8cdc46c67b9ce765a01db29cf88edcec2c22fd785bf45c076797ba944ee81e25aa46ba57b62f5c7fe9afaa34fbd68f5c76cac94afc84029bf17a679a546f3b511359fa313ce3172b743b50e0a24e13d1713bc4297e6bc5f38d933c75c506e72fb2e14add41291dab96226a8cafb2d147fabdc9debbdbbc8fbbb5cb664734569c7dbb23dc5374bbc7f978bbccff376ae90bec893b1c20bbc4a7ce75bd402c637552e8914cbbdb1b459a9499b3722a6cd3e3ae13c7772b74e4623befbea24f3f60edf406ed4de998725fb6a5db2b716595dbf05887748e6c80e549424998f6970a04e838e81c2a6764df85b15c20ca3e854a8d38957910731a48ae41eaea257910bb0b81f82d39f1a327f15d3d1351dc528315da8d1205fac2ecae66609b8212cbdcd12876a12265facc349dc16914a68d26398ff5f2364eca19ae9f75da4120056f7176126b14667126d407628aee91e8e97edc555066d80624c8fc371d3f4f5582c6a81226914e96bb008d3e0089d065b6a494c967d96f4b528c1b43852a705ecb3f1d04abc544f3fecc558d847e9c2de8c256b874509b7142bfe8ec68abf63d22afef6c3e277ac2e7ead6a29fe56451e0f5ba20b9f177ec7e9e2c94b93e343c54238b06a3cb0320cea0918d413d382ba14837a920e6a7301758628ae4a64c34d218e82721986f2640ce529e9a35cae0b8cb7e24e6589adb85f1a456bc59563fc4ec3f8295eb9c21473d9eede2f2ffca3f0db1f8bd2e99a280d6d1c2d4a1598f03334c2e747145ea913cefb52dc499b695faa0a137e9646789388c2576058ced66039312296953ae1bc88e6fecd8c9aec076092cf3595bc0a03729e0e489368405663c2cfd708af6a164df881989d5c9001233c48233c5facc4a65d6c3f53768b578bb67d892853a0ccf864156f60267b9bb790fd61db15428fe46d69eecd2eb5ad68dc879cbfc89e4e57aca17c30564e5fac533f42517c884e30378f4b52115c8d0b3e542798e780b59a1c30bb79b41c70984e387fff52965801e78bd5fee96d18e77eda1ad667fe7fbdbdff34757792cdd4d53a3d7933e8728d9ea219b4cefb9323cced0a616ebd93989b6e6e37bac145696eadc14a9e2b35254f4ec492e7704cf8551ae1f5220a3f02cb40dc5b5e4243874fb9e9e8e67ac5631f2fcfe4ca3e6fb1c791ff9b8f0772b2b00fc21b482bbc7ff7122380bd448f68996874e6b2789f8d4bec2b242e1205e352f19ddf402d150dac833c4d0f6143bcdf02ef779b48b9fb482c9f5ca3b33f9e4fae3533f8a330cceb7598e7670473fa3073bde6c562595be586baf2b96c85988e2a14e1e4caefcb85dc12a145a5f77fb4e4385a47879789d769cac4bd5b452b138fd108cf17db74b2b90976b8d841c63b08d187b5aed75539daaaf806a6df029b3c74ac723d56972c9cdc8d3a85c24972039e24c7e992446c6ecae636b370f5102d516e4a39513630fd16b3dac2c792e5785db2f06afce6549265199e2c276082f9c9e6e149d08b74154d12e1276279fc564d1eefda3a5a1e3f09d3fc368de68d226a7e32a6f9468de6df44d4fc14ac62b85d5731309dea490ad65331d5efd0a87eeb16d1543f0d137ea74678cbb6d1849fae13ce1b3d7731f3bedc1998f0bb3320fc4c4cf83d19107e964e38ef85de9b4adebf08177c366687f7a5223889099e8359c9fd1a2bf925a2959cab13cedf7f8021edb80799513bee3c0cd343baecca977a456dc7f1dacec626f3f918ea8731d48f98a1be0043fda80ef5828ca176a7d97c2196b51ed364adc61da365ad8bb062ecf10c14631763c29fc880f04bb032f249c332722d66914f1996919762389ed6e0d0ee684982e332cc4a9ed115c011ade4729d70de457836152449ba08eb30c1cf190abe0263fd7c064cef4a9d70de0e7d2115ad93b441afc212f1454d22ded3295a225e8d097f4923fcc8ada309bf0613feb246f8c4ced1845f8b097f4523bc5d9768c2d76396f26a062ce53a4cf86b19107ebd4e38ef5fbf9e8a196ec005dfa013cc0b367ed64d429dcc77b746ad93ab0293d0d11a3ed16acf1bb1b8bca98b0b7f901b08354a58376161bda50b0bae625998307592fe4a920d98166febb480ab7996caf689bfaa337d0d6ec6347847a7415306d7b2ec292ca32a62d57a0b5642bcab2b7eb6895642dc8a65e2f73290896fc3347f5fa3f9d51135df8869fe410634bf1dd3fc438de6f5b78da6f91d98e61f6540f33b31fbfc58679fdcb9c35c5996ede3950d7365393444f60bfc7bb3c56f2fb6abf7f7685066f94b56cbe4dae672efde6251beac120399c5e26e51c432ed2e4cff4f74faf35df1718d94d79edc9a380d91f1d94733bde097d9e13ece52f14665cdaaede5e26e91283dfc41d9d5e2cb2871ba5b17276e209fd63c08753c3ff3fe346cc4fcff7afbff45eb7bde8319d9e71a23ab1fd1c8eec5847fa111de20a2f0fb30e15f6a84378c28fc7eccbcbed29957d794b287df75cef77efbcb7b7e5639880d90ef0ef47ea318cc0398c17c8d19cc37c606f32016e6b75898df1987f91096d4df67a0247c58279c3721f94961264dc84730523f62a47ee2a41a4052d1383d8a71fa39039c1ed309e7ebb0f8898a46ebb01ed749e6b5e8af2cb116fd6068b45af4094ceddf4cd57e1293fcbba9e4a730c97f984a7e1a93fca7a9e4677492f91a667ec09ed16ea06731c9ff3395fc1c46e36f531acfeb24f3dece3fa9142a499cd9bc80e5957f3579e5815da3e5951731adff33d4fa254c309fe83311fc328623164bc4d169b768385ed109e715594e4cd308e04d8c69a2fdb75a78ce885291bf8a45a39e261ae511a3f11a26bcbe46f8ba88c25fc752b68161cabe8169dd50a3f5b111b57e13d3ba91a1d66fe904f31ab871ccbc067e1b13de2403c2dfc18cbda9ced8d5266ceef78f3b13500fd21f3079170bbf992e7cb8116c1e9b09269cf81ec903bcbffd2b9e11a3edec780f83dc3c0390dfc722b9992e926aa77981dcd459c932b1d3ed034c87cd753a7446414f153af9be82fc5eb25ffa2d179faa3343a368f62196e55b68b2fc27c3a265f98f74c2795ddf326658d77fac93cc77c6b54aa53049e2abf3134c706b43c19f6282b73014fc1996825b6a52b0ff886829f83966b86d7486db4e5caacdfa935870ab3e7f8d1b6da1f79cef64f2b7ee4731d62fb0a86ea5896a59c4a87e8925505bc304fa0a63d84ec7b099c8fc7c0979255b2178a5e386eb6b5d985b89179125f01d62e9ec04fc068b5b475ddcfceda353bcf8c4ad645a8d454489dfb7ba707925d049173fbe1770eb58da7b01bfc36076c66076490be6f718ccdc5461f2c5a9bc7e8a662c3f6030b7c1606e9b3ecc1f75817198db6130bba605f3270ce6f678ae0bc21c2d2afe28207fc64076c340764f1fe42f18c83c0ce40e6981fc1503b963aa56193fdf240accdf30983d30983dd387f93b06b31706b3775a30ffc060e6eb6036d7c0e46dede55e93300aca3f31947d30947dd347f9972e30de98efa769cc6b574b2769ccff0f4ba7022c9dfaa7954e7f63e93440974e2d6ad2693af38fc2e3936c23e5045689aebd9024b5fec1526b20965a83d24fad7fb1880ec6baa025a2d9c63df6ad103e94968bfaa6920df75e9c2af27994c8fe8785bf932efc0e2cde33aa5d8ff41cf3b018a2d1109d46d05950a1587f522ae63ca12128ff6ce9f71f63984e3beb74da8a61fd47d85288eb1745931c4c93a151ed25be5f324af8f5b0f07749d75ee27aa4672ff5318d76d56904bd5e568ad65a95916534c042df2dd910926f19d01a78acd3a95a1aeac217078818f69a1ae904f3bede704d5fef9171d1fa7a8d316a23b06a38e8be24ee212e0aab26ba50f980d3c898b953fca6589446e9a2d41a64ccb8198cf74c52791af1175944895e334c83d1b5159ca968925ee66c8ee934a6b6e22aaecb28515016b27486d736c3c21f9b6a7185eb911e91cd318dc661cdf9444d66c8fd9251c26d81853bbeb62a0c0f3f3d022db16cb8bb3e1b0e8b920d5b61d19ca08ba6bf0631d87f8f5a02b7c60aca89ba79ac89d10aca2d74c2f9a4cd24c3499b2db144989c81b2b00d86648a06c9b08848b6c2844fd508bf29a2f0b698f9ec916ac5948e09b5c3a2344d13a5072246a93d267cba46f837118577c084cfd008ef39299af08e5862ccc4668ec29ee3726b7cc7e5a6e93cb31316c1599a08ce8f18c1ad31e17b6a84af8d28bc33466f36d620494e2fbaefbd2e58f4f6d2352123462f17133e4723fc8788c2b7c1d8cdd5b16b246a91b1a222f4cfcc8c42695b2cacbd6bebbf04c34caf32de0ec3b88f06e3a8a9d13076c5a2b62f36061cf7b3079d4e4789d0f65884e66922d4728f6811ea8645687eb2b4e2cb057823ba5ccc11a7dfd7ec8e855e88b76da0af50eebb3b5ac5948785b8002b81e32126869c9e85ee8025e8424d825e372d5a82ee8845b008eb9fc4a3c38794f832f999debd896c08531b9fa244ae07167eb12efccd01e01535993e3d63ea8985bc28cac0051fb2e0b3873e8328e1f7c292b54493ac5da7474bd6de58e41663394535db60c113253af958744a75d199112d3a7d30e1fb69843f1351785f8cd512bc90e69efafddd24e9d1ea878559964a2f2d1de7b50518c2a5baa6d6cc6808fb63d15986cd56f8037ef0c0047f8364f412640016f6727ca6c4cfc755a0179f5e1932100bbb3cfae0673a631a83b0f0f7c74c376846ca8ca384391833a40a8d214d9d1dcd9076c22254a98b505b0697fbe482c53ddce1545168b86a48c486d4104c972aac2bdc93a9133f4ad30e75670cef0a5d573822dea1589456eaa2c40fb21f296610f9244d59cdb6b778913784256e695ee6ddf70f44894f464501b00b06e0000d80172202d8151bf559a51df5a9de2dcaa8cf6e98e6ab359affb15734cd87619a1f9881f1aae198f08332207c0426fce00c081f89313f44c3bc684e34e6a3b0ec722856bcc2d2c89f5d8bba166a3416a1c334117a256284c660c2ab35c23f89287c2c267c8d4678a7b9d1848fc3841fae6b0146143e1e4be72374e9dc2494cec5919769ed8e45e6484d64daed1d2d3213b0c81ca58b0c9c5fe1ebe7b9d1a6b75c6a2216eed1ba7075f32b89e1a7d7619ea4d1243fd7bb8c65f3bc9f99cc3fd6b6c00b3dbdf37e8ea989471c5cfe363c1e895ead5309ed584f5e632e8e439bba2f637fefc3d807de9f76debffbefcbb0e3878f8be98f004a254ccccbe764cc5a8ec7ac74b827d74f834a2f9c5122dbf9ce55a2d8c6142cdc13b0229dc7d1dfeb520a463ba28439150bf344ac21094ffaca4d333fee81857a1216ea34a6dcb74d64fed9bb5591f94ec3423d194b57befc658968351e209cc6a517dbe958917a8aa6483d78df6845ea0c4cf8a9ba3a39a2f09918b1d374c4dab0c44686dfede1eefbf811827ec95514b9e3310b8be4e9ba4a695eb448ee8945f20ccc18e366902b0a141ee1a8519a8d45e94c4d9486468cd25e3ae17c16e9ac5892a3b2c301f4c0039883697fb646fb23236a3f174b90737409c227dc552d3dbc9645865112686f4c8b73755a706f09e136436ddaa4d782d807437f9e06fddef3a3a1df17137ebe46785944e1f330e117e872716134e1f331e1176a845747145e8809bf4823fcef88c21760c22fd68daa2c88267c2166c59760835673036b89668bd913fd399ffb442cf28a305dd662ed1b7db851c22cc6e05eaa81dbbc281adc453ae17c24f5b298a12388129d643ec37479cc7cd3ef628cc93a0d931f223229c5845fa1113e55872589f0fd74c27943edca98e19ed9253ac97c40feaa98d952dd322c25afce404a2ec5785c63ca631926f95a53c9cb759239c0f5a9904ee223b81c4bc2eb0c93707f8cc5f5a62c2a30c937984aaec424df682ab90ac37c9321e6153ac1dcefd586540427f17bb512b3b89b0d2dee004cf02d86825761a977ab69eaadd68d3f6deb5dc6f871bfd93f4bcfe4a0b0e42354b7e9d2403b86b4518c21edc8f063cdcc8e33d3a7c481ba34e629717b2ac6c37546041f8419cf1da6c673305697dd9981baec104cf85d19107e28c6e46e532687e932149f9d8c2da9930c9578e0a31afecc5cd6ba27e5ac75afc85af949b25666f4c53259b52eddb99ddc974a26abc6937d0d26f87e43c18763821f30147c0496051e34cd024762921f32957c1426f96153c94763921f31957c0c568e3d9a8172ec584cedc74cd53e4e279997638fa76277f7e2d5d1f13ac1bc8ff7442a829338173d0103fd6406409f88e178ca10c74958fe7eda307f9f8c717ec690f32918e76733c0f9540cc77386384ec3043f6f28f8748cf30b869ccfc038bf9801ce6762385e32c4711626f86543c167639c5f31e47c0ec6f9d50c703e17c3f19a218ef3b092ff75d392ff7c8cc71b19e07101c6e34d431e176282df32147c1186e3ed0ce0b81813fe4e06845fa213cec7c6df4d05499241f4b598edbd676a7b97623cdecf008fcb3013f9c0d0442ec7047f6828781d86e3a30ce0b80213fe7106845f89d9de2786b67715a6f5a719d0fa6a4cf86719107e0d26fcf30c08bf1613fe450684afd78d6974f52e63fbb1ba18d3d09d6495d9118d2f53b1d22b7062d761e6ff95a1f95f8fa5f3d71948e71bb0f1eb6f0cc7af6fc4c636bf351cdbbc0913fc9da1e00d5815f7bd6915773326f90753c9b760927f34957c2b26f92753c9b761f6fc7306ec7923a6f62fa66adf8ea9fd6b06d4be0353fb3753b5efc446317e371cc5b80beb9cfd61d839bb1b03fd670640df83e1f8cb10c7bd5883f07f860dc2fb30ce7f1b72be1fe3fc4f06383f80e1f8d710c78398e0ff0c053f84716639669c1fc638c772cc393f82e1c84945eb24381ec504d73314fc18c6b9be21e7c731ce0d32c0f9090c4743431c4f625a37ca80d64f61c21b6740f8d35883b7492a489234789fd109e67d8fa6a908be0217fc2ca67133438d9fc304373714fc3cd62ed82cc7b05df00226797353c92f6246d7220346f712a6764b53b55fc624b73295fc0a26b9b5a9e45731bbdbc2d0ee5ec3046f6928f8758c451b53166f6066b75506ccee4d4c78db0c087f0b63d2ce94c9db3ac97ca15efb549231c942bd77b06674875404276946bf8b8d47744c457092f188f730c89d4c21bf8f49deda54f207582eec6c980b3fc4ccb94b06ccf923acface35acbe3fc6706c6388e313ac71b7ad61e3ee534ce3ed0c35fe0c13dcd550f0e7188aed0d517c8169dccd50e32f315bee9e015bfe0a139e9701e15f6305c70ea605c73758b9bfa361b9ff2d56eef7302cf7bfc3cafd9e86e5fef718e45ea6907fc024f73695fc239657f20df3ca4f9839f7c98039ff8c95fb7d0dcbfd5f301cfd0c71fc8a1576058685dd6f98c6fd0d35fe1d133cc050f01f188a818628fec4341e64a8f15f982d0fce802dff0f13be530684ff8d151c434c0b8e7fb0727f67c372ff5facdc1f6a58eeff8795fbbb1896fb7cd4560b795753c8314cf26ea692737492791618669857eae90473731e9e0173aeaf13cecbfd1186e57e030cc748431c0d7582790c471916768d308d471b6adc18133cc65070130cc55843144d318dc7196adc0ccb7ee34db35f734cf2eea69237c3f2df840ce4bfcd31d2130d49b7c0044f3214dc12c3313903385a61c2a76440786bcc44a69a9ac8163ac9bceadec3b0eade52279857ddd30cabee363ac15c91e98655f75698ddcd30b4bbb6586137d3b0b06b8799c52c53b3688fa9bca7a1ca1db06c323b03d9a423267caf0c08ef84c19e630a7b6b4cedb91950bbb34e389ff7dedb70debb8b4e7067ef729f5404df800bcec570ec9b011cdb60a938cf3415b7c5d49e9f01b5b7c3d42e3455bb2ba6f6820ca8bd3d66230b0d6da41bc6a3c89447778c47710678e461c2176540f80e18931253263b626a2fce80da3d30e1a51910de1313be5f0684f7c2842fc980f0de98f0b20c08cfc74c65a9a9a9f4c1242f3395dc176b502e376c50f6c31a94e5860dca029de06dbdcbfd53119c64c9787f4c7085a1e00158b3afd2b0d937106b5b5719b6ad0761f6b6c2d4de06631970650632e04e98f00332207c08c6649529939db1dee26ac3dee2502c0f1e68980777c1041f642878574cf0c1868277c3041f6228781826f85043c1c331c187190a1e81995bb5a1b98dc472c81ad31c324a2799bb123b3c159593b8121b8db138c290c5188cc591a62cc6622c8e3264310e53f9685395c763928f3195bc3b26f95853c91330c9c7994a9e88493ede54f224cc9a4f30b4e6c998ca279aaa3c05b3e6930cad792aa6f2c9a62aef81513ec590f2349d607e78cda939e687d74cc7849f9601e133b0543cdd301567625a9f9101ad67610979a66142ee89697d5606b49e8db13edb90f55e188e730c71ccc1709c9b011c73b17c7e9e693edf1be371be218f7d7482b9dbfb0b52119ce49cf97d31d3b8d0d034e661902f32853c1f937cb1a9e442ac737c8961e778012678ada1e085188b4b4d5914612a5f66a8723166ca971b9af2228cc53a53162598ca5718aabc18137ca5a1e0522c5b5f6598adf7c3205f6d0a79096670d7181a5c1926f85a43c14b31c1eb0d052fc3205f670a793956415d6f5841956315f60d19a8b0f7c7acf946436baec070dc6488a3124bc10da6295885a97cb3a1ca2b306bbec5d09a5762a6716b064ce300cc346e33348d5518e78d869c5763386ecf008e0331adef30d4fa204ceb3b33a0f5c15822de65988887605adf9d01ad0fc558df63c8fa304ceb7b33a07535c6fa3e43d66bb0f2e37ec3f2e3704cf00386828fc0043f6828f848acf47fc8b4f43f0a93fcb0a9e4a331c98f984a3e0693fca8a9e46331c98f994a3e0ecbdb8f1be6ede331959f3055f904acd4783203a5c68998da4f99aa7d1246fa6943d227eb04f303109fc9c9cc0188a7609a3f6ba8f9a998e6cf6548f3d3b03ae079c33ae074ac447dc1b0443d43275838c6cec980636cccb85f3235eeb330c92f9b4a3e5b27999fb1f64a8e7ab9162049ce583b071b9678d57058e25ccc3e5e33b48ff330c1af1b0a3e1fcbe46f1866f20b308b7e3303167d2196c1df32cce0176106fdb6a9415f8c497ec754f22558c5f86e062ac6b598e1bd67687897623cde37e57119a6f207862a5f8ea9fca1a9caeb30c91f994abe0283f1718ee640d213c5e5343692cd6445c27fb1efeb78a9f8b77fdc3cf775cc0fbaf67d1d8faf7973b4380498bf318d158ba7feb1c015acb7380678ba785ae4495c21bc1373b9f16ff881f2eaf8d32236c6fbcaf7875c29bf8d7b34f67d2b970a6fc8c127be7e055e0ce7258905f7a3bcc2fb7725087d863c70dd9719943acbfbaa34e231ec5762d43fd1511f52437dbac761021be13daaf41ecc6455c2c774a9f8f53d4b73edc67bfff23fe77a85f5851ea4c3cfb82feae58cfb8a2ef4e21a2546576131fa5417a362623baa6253857fed1269273c686e13855edc79ec52b79964b4d249f9ab314e9fe938cdacb3fc969c9039876b300e9feb380c67d8e969307dfc782d67e5220f700fec65c2e77aa98c4fed1232971faec5e2f7852e7ea3d1f8259e0de7c772acb0f2c4a7e118c083d6530d214a3cd763f1fc5217cf3984f63cd638dfe3393f0a91eb30225fe9884c8f6cd9a3d9fedea785b2dc5f9db26567d3faafc7187cad63c03b4cfa7a7ab8973a15a2d6f7092c14e5544582a6b066c79ec4654589c90d584cbed1c56470282690ae795cf4d2a2c4e6462c36df62a5ae5e33688f13453eadf44a9ac5c24e92c527b578a66f773761f1fb4e17bf71114addf4522fbaf428b1dd80c5f67b5d6c7789609b7e1b2ad594cc741be9662c5e3fa492e760996e9ee7f4d2a2c4e6162c363fea62b35b4a796eb847b448b6fb976724cfc59f4489dbad58dc7ed2c56dd750dc82f91cc68fe71b5e73af6693bda725debfb198066564ae24b90d8bd9cfba986d1f8a59d8ee4a647e9a28f27b89f7efc5194a818d989ebfe8f49c9092758d15e70115cab6982ad7a778ff8eb73deab294bf1d8bf3afba38e3879a27b6b0543a2d93a30bc94a83281adf8169fc9b4ee3a1917b034aef1296784a145e0fe9ce948a12ab3bb158fdae8bd5c824e5b41f8b31a26c5e2a2c2fbd1e7a3cdf652ae5eec2e2f8872e8e03d094e3e3570bbc97545c278a5eca68a1afae46ca749d7a37168f3f75f11865504ed465c9700f16cbbf74b1ec9372bf636cadeda14c94e5f762daff4fa77dbf08edb9a8faa75b22dc87c5e0ef546290ace5163506e9e6f7fbb118fc934a3e492cd3f03e7b6aa55bb2118af4f3c903582cffd5c572444aa5c174efe50542db42613775db327d108be17fa9f48d925962b4be51a6c74d1fc2e2c5ea69e2b573ca255cb458e1a9954e9c1ec6e214d3c529b55189da725c366ba547b0f8e5e8e2172e53a28c03e22d08fa19a047b158d6d3c532dc13a1680da61eeb746b8bc7b038d7d7c579761dc7999ac6e3188d063a1a6352ac3bc78bf6b35df5e713584c1bea623a3aa5126b12e3a7f4f27a53cd5be1a31ed9aa459fc4e2d94817cf700f2f5cc78c14314d4c3dd86b4be57e666b9fa7b038364ea5f6498c63bc4fc4f5e4ef71ebe2f355f8dc5c6ab14b6ffcf1692c7e4d74f11b5a4bfcfc7642fc83d46b9dcca6da3358ac9aea623537c39689e5bfa8ef6796c9b31893663a266313ca5fbf94e4e561f45e3efc3ad9934c95c0cf61716dae8b6bff505c478a52d59f3d56adaa19debd64ba26af31e3df4589c5f3582c36d3c5228f61a34b336ace9e87a381ea44fa4c69fb02a6ede6a9d406987dd53697919e65a51bc717b138b6d0c5313ca391d886f12d6da1b64597ddd6d94b58cc5aea62d695e9d79ca9d51b15de8bc94666d2d5f2654ccb56e9f1cf448b3a33317b058b59eb54728fbecd984adb389b3ddd57b1386e915a09a1ef01d45e42a4d3fa4f371d5fc3e2b8a52e8ee1b52d89a5205fadc9d362917882f56f28ead0d7b198b4d1c5a46f4a3199ec7d30394bfabf81e9bf954efff06833d606486d543c33fdab37b118b4d5c5605c4a6542783d8e3df3b66f61b16d974a7acd4c327a19757660669ae9f5361683f6a9e498e416d7970d8c1083f83751f47f07d3bf834eff3e687b533f9b99b939cc46deffb15833ef9fa3453cf94a90a9e20b7e55c9f2b7f71e09fdfcf648ef9a55a2bd032b4ae3f779d84b3d7db8e5cea8590fda93e5d622a1633dff887bf15ff718875a25bbedb145a1f4f5bf2c1392e333207c553eb7cf6522ddf9b84e6f8f57a9f86abe972673bdff6b8b856e652cbfab8b5ded71dac7fb9fbfc5f7382c14ed23de7658e0594623192325cb23dd8d93ded462da89a7ea8e325573f2bbf338f648d39a6ad762eb7afec0a0ce86da269085ed129deebe80c972ed86c824f364837ca42cf27907b0a8f69060fed485d44b0850a354b58a8385aa4e5c7b615e7e63ae4256526f4c62ac51839c3e3c053a53626a2e30f19cbf8415cb92b84aacbd287302d496c3e3a0ba5082e25b30d500025f685fcefcc19f49de2745a9c4ce0258efec1287954b09ab95b0aa7899b54c549ebca6e222c7cbbad30564558de3c8b6a144d649209bc7fac82e4310dd4c2f942239d8384e946545a292a9f084f6730264758f38c86de94bb429deebb3444baad87b75a2689b973b01eadc797150dbd969717d9d00f9c7b671905d29416e1900e9cf040df77a0145a2fd3749c02b1495478513e0168f8b83db9e125c8b0038dea5e22a94c8a6b12bb886b58de3ea968db61affa444da1317e14ac976e4c438a8eef4cd8f60869cee7dc015e1ddb031ce343fd60d8b23cba344c6fd5ea8e66db89d562a47d10f64ae749ffe00adb61d28b1b5069656e978ef2077d738b41d29a13514d0f8e78562c4cf05384f0c8dc3e94109a70dc8887ce970b9d8d6c231557a1c0e9083485e252d1644b9806e31e875f6b4b3415be004c8a1dde3207b65ab548bd79fcb3d6bac10438f2e956a77ec1687d69b125a23016d05b03217f0b45c10c7934f3d7e16b7293822eb8fd1ba00eb4c5043f6c906acbe0ec37a05c0ea4b9ff1a689605733bea8c8053c3f003cfde83bd953c4ec4cbc088736e502ae5bc1a8580125aecd58e2f0e134d19a2ff2c4ba80ea95597154fd2951f1b3e75553d5e5f1ae0bc11cd200eab67db276d544d970e0659823b6065a5703e98774a632dfd7e1023107be84cd61fe8effd16c9533433a55606a7750b6b267bc2c732f7bce06d97370b6c75795c5b900ea5c306ebf1325a876b594637e5b6cb9582fa516c1b80070e8b038c021f41d6cbc345323172e4063a03cdb99bef68c3b70f5ebca78c9062db0d209747f007b1b4add07505581bba3fab78251fd5db2dd07e022dc19ae1e3c278e6a57fa65764154a3c5d8aa0b98d6ce8d63da8ddea2c24d8b42e162d88d0ef82b60f27658b65753b8dc7cfd00345f87d367c5d162c1f10a11bc4b0bedf8a275856944b60bf7b8bf3117500ddb3b8e6a243d2a951579abdeb5b539eb9ac5518da21f651d294a277757534f0583d2a3a9cbaa7883b492ed2176d6543a5256cd008b01c6646b0827bc1880af69e5bd461780fd2280356a10121e767593fef6996894f18d3e3c1bf3c1448599778db86cb0f1877b1bb04ef3b170e34e5e92a6405e8a6bf3f352e833e645583596574b659297c262d03ca325cb265f17187ddd4fa688bec0cb4b580f959752becf8bb854282f56db1696bc9497b3e5a550dfe5d53ae51f7f039be7ced34ceee6a5bc3c252fe2844b5e5a039b79292e37cd8b388095174bb6372b2fa5e1fdbc94e6e8f222f5b9f46fe3b2938daaeb9ff24270b9b0d8e4dde6bc94c751f3529c3fca4bb26d30af96a961fdf3e92057e36325fa6fe3bd12c549bfab252f8539fe3ccdfaa4f86e6258c5c57701f7e1bb89c7fd7fbed1b70fdfe83b9e43b84252f0db7dbb53b6fb3acb1ce6efeb5ec6ca58ea6766cc6303c3fa744ad0679a6708cb987284a4da7e3acd9a045a8717a512d9745a88ffc5e24dea09d40bdd55e15524b24ad09d60b9c8aefc653288f9541047008813b3310108ed130a0c9f3ed13771856de670b6a1c2791ec039c9269cfd9cc4f912c039d9269c054ee2fc1be09c6213cefe4ee2ec9613c739d5269c039cc4b93bc0b9874d38073a89733f80739a4d38073989f34c80733a25cea6dec542d1caac90cd73ed02fecc211b48856c5b164736231b165882da20549f978f84fd9de654380b40ed3dd3269cfd9dc4d909e09c6513ce414ee22c0438f7b409e7402771ee0e70ceb609675f27719e08aaa2bd6cc259e024ce0f01ce3936e1ece724ce6b01ceb99438b762c99beac18c3e800e65073294a0dcdcdb1694054ea2dc11f478f6b105653f2751fe04ac725f4a94ed25ca32ef258e71a19cd74ee6cbbd0f1dd04654404f07b6392f1bfb2f07797f8a85c369ae2a5798635d95adf91f32cbdc08aa9ef9f4ab1df9ec72a55879e2af5de19fab1975f7c68406017885d97053833783b0a39b13fc2e660e6b4b2aac4702ac0bb2e54c9067e112b9aa280b197a0315bc8701bc85d4eb71578887d3848042562e2427acf2ce1cb44e54d07600d08aa857e72a8b2bdd642a912b00bee2ba6c29061b3684651f59c3e64ad0525c44dfb30eae2b9dc79608bc23e45a375f185f8b58ec0949d89fe7400dbd3db0cc926cb95f2a14f56f9632f50d54e8d601748bb385ceaf50b2848e6ce2eb4580ae341b1b1f17ca5593e1c3ef544c49cbc26554184f0018f7cb96a3b94d23f31e0bd02da144d7b6160b0cd6c8a433856475f27f0066994d30073908938106ce529b60f67710e6dfc03297d904937090960ce6bf00e6729b60269cd6e200cc5f01cc729b6012ae3d2383f90780b9bf4d305d9c3af81ec0acb009a68bc3153f01989536c11cec20cc18681a55d90473270761e600982bea764cd217e51fd84c586292ed119b0e265b5766ab1fbe698c043d0fcac703ead20a830708135a21d9c4d60a90a157656350ad6f60ca5f3dce924592958b67038b5c9d8dcc5cb0c964e6d701ba03eb76ba1f0accd2747f3515d62500eb41d9b0c87e9b8c456e01cac483b351bda4d66274b15b381658e121d4eb261607dcfdf00c5c4239ca43b652a7318076685d40737179532300edb0bacdb4aef74c9a80f2af9abeeaf02b0de82f47c5d0bd353b3b032b5c43898eef9ae081f28f567bf1f2092c17eeb0dcb3b88100dbe1d96803466d01922e90afa6c2da160c311c612356d2dd3064581f04e5e391d4e563a5f8a458dc1a233cd69531e535cdbd95631d41463f8a125d13efa29cf94ee686337777fbef02801d6d93bf09d21dab64f67733c8bac7d88493748b2519ced701ce636dc249ba01980c6733505f1f67134ed215666438fb009cc7db8493d4530a19cec900e70936e124f5454186f34880f3449b70927a4a21c37931c07912f5a05995e8c1f026f80cb9c58df7c4ddeb77776171682767636d446a13a9a45e4ac9a6522f0416788a4d3009c7c0c9609e06609e6a134cc2b1713298d500e66936c17471c5c4c100e6e9b638f020cde464a3e55781eee319b6a02c7012e5b6c02acfb405653f27513e05acf2ac6cb424e3476a903bed20dbebdf8bc5a19d6da7d30ec2ad4864b3da7703ace7d8e303c0c5a5cb9f826c7d2ef5d46c7055c5483131bb8cb28bb83915b6fac002cfabdb8c0dd587199bb015795c8c08eb24608de7534f84f1178267609101eb4665875b013bbc80125847a60e3ae3f2e0616b75e6c8830c6a1e807aa13ddb3908b719910da55d021ae01765a38f9daaf356c2ba9acc75ebfec02e2fb60926a16592c15c0e605e62134cc2b53f6430f70430d7da0493b077430673028079a94d30095d8090c1dc1bc0bccc26982efa0edf0bc0bcdc269884d30f6430470198eb6c8249d87124833912c0bcc226988453b674e781009857da049370dc9c0ce66800f3aaba74b4105ed04298cdc996b38c0030afb6092661054406735f00f31a4a98d011f14ab1589f3b81cdd27e58327c8f017cd766c34700668b2aa6a4e52399e3cd9300c6f594185b032b5c2a032f14338caebb599803105e678f2f9f9d9c74c0b9104c415c6f134c171d7016019837d804d345079c7301cc1b6d82e9a203cebd01cc9b6c82e9a203ce9900e6069b60bae880734f00f3669b60bae869650f00f3169b60bae880731a80796b36f6e6f4116343c5022657b754d028141f1de8dd2f126ff90e1fdceb40ae64719cb751e2ecc2129719ccf2788cf4d42e12f6aa7e4778aff3455a2bbd777dc723bc534998f1c9565e9e0f161e6ca4841b3e05917fa84e5ac2560013667eb2f5bf3d01d0db6d034a68a164406f07a5e91d9440b9e3ace0cacb4a3a5c646b7e1b80d2f24e4a5c9d8d4a4bc25e3a5959b907c8da77d5ed625628102e66251c49aaa6c2fa1bb0d8bba91de2f040b934be32732af33dbcf0972b9d6c1a6d03d0dd938dccde47fcad7ec7c84a675ca0d41ccfe0198ac4ad4eb26ae72280f6debaf508087b442e8e21cd0428efa3f708c85fdf544e331e0cd0dd4f896e0b90c1cbbdd72a652772b998b6cdcabc0fd9e2ea61a005f94076f7ee54d6f4c7ddb3bde6c0f61ecc764b72a6c4b69a8d16624a45061ee909592aec935f2d136525e1d8e54554686f0016f910b5452a4776dc1ea19f54326cdb5161db1258e4c3d918584b7d2dba8bebd77a012b7cc4269ca4278291e16c07703e6a13ce414ee2dc17e07ccc269c039dc43906e07cdc269ca4ee9ac870ae0655d11336e12c7012e7ab00e79336e1ece724ceab00cea7ec6dba13ee87246bbaf70383c04fd3ef244f056dd02f16e108d1c61811d4fe00ea333642255c074706b500407dd646a884252b19d49b4033ea391ba112ae8b23837a2380fabc8d5009172290413d10407dc146a8848b11c8a0ae06505fa484da82f9531995f243ff080f3563c987f2dc1b501ec2e2f05ea284d7416391fed284e96c149b205cf0547a2faae50a15e20dc24c4e76c04709a8e35fa65e1cc327751778044ad844efc512075770f40016f88a3d0ef15cdcfff31a28095fa544d994c5a730a6781fedeebdca3f76affceb0dacef354a649b791765a28cabf2ea5fbe3a88bfca7be03c0b9381eb4105ae0300f7ba3dabd3490f3122cbb8fb01986fd804d3c58d7b4b01cc376d82e9e2c6bd1200f32d9b60bab8e86a3180f9b64d305ddcb8570c60be63134c1737ee2d0230dfb509a68b1bf7160098efd904d3c58d7b4500e6fb36c1249c282383590e607e60134c17ddcf1f01607e4809b38d8439d0fb53cc56327faa36b8a43f0b6b81c996f5df01407e443f80eb2fa85652b3048fcc07d1f100dec7753b7ce68bf21d7e13761cc9d6a49f00066e3fc946861eb08966e85b814d7e9a8d4d796abf2d9fd03a001cceb169edbaed0eecf333eab14ab54f6c9100ab649732c243111a508163c01e3fafcb323238d94a5846929d95570a6cf00b7b1d3f90b628c9a6c24e0170bfb4192e61df870cee4900ee5736c325eca593c15d0ee07e6d335c17fdc1ec0de07e63335cc2914f32b85500eeb736c3251ca327835b01e07e67335cc2d92432b80702b8dfdb0c9770de930cee2a00f7079be1bae8b4e73800f7479be112ae2521837b2880fb93bdcea65cacceaac0faba9fb3e1470e3a91e4ee53ca59b9f8a8cafb9caff75c28cfaf74d58de4132c0ef4976c6c31f47d248d14fe4066787f2f61fe2eb86542dc7261c3eee27c0ee0fc9512a77f1e815ace384b0c0b167baf4f65412f35eecd010c05087fb3b7f47471746b2f5031fd4eef720a1bbe267420d9940a5d0eb0ca3fb231a192ca1a79e8e3b01f657d5e4d85f50f509fff692356d25e3f19d6cb01d6bfead24d9ffb67030e0319ff7ff63a0d20444be6346039b0d2bf29d16ecd8293d489aefcf065148460c99a50ab413dff4f361af558a99a78d09d8b47dd1d0decf45f9b70f67312e7f300e77f36e12c7012e7f70027ab6f11cefe4ee2dc06949d319b700e7012e7388033c7269c039dc4b910e0ac6713ce414ee23c1ee0ac4f89731b96782c096f7fce10424ac41073452d885d3c72b902544e0db261afa9fba6259c1325eb8ce6039c0d6dc2d9df499ced01ce4636e11ce424ce790067639b700e7412e75880b3894d3849d79390e13c94c57136b509678193385f03389bd984b39f9338af06389b53e2ac6d834430a313ae6d22dba47337283737b305658193287b83fed1e6b6a0ece724cacd00ca1694286b3f260fee8182739d848bc7c90e763c1f949b2d29b1ea1632a63e3d47da64229ba01b0e6cb695cd705d9cfddc05c06d6d335cc2813d32b8bb02b85bd80c9770750919dcdd00dc2d6d86ebe22168c300dc36d96827c015cefeead1aa9ae3f94abd97f9c7077acf8b6a56f4b9b830f700d04ed8aa2e5bb2501c69938bccebced3a07fd59612a57261d4d7fb133c40723cdb541c755c07ecb21d254ce879075a6716e091ad67fe12c06b4f098fbbe3a810b11fe1fd5deabdc48f77e6d3734b18e16a66b2d2700b00ae0325b8d6200b2f1559b8b066ae332b1997ccf61a8252b063364a416c896db04219e8a4f7e5ae0066279b60bae87db91b80b9b54d305df4bebc0d80d9d926982e7a5fde16c0ec62134c17bd2f770430736d82e9629fa63380b98d4d305df4bedc0ac0dcd626982e7a5f6e0b606e67134c17bd2f770730bbda04d345efcb7900e6f6753ba4e68bf2376c11d6e5641bb6e68041df6e7589326ba76692b9c71c0b5076cfc6f8393ecf0e0566699ebd9a0aebb72c8e358f126b4b161fa7e4420a8520d7877967037c3bd893c109ab1db20c7e00c8e03b52a2d4b9001aeed128627cd7f0a484d14ce2a931b291cc4f806df6a0046ae670c545a7ace5a089d4331bd93eb5f6a68bc31d538095f6ca46d31d66fbd13547048c6471cff6e4599eac3ada0dc0ec9d8d3254ed7b5bc86a3f1880d03ac980fe05327abe6d4009db9b644073412ddfc736a02e1e5df106b0d0beb60125acdbc9807e0980f6a304ca9da9f981ae1037b2e6e28f6cf9417f50fd1450a2ebc852ef0d059da99141255b097f3ab0c7fe364275717bc1d900ea001ba112564564508f075007da0895b03a22837a32803ac846a884eb92c8a03e04a00eb6112ae1fa2432a88f01a83bd90895709d1219d4bb00d4213642255caf4406f53e0075671ba112cec19341ed0c7af643eb764cd4f569e35d817dee42dd055563a28b44d7334b1372dda8d0edc3e2e876a54417dd452ae1a41c598f7e23b0c4dd6cc2d9cf499cef039cc36cc259e024ce76a0ca196e13cefe4ee21c09708eb009e7002771ce033847da849374592219ce6300ce5136e11ce424ce7500e7684a9c6d6bc1195ec2e0e2fae33200738c4d305d5c7fbc14c01c6b134c177760160198e36c82e9e20ecc2500e6789b60bab803732080b9bb4d305ddc815908604eb009a68b4b1237073027da04d3c51d982d00cc4936c174710766630073b24d305ddc81d914c09c420933fda31f091b49d554580700ac536dc44aeafd980ceba360e8780f4aaca93be71b2b3f09ee3d22aca4aea082fb33803bcd66b884cd2932b81f01b8d36d864b588991c17d06c09d61335cc2e61619dcf500ee4c9be112f6ffc9e0d607ed8459d96827a88d0b2bc48b6a8be274368a4d6023bc972bbd97d5b645ff0d429b1d4885f51c80754f4aac66e71a130eb290b9f0fd0e1407b329d172b794c5355b134779bf0b3c16256ca2f749091d38b2edb27c999102b7974d5377a4eefbc9a6eed6023b9c63134ed28168329c2f039c736dc2497a8014194e062aa0bd6dc2497a962119ce1d00ce7d6cc2497ad22619ce0900e7be36e12475a34a867319c039cf269ca4276d92e13c0be09c4f89b3a17751e63d5ec896307e04847ba872591c5521252ae5eabc8fe842fa6eab96791fac66ae3baf7a1b205c4089703b4de64db5ab0847ee095733dd1b2382dc1764e9852e40265c7f4706794b00b9c805c88443cd64908f03fda4621720130edf91413e0c405ee40264c2e93e32c87702c8252e40269cf623837c2280bcd805c88443d26490df01904b5d804cd82b23837c0f80bc9f0b9009d7b79041fe17405ee20264c2dd006490bf0590cb2821473b8d9eb05020eb3c5f03502eb50525e98c0119ca3cd07b5b660b4ad2b92c32941f02ab5c4e89b2b977518838cd766f82ba158b632ba7c456fbe1029b929bad0701d6fdb351a7ab253efc65fe7939ab62517c91137666c96c770b507a56b80099b0334b06f91f50ae56ba00d945affadf00c8552e40261c602483fc3680bcc296c616a97324b2c6d6c300e54a5b50927af22143b913a8c40eb00525a9fb0432941d00ca55d940b990e9fdf0656dfd3fd99144d7b338cad59428d51a036e758b455faa48ac65c9da71ea646ba62f01080faccb8c0dc5915a23d97ed54b40757310254affa836ff9312d9a79f234741a7cb97dc5b30b413b0c483b39199fb6e7299f92c80f0104a846ab55f1ff1f758c64f639aeefd5d26ab13be644d6dd2213fad896cabce9b00e7a19438b7aca5a65631252d179751619c01301e56b7558c2fca773c4cd80327733cbc27683b5653a26c053278952811d5916c592921c9000e0775f49abab4c5aced6c266b7c8f02b6787836ea6b6e8b4b59f8f4cf2c5823d958cfa7a0643ca26ea735a0c02cadd1aba6c2ba10603d92126b1b89b5bff727be1f74bc685116b355d9b24fb2a18a4a00f2a8ba1caa08760e5d744d3817a03c9a12a5f20cd527a177b3e9d8e51900e63194301b7b17fc65bef66894ec61bbd7b36e0a701d5bb7d9d8f506784bd07e3c8e12a5f2dea0a6c08ab527216323e32e1e947a30407b7c361a43519b42a42b8ec81a434d4033fd041bb1922e2f24c3fa00b0d613b331d48637dd6706b2fe00ca72b53915ceed01ce936cc2d9df499c6d00ce936dc239c8499c7300ce536cc239d0499c2301ce536dc2d9d7499c2b581ce76936e12c7012e70b00e7e936e124f5e24c86f34280f30c4a9c2d25ce02efcf4aef669947a2385b431d64e7253e0bf09d990d6bc46c31d1351be1301cd950c82da0ea39cb269ca4bec4c970be05709e6d13ce02277136077df5736cc2d9df499c8300ce736dc239c0499c5301cef36cc239d0499c47019ce7db84739093382f05382fa8cb498e6087d2c591f8bf581ce5859428bb6b500677f7f0c98ea5defffcdf7cebff0a217274cd64c80c412d0bab86e753c11e0f605f940dbb4d6dbf0f615793cc6eaf00add18b6d41493a084286726b509a5e620b4ad2011032944f02ab5c6b0b4ad2690d32941700abbc941265fa6e00089d5491b9017800544197d5a5854271a48e2ec996797d0c32fbe594285bb0f8322f7fdfc5d26c8d7592ad283e0ed8e13a4a787cbf45392b135996af8c9bcefc1de30b193fb867a5b8c7c5f1d5726418b7a3c2d80660bc8212a35aa354c5167b8f2b131aefc9fd1fb8e801e17f00ed959468f9740cb73e78ae4c89fcdcbdbe793f80ed2a4a6c6af16b6aeb880b9c3c31fe0300f36a9b60bab82cfb7300f31a9b60ba7862fcbb00e6b536c174f1c4f8f701ccf536c174f1c4f85700cceb6c82e9e289f1ef0098d7db04d345a71177019837d804d3c513e3ef07306fb409a68b43195f019837d90493d0e91319cc6f00cc0df6c01cec640f68221864bbd926982ef680260398b7d804d3c51ed07800f3569b60bad8039a0060de66134c177b404301cc8d36c174b107340ac0bcdd26982ef680760230efb009a68b3da02100e69d36c174b1073405c0bccb26982ef680a602987753c24cdfd711a18d565361fd87c5b1de438955f93af25d3ecef06ef39389470a8be58296b3ac387b249ba3fc0880bc371bf6a93c7bf8cef5d4e34dcd29ee5660c9d67d9458d5620498e9535f8e40d8d9245b8c3002a0bddfce1295b0db4956a2fe0c0a820728b16ea3b158bff4e436b98ced2e56bb97875007f704131609643b82eb01c00f52028ee655cec5f1a66900e5439428d5e66a5efbf37549653283bbed0d764bd0267d98125f74273e844d7cb28cbd0bc0f9884d38fb3b893317e07cd4269c839cc4b918e07ccc269c039dc4390be07cdc269ca4675591e13c0dd4e44fd8849374be9d0c6723609d4fda8493f4cc2a329cb703eb7c2adbbdf8540fff263db992eccc960380a53e4d89b68005c79df8f0076fca2ff7b0568801bc8a9a2193e96c149be0452311b257f0d77c374b2b81b04bda832a114e064329cf64632825ea400a69a5564d85f51360dbcf6663709afbfeda141df1af07e5ef733655670328cb5cb2ea6c076097cfdb84b3bf9338b702385fb009e7202771ee0370be6813ce814ee21c0d70be6413cebe4ee25c05aaa2976dc249ba33890ce7cb00e72b36e1ece724cecb00ce57b331b7941a4c17a7e9ce067da2d728517664e1a34e78bfc717b2a92d8778155446af67a347a4a0968650062b22f77a44d703906fd802d245677f8700906fda029270513819c8af00c8b76c0149588793817c13807cdb1690842b99c840b60435f83bb680245c664306f27fc022dfb50524e1ce4d3290bd8045be4709b203c35683fa531b23bc172bbd17d50ad10af1066169497648fd6280f4fdbaecf1041be72e6e387c0e64f30f28516e2d504ef7e25f2e26d72a189f58e35ebe16b225de93250234b7517eed8b1de3fdf27577457460c9d6d6f3d35114d80f29c1c2658ac5604e322bb33f64b3937b01bbfc281b3df1a8b3932ece4d5e00a07e6c23541777239d0ba07e622354c28e2519d49300d44f6d844ad86c22837a3880fa998d500907e5c8a0ae01503fb7112ae1001d19d46a00f50b1ba1127abd21837a1680faa58d50097bf76450cf0450bfb211aa8bdb114f0350bfb611aa8ba7b79f0aa07e938d41137cd6ddf5f9a347591ce5b7753bfee48be26721905a25d976c4956028ef3b4a94eaf088be21a02e1f94bb0864e9efebd20ee1c930a47648760ec70c60873f50a26ced5d2c16a70e16896c5be1a95beefdbb50089cc8fca5dc650e968a9b8152f1c76c4c74a81923be4fe300593f07ed324b9dcb1ba8906e0facf2274aa4669e44084798c83c89ec0cd0fe9c8db273214bc523838b6eaee6838cff0b25ca747712911ea2574d85f55750bbff6a2356d2f38cc8b05e06b0fe968dcea5aaa65688177d219bda1acf05a034fd9dba19cff7b77169fe4e37ae2a3cccccbdaa6847507efe91ed5a3ef59dc684639e643b8ddb00bbfc93126dd403c74937c2902d6a3816949d7fd9849374e70619ce1700ceffd98493745f1119ce1f00cebf6dc249bac5950ce776a0ecfcc7269ca41bb0c9708e0738ffb50927e91657329c8b00ceff6cc249ba019b0ce78900276b407ccaabeff1b3c21333c5fb2cee48c53d6c03581c5b8c125b74271584cd75b2fd9783410d9e6313cefe4ee2dc1ae0ac6713ce414ee25c0070d6b709e74027714e07381bd884b3af93384f065551439b70929e924d86f33380b3914d38fb3989f31680b33125ceda962a0433ba8b1b0a6f03e566135b50163889b207e8f534b505653f2751d603289b51a26cec5dc4fd784ef238ac7270cea725280f9b53e252ebde78c08b84dd29d9cbe42beecd36c600bccd28e1d57e0a0c5cf996a55d172da9b01e06b06e4e89b5a177c1d75dae607c3fba8bbb7bdb01542de851f9478f0c6784878c91adf0dd15a06a49894acd6eabf51615424ca110a0d65604575dc0c5d38419960ced4c50e7b6a244ab7c74a4d6a876aff1720c6852b7b605a48b3b23ca00c82d6c01e9a267ad5300c82d6d01e9a267ad1300c836b68074d1b3d63900e456b68074d1b3d61900645b5b40128e299281bc08806c670b4817c76ece0720dbdb029270270419c84b01c80eb6802474aa4306f26200b2635d0ecc4271a40d20b2c1b2eb00ca4ed998c8f24f4b57bfbe32a3452f9bbfe6af25273f339d6c4bde312c8e736b4a9cad181ff9f1876d0bbdc7e399bf50bfd4bbe21f1cc8dc1c3a6b0d0076a604d89645d9783780b2e626cbdccd41e6ee62134cc2f62419cccd00cc5c9b60ba784c775300731b9b60bae8a5b51980b9ad4d305d6c10350030b7b30926e1382519ccc60066579b60bab88bb61e80b9bd4d3009e774c860d60730bbd90493b03f4e06737300b3bb4d305df497d102c0ccabdbc10d38034e58fd90cd80978319f01dea1265d00316214a320f585300ca1deb76511514e8bad3e5652c8eb50725d6cdbd0bbe9caa982d11e3453c5367c52f06d948512780ae673632776a958e8b8da1c900652f4a945bb0f820f0fe1e8562214a1d3693953329c88e9d790940ec9d8d46506a93127d9d6c513600d54dbe4d305d6c51360230fbd804d3c531f53f41f3bcaf4d305d1c53cf0196d9cf26982e8ea9ff062cb3c026982e8ea9ff0e60f6b709a68b63ea3f0298036c82e9e298fa2f00e6409b60ba38a6fe198039c826982e7623bf00300767638c28fa08918b87c8b4078da49d6cc44ada9027c3fa08b0d6219458bbb2c49d67958c3b05e3befc8b6a863f6a3f8d97b084251b162906d6bb733636f841eb4ddd7d2d61839fcc7dedbbc082876663ed26563024baaf256cf2930d286f003877b109673f2771be0270ee6a13ce022771c64039ba9b4d38fb3b89331fe01c66134ed22588643827029cc36dc239d0499c9500e7089b700e7212e74500e7484a9c2d254ebeb16aa5d889c1e738b334b34986ef6916c737ca163f58a48377643bd7ae068da2d1b6a02c7012655790a9c7d882b29f93285f0456399612656b165fff113ce6304b6524595ffc2050468ea3f6d8c63f2e14b15f28c786dc3ee2281fc01b6fa7c736c2d975328f6d8f00acbbdb524292ae47222b21ef0725e4045b501638897230a8b727da82b29f93285b019493b2e15082a3f28f20e6aa8e67fe197babb2557b93813c13949493b301b2ef260af27400720af54131caf3e502efef856c099b236774dc6b00f504d8a666c3df2f6f802ff55ee356e7bacdbd05e0ed918dccbbd3269a792f0620a75182dc9a0567c48b44dfc5efd12c17e38cc16507be607f1f1ae1c218b27d6887807a7abaad605d74713b0d809d91edc5056a6d867ff2bdfa1de1bdce8736560ae42bc4d006e1f218b22a6912403bd3ce0d7f847df26a2aac7f823276963dbbd65cdc89310ba0dc9312657bd0682a61c502e52c163f63828f63168a27fe3826b1f332b22cff31003adba6438d0653564e64871a958231a3bd6cc249eafe840ce77600e71c9b70f67712676b8073ae4d380739897336c0b9b74d38073a89733780731f9b70926e7321c359016af67d6dc259e024cec701ce7936e1ece724ce7300cef9f66e1120dcfa4fb62c6128e8c517d28fc72f1702c64ba4a3a8c7e3c956bc350316b9c096394ad2aa876c50791da8c917da8292b4da2143d91164e6225b5092563964281f0756596c0b4ad28e24dd8135c02a1751a2eca041b969ee99dc07202da144ca2fcac412ff72076be902504b2fb6e71810171df17c00cac3524a945bb2f8587a7c0e5d3dced20c3a19c6838145ee978d9e4c155bec3dae44fb3163e5074107a48465e2155468ab01da25d9459bfa442f69139d6cdee77780b62c1bdba3f8eab74d677bd49300df527bbc5f933a3b212b416f023097d904d3c55a7d0380b9dc26982ebad7bb01c02cb709a68beef56e0430f7b709a68beef5ce03302b6c82e9a27bbd0b00cc4a9b60bae85eef2800b3ca26982ebad73b05c05c61134c171d8cdf0c60aeb409a68b0ec6ef04300fb0e7c81ac2fe0fd98af6c3c0d0ef2a4a941d99ee3cde6942d8723130b7e99cca7b39b0cfd59450b71550a77bf12f17b3e115dee7956c0a3b400cc65578ffe6634ae5de3b4b04d01172e79a1fc018efb7d813ece2b9bddd01e203ed396a89b008203b6a695f50041c94adcd807cf8ad8455666b30ae9a0ade21c00e0fa684b7a3c60ee16c6481660d5125d83610ffd768c6b7b42c1703c8848dfc1e54c84f05f67a88bd9bb0088749c846e64703b487dab9098b70288fac90f8011412875162e54197896509ea942bf716236c07605553c2da4c48ab904da251a1adabee35e5b706e0d6d85b2e12f6dec9cac559a05c3c9cbe9734ba66a1c24881cdef0fd551139e6c21570b60af47d878ce00e980325965d310d8ea91366225f5a44986f55eb062e9a86c94ae70f76f2a3d7cf2e112b2befc53a02038daa6ed2da4a7a3936d6fd91958ea3136e1ecef24ce2e00e7b136e11ce424ce6280f3389b700e7412e70c80f3789b7092fadd24c3792aa88a4eb00927a9ef4d329c5f009c27da84937412990ce76d00e749d958351ff4bfb9a9ac9a5f0b309e9c8d098f7ea17e92cb4efb4a4085738abd9ba70917dc906d9e5e09d09e6ad3292ca4db0cc8ba9547019ca7d98493746d1d19ce3b00ced36dc249bab99a0ce7d700e71936e124dd154c86b31318f53cd3269ca4cecfc8708e0138cfb20927a97b29329cf301ceb36dc249eafc8c0ce7b100e739764e7110762faba9b03e01aaa4736deaad939e5149d65bef03709e67134ed21354c970760038cfb70927e919956438e7039c17d88493f40455329ce300ce0b6dc2497a363a19cea3591ce74536e1243dcc9b0ce71b00e7c536e124dd4d4c86f31a80f3926c9c00836de68228093772910d26df0740aeb505a48b27b3dd0b405e6a0b48c231783290e300c8cb6c01e9a29bbee100e4e5b68074f1b0e42a00729d2d2009dd5690819c04405e610b48c2e60f19c8c301c82b6d0149b82f880ce41a00f22a5b40123a9e2203790f0079b52d2009f7029381bc1480bc86126413ef627fe18e8fff297276b75a5700ec5a3b8f9227acabc98e923f17605d9f0d7729a94e9811760ec9a6cb8e006393d7d9049370c8820ce69100e6f536c1747122773f00f3069b60120e5d90c15c0a60de68134cc20a880ce63200f3269b60120e6190c1dc1fc0dc60134cc24e2319cc4a00f3669b60120e6590c15c0560de62134cc2ce2319cc8300cc5b6d824938a44106f35000f3364a98fcecb17256263a8b7c4739ffbc5008736ff8824b51d036da73428b8beec79f05f6773b25cacd59dcdf811f7896f6979159e17bc00aefc8c6fe327ebe85929a2578cba8e05d09e0dd998d4a04fad9e0ee48cb45b551c526799f1649a0c49e35ba51c17c06c0bc2b7bbeb4a6327e30672973d797566700ee6e7bdc350f72f28c95fea02ab9c726982e9eb13200c0bcd726982e3672fa0298f7d904d3c53356fa0198f7db04d3c533567a02980fd804d3c533567a03980fda04d3c533567604301fb209a68b67acf400301fb609a68b67ac0c04301fb109a68b67ac0c02301fb5e78c15c286115967f220b05df9316af7df959e8065de4bfe47ee8d7bb76771588f6763295ff06468ae301ff559e5fc28e48100e413f69c90429881c94e48990d32f09394283b489465de4b1c23f76775805ccc17840a17f811b622c98e48ea02903e658f7512367bc8ac737f80f2697bfdfebb7852f912d0087a261b95d1e04db4327a085446cf66c373259cd519ef7db2875867ee37d5ddf5943e11607c2e1ba5666a3d1c17c784f600289fa744b9b54459253cf557462a33093b8e6465e62f00ec0bb68275f1109a1f01d8176d054b581490812d04605fb2152ce1240619d8e900eccbb682251c3626033b15807dc556b02e36f8c700b0afda0a9670d90219d8ef00d8d76c054bb8b8860cecd700ecebb68275f12cd43200f60d5bc1122eba21035b0ac0be490996ef4ee6c3278bbc1b2bbc57aa3c010b851a7c78851f9de8e29acebe00df5bf68c01b838613c0fa07c9b7a79ec62b119a548cc635680233e2be9c0916dcf6f08c0bd63933f6b52c7cb64c37ab78261e6776dc2497a4c1219cef700cef76cc2497a881719ced6607ee97d9b70929e2749867308c0f9814d38494f3b25c33917e0fcd0269ca4e74992e13c1ae0fcc8269ca44b12c9705e0e707e4ced4fab527c522c6eb9ea4fab0f8b03fb841218bfe02f937602c9ecaa09c0f4695d6eb50f4f04bbb83f6d2dc8a49fd904d3c5fd699701989fdb04d3c5fd69e702985fd804d3c5fd69e701985fda04d3c5fd698703985fd904d3c5b5484700985fdb04d3c5fd692b00cc6f6c82e9e2feb43500e6b7369eb4477a966e3515d6cfc108e5773662253df1990ceb85026ba30621e16312848f14430b7c706121534e4a2abdfb63199f93291648167ad71359a9f86abe0764aef77fb4b4d8c7fb5f773f261cf78c66ab58b9b8cbe51509d94bbda75c33af1f9ce7bdf23d378d16d234f262ad18f7d4c523cb6734170840be93954221f94021274fcc365588b419e1fd5dea3d2b62e3c470ca124f729ef0f8b54268334dc4a4d0935a2e629d2734e373a6e5824411f3e7a8a6cb09e785de755eacb17c678177afc463b4dcfb3b2fd69cc5fd882d908e60e630ff4c763f4c9f568958975d019e35055f4ef1eeedee3de1547d6d38ef4211cb85725423a88d7ee4232fa5d95f5feb705c4a649ae609332a13e4cabdabcd05576e6a2b84c587dddcf8d2fcb5e515322ea345a6e2a9cc0d3326d290a734dfa23749bc59e8855f287e678854e55699bf83f75a8c0fb2f84b017ad72c02e82d4fbb5f2aafd4fdda65724b4c2eed076e6e317d495496b13c545b8cfc6ccfbf5f24aca858481d5f6b4c6b8f1f9e1f9b274995fc1d795a6ccaf1ff91a7bb4c7661a66d45769de9a57c91740538c57bb94828c5ff6bf0ff00b1fa0e96c6700500 serializedProgramBytesString: - serializedSignature: 871334729870422771d4284d4a7c4ee7cc4d130fa0f89efc22e772d6e62093e44b73bc3e39c89f1c9c1f92c0fed28efbbdad4fac9a1490a7fdf4b3081bcfc908 + serializedSignature: 20ecd10dc3742d61b2e342186c9db426be564be8b61e8923eb4c211fcad7f6545b62dd8db16f04d9b09a713894302c22888ae1ccc2205078ddcf42b688f8000a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset b/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset index 188e929..b41a8f9 100644 --- a/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset +++ b/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d797c14d9717e030809210eb180603916964b5c9a415ccb72ad90040810085dcbb96240120824a1d5c19138b19dc489e31c8e13e7762ec7b9ef3bceb9399dc3493671e2dcb7e3248e736fe2fd2f79f5fab5a6a6bbaaa77b7a6a3433b6f493def4eb7ef5aabeaa5755eff5eb9e7949a57f127bf4bf7ed5ad5a5593ea5383eaa11ad79f5a7539a67f9d23b7be4b4deaf2aefe9fd6e7f6a84d395ac2cf8ec41afdbf431f4da969dd7246ddd1e58839dfa386f4e70edd76481f41edb0fe1bd2572516e8467daa4d5d5217554362550e12fda6d194ad4b805c891afdff947aaacf0e19a6a093a439d5a0fff5e83353e6dc9866dabdeebaba69c41ad3e7eee836936a54d3bc6d28d64cd42af34139458d2d17e9bf2afdf7017b3cdfd6d5d8cff8da5a5b36eabf85faef263a0689072dad777aaedf6969ba9fa1ed2b21fa5b60cb3da8fd625bee45757b501d94bb6d1f03e858d3325ad1fc252ed8fa85b66c22e827515d13aae3e843b90bb5d965fb7c62fb7ccdd657d93245f4b90fd5a5509d4b0ff7e9d2ff58008e75b63c8ce856dbf290a5770b5de3d643f9823d9f46c7babff9c73c74dc76fbedf5b7d131944708395f447547501d94472d9d3be818fa5dc9f47bccd3afcbdf715b3f888ea13c81fa3ea1b26dd1a5b9041dc3f921abc33755b65dbae57e4473a96d33ecb966992d0fdaf377d1319407108d03b66c4675cd8cde5c7d55dbfa7b01ba77699c64747f3258f7d56f7ae8b8ed5eb2d78fa063ac6f57a7f7b375bae0bd0eaed5afdbfae52a7b8c703a5ca166fd568d2b67bd2d5b90bc2db63c65e93c50d9e3bed5537f0ad543f98c3d3f6a8f577ae8b67bdab7db7235e2cff535ab6cd986f86bb3658307c731cff9352a634bf8bc8bf3695b3feea93f63eb1fa2f650aef5b41bf39c7f56d136bcce96e754b60d9fb36587ad9f40c7509e4532bbb4d6e7e06103c3c3465b767a78e8b4e505d4978bfd795477c696cfd9f292a5f32a3a76db40d9e539df65cb4db6bcec397f19c90ce5457b7ed2a3d3cd9ef35e9d3fef91dfebf7daecf9294f3de3bbe6bf61eba938b14265c610b4990eb896aa5b6dcb2db6ecb17466d03194dd480f5b6dd98beaba6dd9a7b2fd933bc6fbd1b5fde85a285f56d93e0b8eb5cdd4d67968bbedaea8ecb871c596db6c795565dbd75595edd3aed9f38fd0b1ee6fd1d779aebf6eaf7b8c8e5db9319d271e3a6e5c77f9ba8164bfa1323ec5ada3f4e2caba041d239ba879cd23532e7a549ddb763bd7b62a61f2aeb3bad7b4f60cc97970d14e153e6d775be64ed881f442f8073f3b4cb7d33a359ed00488acb9cfe4e4d33a7a379359f3da441de2bbd5fc4feb2b460cd1a7fe2e3ee8eb02981bd5bf4328e59fd2f567cc8c0192fe117da6493baa11d3ea964ef7aeebdf6c2afdbadb513d9886b4d1cce8ae80de2dcdb6ffca5c22c1f4c0dba65bd374662f63bac60574421f8f1a0e7bccff4786d321c37d87ae9b3673a9713d3c4ee9f289e9cd2ffba4fe4cf5d96b21a379a427315cbd335572d5d4a6a501ee93c63e3fa391b9d00840bff0a91d860b922672bfcba789cf60e8381948763b2c8d7d06b244565db34a9a7cb8db87607419fd12d2f6ede07d484f448264a1910175af331264343cd3fc918f9efed0de6d55d9a2ed5749938aafcf215a10b040af31b1da47215884aaaa052960d40b7f8282dfa45e3d4584dfb96ec45c175d010b4d64ca564002c2719bfe705b1fded527609deab1f2e923058dab0da4fe80998b2d0ed47914a8668da7774e6c9a5b260b86b566568a0cac4993f1ac09303eae2f931ecdb339923b3cde78c7c41be7b7bcfb5355b45e6a8d5ef2e98dd3cc7c4a33b5c536f7dcfe3d482f8b67e5cae8057e680ceb18dbcec50387e0020a419313df1045d09f08bb9f4ee9b6f734128f4c7633a3db53897330a63061d8ebc194c673a9c1731399ce47e38843b88a403805082fa3985ce46112f863082fa45467a68bf74555d7a7eb9c3944bb393b62124f4841d386fa256d6ef76d820a4071d7bbcaea347707660c27c16a5d1e5aadf546adb0ee2dc92da7f26a4a336612fb604e34e3d27c688ea137d7d1164e372ba8f002d69b480668a1309cb9eb9ce6a79a893e2b8d49c833c319450d6114298855ab8800f07ffac7e70bea785fb08823be9a200e11380af15aca9ccdfd80b7173946d00b2cd450f6ebd29d6177eb72d87001f5c045ee859960d36fa04cdfdc0b6827e3ca5c49017aaf05cfc88c90b566849416cfdc685a4cd9647db1333f6ff08896f93d1b3a9cad63b2be5cfd73e8d551e8190f5efc597a7e59334cb91b4267cd1b54d0243b6acebc8472b680de4682a904e56c37f0ce7629451c120ab8e1e39b1683c5c3d21f0c3b484c27ed90ebd217a4b5a8cebe0c5fffd57cffcbb8fe3751fd83090fe8df94fecbcd075c3969ae8ac2d1722eb66d2662dbeb0ba2c5b67a8a385cff3c3538bd84eb79c22b38c25b62127e861abba6b298ab1170eea1a192d6d7461fbf70fb6cb777fcd283779ba2970d72b3c00de0959c456d272c6aa22a9a45ada28843b8da1146f101f3bdd594e28d2823a28a0f9f2e177646d1183a3cee341602bba7e478e56ca981523778b35d94bf747617647c62143fb886eb6937d5d3124f4f9d6694a4b59451fb5dcbf5bb87eaf7191b11f6e93fdc3f6c331c307569bb81310a0fcf723ceca578a8f345a51eeb17881117d0eb3aaed726aad755a857aef7fc22e07a8e8f6490060e1454031b381e52140f8b7d1ae8357e3a5a9f1bb93ef7517dae64f177fbce0ffde7382e9a292e6026be49bd45ffb9bdbea83f47e96f13d7df7eaabfdad9fe325616b5c7cd5c8f07a81e97219cc1630eeb5ef3b7abe7b9be0f527dd7a3be9dbdc75d5916ee7013a5ff2d44ff4913c3612754b1d2a930b75ee92809fb271779603249041929615755a3f154e1fbe722df564a737008db2dbd77503ff1fe8f7ff23d1f6e7b9b4f3555bc6ab671a67184328d25d6340094615d39a0dc8d2d23daf1453189ed54bf1053608f6f9cd47d0747f8684cc28d14618803b09bd89f667b296fe329efa48687c94487458707979ac9dd5c384ee9801c4427cc2082fc4e824b6eb8ede2747c32ae8e7773945f8a4b790f4519aca7258cc19fe009efe5089f8a49b88923dc1a93709223dc1693708a23dc1e93f03e8ef0e998849b299f62e651b7457d8abbd2dca3313fafcfa5f5f543662717d4e344a2c5f4e0defd71ce67b70af6256742fb92b3c6976c57aaa0dc713e643fa5d2c5e630dedac4018a30a8f45c18c26779c20729c21009cf8721bc8e277c88220c8b76b0e99e5c598eb0887b9823de5900e22f70eefa625c777d841bf197628ef81739c25d31091fe5b0b81c178b63dc50e98e39548e5384eb94f394419c24f00407726f4c904f72d6dc57006b7e89209e344b5db754290583fc02413f053d1908e0798fc6c456153d10440d022d9c015e896980a728559ad5c3b959a0ee35cb11b03f7ed8a863acc03386aba1957b4de55aa08ecf2ba7ee564adda095eb61d47d8d57771be7216fc4f490ed1cc73763727c9a7364af14c0919da188c32ac34018ae039623ce725cdf2a00d71d1cf17401889fa3888303b91d069280e4ed3c87f59d98585fe0080fc624dcc9413114138a8b1cc7c33139bec411be1b93701747f85e4cc29739c223310977538461bdf17e18c22b79c23d1ce1073109f75284e1101e05f7aecdba3f51d666fb38bf315600bfd1cf111f2f00f19729e2306580a7cc634d19ae509421204e84d1664040bcca398f57633a8f6b1c169371b1b8ce19e054810cf006d5018c88e93098ece409dfe4bc083c0deebbebd0a614997c5f547073eab1c9d31ed8678e9accfd890e7dfe923ee33cad0935749647edad1c30b7bd32b968f61698282eed154eca479494307fa7b9c4dc39f2c1535a5336577f1a205f905cfdba6dd4bb36039c448f29897a2248f4500fe0017dcdabba69dadc149b8e205974e9f3d7ea2d0e83271406307c71bf2d66e31e4c2e1db9ef1a1b1ed049d190e17c5a47682faf991d9451f84c737c3ea5f86cf1f099e913ebe782b1bb291dfaee19dc784ef9fa42e9e13627df6751f2357be4c3b6e1d5c919ab93b032605a5124b8c349f0d994047d91475387395bfa236a90c3e12d140ec7581cfc1bd0b2c7d85dc6db878f0d51a41ae2a4fa1c4aaa93a1c65f8bc66ad0f0eabc9520fef8cbcfb70c73b27d2e67b94efc769f3fc04f1f381c409c1e5669bb12d5317b65bb0e968e2ebb8d0e60a7c1237375939505ce0e9a2dd12013d0cdb4f14a8b9f4e2e443cbccbe1f0560a876b8238383e2bfbed85fd66b3d088fe7fdb8ccb2868e46bf5f73844de46217236c258f67ae93b46db9339fc7474ea51a41de1a47d3b25ed69268fe5169df3894b51e84791f43e27e9e75192b60544db5cf91ed72ee84ca122d1034ecacfa7a43cca5a2f153bb263d1b46f2d9ab756ffba751499463999be8092a98b95c9cf45c60383e749cf3e9012459220cd15c2438f71d2bf83927e483852c5f3d061ed3f1f9cc6399cbe90cba6a3789a6cdba7364cc7cf491e72127c1125c1a15812400e36352bc7453bda83b4174592094e927772bac0bdb61a6b742ccff53abdba2edcfca530ba789593e08b29095a3d1260dca264bffc6809ca74f2d5d22427e3bb28194fe494d1d1db1dddc4af85fce260be924d71927d0925d9f18058efcd607a726630923e6e9a93eb4b29b9cecd7a08f7b5dc69e5dc4d4f9bd6ee4a23752efa8aa3cc1c748693f8cb2889cfb3b19f9b59bb8fa37acf4ef9f4e56e7e97cfc91f71327f3925f3e990992ab7963297d9ea634ed277c78f1387cca34d51e304b48a22c1134e82afa024a0d728a1cf28730a2c1f571f5d43d5fa37611ec96a37742675fb2ee3a39cf190344fd7a5667d4aeef73e0007631a71e8b9773643ccfd3687f728fe05a7fee709f27dd7652e29a85cb90965cb58baf0ef06f1bfd7b3da4ae4d2d2489b270a2b4dd2af04adceb75a9d97344f2beeced39a7273f155b8b79c2fc9c57906c5bb43c0cd9213ce37143841135c4f4efab9dec0b1d71070234c01dee90b46e5249b93cab9e1010f595457cd4b01eeef950467b989c113ba6b2793c83c7008ba03c006cb02308500fbea620286a76eddbad963ddbc1c007b9f01acbaca43dc9b9f14eaedc4b950e63dee3213e39e984c6dd2d01bf47a60f31c73a971fe35d80a1b430db4469faff2b7a3ec2d930cd0413c05c9c0d77e9ac7e914c4697813fec29b6e5833dee2eb25bd85fbfe803b16406fa28e93c094b7f738af205e94e541aac288968f17d98adcee374802b9d60239aa2f1a354324f3fa056e6e2f08e8062940cf2240bf5112d0d5165067c2306e40e597b0f6c941592d05e52504e5fbe612caec79aca055ae9382f22082f29b8a0125e72fb3ad52104a31ab5c8aa0fc66492837125619fe2e9920b4d7a4a03d85a0fd164968377982d1a4c9c3063cb7f2f8574d8bc2bb540ade3604efb74ac2db60e1bdcb7ad4beac382f189ceaa4c05c8ec0fcb6520253d032c5c05c84c07c7f2981d95c8660ae44607e7b31c0e462bd777386a0656e9302f31904e60724c18c96381d2cc3c4e95904e5774842e9be0b6dbf277dcabc0b4d0cbc9d52e0ad46e07da72478eb54d8ac337b5674440ed41352a09e40a07e572982fa421982fa2202f5bb4b11d4c36508ea1104eaf79422a887ca10d47d08d4ef2d455005a3bc18a82904eaf79522a807ca10d42402f5fb4b11d4fd65086a1302f5074a1154c1c9a718a87b11a83f588aa00aae3589818a3793fc5029822a38b31703752702f5872541ddadb2179bf1d30c532ada1358991daea2a09f9502bd1981fe2392a0e75a9bf2de1d15cc0ac41654b621307fb494c0140c5c62606e4660fe58298129985a8981f93c02f3c74b09cc72bce1fc1c02f3274a09cc72dc53b20981f9939260067ff341f96d145308b89f92046e692070bebdb98583ae560aba7908ba9f96842ed73da4f2bf515c83a0fca02494e137df38db59f16368a2d08add61ba81a0fd194968b72a6af38d33a18cf614a420ccf55230b720987f56126618830eb4adc6366147ba03e66419c2b610c1f673c5f0a1e1b6d59663727e1941f9f39250e2ef242bf27d78313bac47e0fdc25cda61d1968ac5f6247722287fb1d8b13cfc4e4fc1598ed84ecf6308dad78a61a5e1a68ce5b82ed480a0fca5625b69f8edde82d08a6df76e47d0feb224b4cf8586b672f2cce308dc5f910477bde26f6f382f6bc2e48b3401157bbceb3482f5572561dd12da66fd13d022dd255a2905720f02f9d7e6327c95ff835f8b1194bf5e0c28c3cd9bca711dfe0282f24392506e0bf0a8d16e178b02fdb214d02f21a07f431268f7cbc9b9e1ef4a2a0ae3612918b720187f732e877ed136e08879d17308cadf9acb8094ed450577328b79d1f508cadf9684d25d7d3a5041ab4fdb11781f9604cffbb606209356deb7ef967f4c3f8f00fd9d62c474ff1ad4a7c7c6af0308e8df95047a1501b47f025abe2f6cb98e80fc3d49203713400213d3665d745cc7c41933edacb45bccf311c0af974eac2fc70d8a6b1194bf5fcc70050d616db4d2c2d54504e81f14c38b6600adac65bcc308c88f4802b9dd03e46de5bfc354d96f1db982a0fe4349a821e1c74b25cecbf5ba94b3912c3ddba09cc0ab42e0fd9134780366765e39b3a51508bc8f964e24177c525e2cf06c4450fe7131ecd0bffb73dc5e527ee02510787f528ca81d3cf7117fe79258d43e8980fcd35201b21cd39f4308c83f2b152005f7d28901d98780fcf3520152702f8818901d08c8bf28152005e7dc6240f62320ff5212c868377ccb71eb571782f2af24a1f46ea1715e1eee7c7758876aabb015cc5e04eb5f17c342c3a5e5e5f834db3204e5df4842196f73a220b4629b135b11b47f5bccc10f4fb965bec3a8d2f6235d45b0fe9d24acf0fc255e0dea345699365e55f00118b195a00508b8bf9704ce9d811faca095a01d08bc8f498257aba83548c18756c5f6605623c8fea174a2b4e07be6c4a2f43a04e5c78b11a5a7d53d05dfea52f9bbdc6b11b4ff2809adfb0801b52733f375be9575b7f10c02f79f8a11729a8b1f72c4e2f52a04de3f4b8217ee1b8aca77d1770902f213a50264392efad62120ff4512c894c757ceb077b4f91055790fb57423f83f2909bffb1a1f6e61ae125ecbdf88c0fcd7520253d0c38a81b90b81f96fa504a6e0a2b11898bb1198ff5e4a600ade5e1303f30504e67f941298827786c4c03c8ac0fccf520253f035e76260be8cc0fcaf5202537081440ccc6b08ccff960433de9b40ca71f7e57e04ed1b92d0465bc62bc7f726ad4150fe4fe94029f81d3162506e5015f3dde52990e57fb13934e6b8f7d41862a7726322e8f56dced785d75bb4c635cf9d6ac85ce17cc9785a65be3a3c093e2f011bbe727db337fe06ef609a805530b54f0120097a7c8c164ccb85f8ae724ad2dcf2f1165317a09524ac2257b4fc6f82deadda8d9936986fb5efd39a7788c34d8749fd1998829faaff07517ee64b73e70000 serializedProgramBytesString: - serializedSignature: fb8b259d04b816ccae25ecc1ec9c7f3f780b366dd326de0529d8c4b151f5d8e28e499193f97eabf3077fab35c78fa6c5764a582cfc36b8ec8a482ee6842a990c + serializedSignature: abdc9bdd821d1a867e3d65be2d7e1c24200c3fc091c167ba86b3e0ca2f7cd73ee5a956e1e0c9401344900be741812437a2840053f13005cb04f954516d491403 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset index 3aa9b4b..9cfc83d 100644 --- a/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset +++ b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5afd72db44105f3996bfd32440088502a52dc4853452da19f88f99346921434932759c7f3a8ce3d44a30d8a927361086e105185e88b7e2019809bbab537d92ee2c3bf63538d41a4bd67decc76ff776f72e4939801f6b056ffbf014366015aad080177082bf36f0d9c6cb7f0bda77e1149fc778af63df0adc4c98499f65eb1dbc6fe15b177a38f327788ecf26f757c0c3df5b38d7c3376a3dc2af87a3ac344eaac226ecc0362c598b0924f6795257b459a49795c3fb43f8157b3d168a9838dcb584b70af674b9af8d4207e39ec177ac561bfb9ee39c536821cd43a698fb9be6b24ec10332f82d46de4bf8b5cfcfcfff11edb678924679e9373d67c49c59f19e92da2df1a5fe6b91f7b9088f8278e6251ec13317e19195da037a328f4c94876db135be467cead0018785bc3b82db0433931d8648675202cc6566db43d3749080c26a55f6891e3c80fb4aab5db74a92dc1b7cafe3882613256611167fc55890702dbc3cc9e5bad8fe157b2c395d137b56e1093e69d601aca1133d8b50d947b62d745b0ff6f0de617a0728767c64924ae49ed1394f91a6bf7adad81200dac1f7164b58e1fbcf2ca9c7d26f615b8fd7f209aee687f83c636e71dd4ff1b78ae79e804c2da37a11e9dafda51a986913b521e91d5e03af2d721916e1b0342f9661dae168f547cc12af31f4838ccdc9c9a7b1e6a78750db7d7038071cc4101c5dc7b886817f0781b5822be81becabe3788fad44edbb48b18ebc89de3a73e807e3f08c404f356ae40af758bbbef5edb0ba0fc0a1f461dd48507710d844af6cdd9172ccb86ad976da25e1a3e6b254e6e21459316aae30e51dd4f90711d206399fda2899618ce26644ee2f2b3269127f1d7a29157ab9578d9e3faec9e346472fc7a546183d8b8abadfc085df71da2316dbe3c10d0db0790db049a2e9809d5100eb6645a517b3753e22120dd4104eab08d36b7118c2b69eb0ad235c1a93704607c5ec985064558473a2128e794421e411675c44b23f4439e6f51c733a55e6c65425af037f7e4cf00b3ac20b63122eeac07f4305fe972f334138aa6f03edfe7ee105f5a35866ab50c3eb987b6a5806bec0054784e45c412354f4745965142397749abda9d2ec0b8d663a497cedaa3c661de9f77847f33dbb6285df82a298c6c9c1681f5b9b233aecac4e97b754ba7c7e215d024b35b860ef8851db7cc4e0c5b49003ea289a5cd369b2a8f3371d575feac7ec736dc67b908ce11e39cf4e4ab3399d666fab347381ce554ec41ef811736bf2c66913bf873828d0f0091ff544a51ca4c1600fcbe2657162f513ea29cedce519f4d6058783980bc39f2b10ef36ca431bc23d54f1902b89e453064ad3ba53862398d48633498bad9765c511afe16013a3d22e5927fde63a2b340a6821d21cd5af9aa674cc989911564d399c603ebba037254b715de6967852955406fa04829867d14aa88985e1f1692b1924914b52157f8f0904fbae091caf916bad233c0dae8dbb78d1276ba75c42ff5d93102d3044bedde4ac172ed6a701b2b204d97b26219bd742d6af66a701b03f19b0ac1d21fe7862f1ec62bbcb78e49de35c7786e2516b4fd468a148ccc5e27f4df21bb2179635d1a83ce4122c0fe577fde2409dd45d12e2fdff79de76296f7f4020148334c751e3439351a3c4d6f3eddf65fb9db0d2355cb1115ee39cf8e54371c31e46918bc48ebc146c6f9a842d2760abe3806370f1d79a39b8b2a6e0ca49707d6412aea280ab2d18d7795b5843e0a60f344b02edd66580368d9e969140bb6d12b48200ed28b481370859de14645909b23b9793020cc2662c05a425d83e36091b9dbf245547f2a1d8f441694b507e6212ca450d94fd0272ba812c48402e5fce523698698dc106126c6593b0c5abb9692c4c6624b8eebefa1c6b10326339360557e6acc1a5b5ff29f8ffdc27960e6dba17842e1408be058f8342834d569736e00eff29a8ff179ee1ce5307d34cde1dd3f96dc6527b696b623698c48e5fa5e938bbffd200ab38fcc7acabacff4ad44d9778b35345cbfbc43dd8c1c10d168a3ef6bfe62e7530ce2c0000 serializedProgramBytesString: - serializedSignature: b2a817fbe6ddd2dbab0a03b8e8d254c9a5a3dcfaf9b6d5f8a9af23ff1bc22099f45d4c5bda1798464779dcc7ee973b479b7a802a1ad3f5b371c177e7a66ff207 + serializedSignature: a7d9518a82dcfde1d3111d93d5e80e36a40ef64eb99f3b15b47fd89e7026aec7cc7dcadbac440842677a66cb97aaaad4fe889792fd69451d36b9f35866209b0f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset b/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset index 5d7c260..568dbfb 100644 --- a/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset +++ b/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9c59571b37148035c62b98c5606c48d29474c3298bcdd2746f1396b4f4d084c3f6d0b4071c30ad53db706c8793bef7a9a77fa8e7f4a5af7dea4fe87b7f447bef1d0dc81ac9c3608bd834e3339a4dbabaf79374a591060259069b350dc12edb64cb6c96edb04376cc2a70b60cc732fcec2be7fe06abc2f17b08f3f06c9a4d78a4c46dd21a83700dae6aac0e299fb3033816e9f9162bc0f91aa42dc015de3d82bd00b1ac2024da612bec317bc4d2d6a887885d4a54e3f72cb4cb8a42b8c47e82a705520a33c9d2a334045bf0a446cfcaa0b413ef09fb8ecc2ac3b3034853652590f9942446f7038c4e987d08f1630f3ff6c11e867d54b80e72c062bc303fc6f9794ab8c6633fec31e11c8f0392ec015b36fb9b5f07f9715048ebe41711e2a08cb4f43ccaef8fd9369de9ebc81c52c88c79c8ec1564e27580a789f27315bf84646382f3fb5dd267b8451b2faacf88a4cf882d3fb02ee9936c379f9045b5ff4ba88f7976c2b2a4e05d76f166eaa4f46ea0283a8c016e93946d1d9ac2090850b4921d6a8375b6c0e695ad64dc8a0b7a2f5398871845123aeecee2375716a85c097e05a189d7e0fe17e421b09117e1c92c5b8723a6da6773d0689f48527621db12b88902db86f084e4ed83daee985e26a13b90d36c824cdb5b95e18e03f404ae4ba4e11685a7a46981b45f837b75f29d15f09e4b707c41b9b96dafc2b92acf6d8e4cada3da69e9eedbaed129a615b006b5cf52dd7c55222fa344107d789c37c360963ccb2fae9278c5d07632e8a8d7b88c39426635dc9b6759f2e59b2e82fe6d745ba8aedf36ef7b6cb1a92d6a3258dc37c982f312fef38f7f7efe35feecc750a3690b2c4bc3875b1ea635038bf23256ca25a1b909a15030878acaf82d157eea8eb7ae10bf1daf48f1fc1740987aa6c6022040db70f202f61244de80300fc94bdccfad43e23c74aa2b10d6617795542ecc0726194557eaa5b00e7740853b7ad5b8bdfd4b33dcd133bbce71e3a62618d310f4d24147b0474590c66bdf1a25e81e8839674b90f60720714abdeb7348af1ab835678a03ca1989a99a671ff19c500e27fd69a4231c5410ce21e1b84ac998a424eaa7111c5209c6dad4afa851ffc2e6121ed30b0fab8463f31d5079077cd13a913cc232f704257a4776e51dd1e71dd1e53da8cb7b0f7e73b01ff23cf11a07dbf69bb99fbca3babc875479dfe079e728747ce043aaf36589002638f38e3e348ae9344a34a3916b0b8d5e5ddec3aabcfb95342e63739fca2b9132db57e8d7f1d93149c9435cff9e1d5f91a764cfae7643497243632ee3bc55d0b99db80a61df55778d8f41c367cc7e59f20f70f4c26e3ca5e916bdf2d7d1ebd739ed748b4e7b4025186bf698b2b2c892937ac9833a95c75b54794827f8468b82133a16375b6531ac53f9568b2a8fe8547ead5595933a956fb7a8f2a8ce87bfaef2e10f184e3457f824d52a35f022cd6c884d69963cfc31b8883d905aa6bebfc8a7b6f089b7048c2536d54647e7a7af48e9ec9b50d9f70d73467aceb84d9c00b4c7d0e8ec8e68aa0e9dddda59cc557081f6ccfc26595100bb4e29b6cd03e780ead2aac02ef5bb45089f9275b2dde29b8ffc4ce4e587485a47e48e8a48c12091ad9689e878c8a97621872268e587d3988ed31b2a4e3b86395520ee32648516a1dcf3347eea4c730e11f859163a8b55925c85941b9402af6a2c4ba3861c53bd0da927d731ef32940bb6ddedb332f59e6a7f93e9a7da8f5cddf865675dbdac5095daac506ea275de36e9679823dc22471690a611c675b3f42d2cd51e5eaa812c0d76a62e599bbcb5785bcccd73b9c66b8ec916f0887c1408c0518fd72b9d679e5ec3cf1912e04c4fb661c5092bda03d0f790c6cf35f8ddb7188b8402392c8b774c020b3500eb0634b83968264da2e96d4083c703aa43dd00e92faa3f919024fc61db3cd7e5a6aedd3e76907ab517a01ede457987b2cfa557a44ed33c23d6bc8cd48c3217f243196d0d3beff0d51d750e3bfcbbfff3be38877df1bb0861d4e9bac8274c99f40929664f96d943af0a446a36d8cdc9f9b7b2e4156bf01aa98b187719cf1117dcebf455a03ce075b1de74bc6c1065c414cab08072c6244a670a17333ea23ae9c82eba3bf5f6810b99022776f1b326c1dd5634e7c6b745fd6ad21e18640c6d9f29b44302daeccb6cdea2f2469b77cc14ca908032671225ae6ec9eb74dd57f37a045c739ddba8e7ba10eda08076be73fa6c83fed1589f1d15502e746e2d5decc25a9a14d02e9a447b47811695a813bc0afb8a7f2d7add3aa48000f8bdce710306ebaa3137d02ba0bcd7b96e60a10bddc0b080f67d93689d8f6adc6f45151ea5fbeaa525c0fba0739ab8c1419331941101e5872651e28c8a3c7c773eafeabee61b14b07d64125b5ae119f5df1e18edb193a660f609303fee2498061bb431980302cc4f3a09a6c1f72063301302cc4f3b09a6c1218f31982302cccf4cc26c6d3469d0831aeb8efa05b49f9b44eb6f4064b0961a1b10c5d8b55933ce6194fb4c5820cd286751334d0767f6326c82db5f012dbe66057ae27ca37fbe249ba5ef6df155d1cf5733cd657aaf97e2779f614b5de34b6d2bb776ac01ab2c6d653d38dea454b2f489f275b67f89d97f7a4f1b56d3347d2db003256f0bc7cf76abf4df22aa1427f41f588a614029430000 serializedProgramBytesString: - serializedSignature: 269e2d27be516e93d2af424297ae9ef08463e55a112721f5c7d81632c911fc0f82bcbdcc00555b2f1fdab4fc6540fb33f19d4beb519e6ef28ef560fe6dcc0c00 + serializedSignature: e0d2b09df2a2e39b8f1b94b6e76965d3def0b59c775760e99000fb6e916657d5636a4a97ba2b612a6390e81ca649f2c0f04b97c14f71597d68ea04b03c0a3804 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset index 020e917..cd04bac 100644 --- a/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset +++ b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b53db46145e19cbc6d860201093344d69d314a74990c169daa6b7844b52a6699ae1f6d0b4e31830291d73191b68f2d8d73ef7cff4bf75869e737665afa55d49c65e1368f0586bad76cf9ef39dab5622e630f8b3eec0619d2db37936cdd6d816db677bf06b1eda5df8f033b7ff39ab41fb0a8e65b876874d86ccc4bf296b028e4b7056678730f3886d42bb43d75758057e2fc1dc0a9c61ef367c2b30ca8ac3a435b6c07e62cf58ce1a0f21b14e93eaa2cf42b9ac7e38ceb13770b5424ce1220e5dcac16105aed4e9da2e30ed8e7bc17e25b176e1da26cca9b12ad0dc208afdbfc0d12299a8c9b2c6294b49bf2df14dc07704bef6c9c9c9bfa26f58b431698e2ddab8d417176d9fa0332acd93fb2f79e867449b9668a5459b1273c6a4736c07449b14d7c73db486a4b143a21d14632f4be78491e8cf4934dd7e1713790df77cc295c3b648f3df832ecaec803924f0ad364cd49d196e9c483a11134a9ba2650fc10c0e8080c242d6c8fe0e5991cd2a2de48a9591f89ea7631946ec10515cccb3c43fbe2590b92a7c2a9279d7a1ff0979071af80e5c99664fa1c5592fd90c18ec0b0f957558b60a2e5261ab703c207a2f816dffc83091d015bc73968126f7d45de871013d80f32a71b842c763e2b442dc2f41df21c58d3d881c73d0bea6d5fcb2d7e0b76acd5501999a47b5c3eafa795870d5b400d220f70efad33b8d9c894628945d116e187728f2fde5d3c43b0c7990b12911721a333cddb4f4cd3287f2c9cf3e04db97d12fa16bdf6e605d010ffa01ae95617c85b484fd6bc46f3300b78e7265532385eabf4b1235356eb78a58640ea60ceb5a8888410023bdbc755dca2ba711c5b6e30564d8ab164ba5164a857ff6442d6139f209956f15a8ad36d8ef22b8b9ebee5360438edc20b90ced367181fd9b02d1e0b582959c68e0d354b24325c2621b99debc14a8b2582121ea97bc35a9e4cefd3507347f83b58e29511cc14aaa156cdb67ceb4428a5678bbe4d7d9774c65df5422968cdaf71af4f17a6a91aeee90943ce46340adc0d843922b6864b06d0e440940a4b13469ec06635de24b87769f0a6d2ada578ca2dd4a998fdba17141294b8d6a2632aa8384aabffe0e5b5f875e5c851edd12edf53045163d123c85b165f0397e86e5849b5f9a631660cc1ff0ab2ac67ab3503104f3a1c8986709f3595f3634c3b54e53b6425305d4d4b04a9094471094414338a132814caf1d480ed3ed3bd04864658e6a1c286c7d9d5a922ab560f8b914452d837ab5f4eb088f754838a5233cde21e1011d61dc0699f210b6d0ff106834981a013d4980e33ed4247bd0d6ca699d6fe43af48d8c8ef044878407554e479dcb3d74bab05bc12097c37bd29c0701fc53bbdd5572bbcb3ed98239d039dd904e2def75a896ac8a309e5e8b42d8d6131e5611464f7c3f0ae1b49ef088cee9aeab9cee4d2389b9e9469fc0c293179add342bc1c79dc96f08b147754328df34961a67bcb4960b6b6e14487d9b3609d1a8971a2317c1d479f1be4cf1ba02dc1dd3685c5736af7518bf03b3da0925a33a3c3f50e1f9a80d3ca394031ccd570c37ed4b245f1d16aad259ab6c329576e4bba4936f5225df7da62bdfb124774b77ce755d707d287a8338ee86a6c674927ca892e4a1514d2d369258b7f434ae93ee239574f39ec02aafca39dd878451628f80f32dd226dfad0dd65154ed9d56c6cb3a196fe864ec8506dd87615e299ba9aa1d19733a193f56c958f4e8719eb4c4a39beb67abd017a48d269fddd2d3844e869b2a190ada98b100df0d18f44aca1a7efee54abcbd3891848f6561b25c240c6a30f339cdc0b33a73a86e28b0e89b48b8f62ef083cf395641c40d2ab9c2b7863e61fa8767dbbe22e8b4cf51c2a450e5d1692993cad245dfb4f43f334a0a895c5a80341552174dd229d46a9fd06acca19aeef629ad299c8bbcbc5ae803d8b00d204ee099d814b5b0262fd1f432859650fa61f7c7778980fb50a10bcf8bd1a878baaa913aeb8443d28e1510f75b26c1192570b8c6fc19a69929ce03687f4ba07d6a12b4b140d056e8ad944dc1d47900ee1e0197b43dc41f772da69d6e03d91f7db394ef5ed3638d1ad1dbf24663ba497cdb38bf2d5b63de1791f26d59543eb2d3368b0475722ff08da9ff77fe2ea051dd451046dc74471164da6404c990064b3481db017f125702aff5acd5c9c3ed544becc84611e434f1232d055ec7246c299286df733f66f87e6015d8300658da1460c3126005938025859d1d898da88239b06c5360c9b5d08c49b0060458ad779c33e6201b340559bf04d9ac49c8d202b25db1709936198cdad9a829d01212684593a08d349c52f7ba885100fb4d01684900de3b9bec69d0598d65cfb804db67bd8f6f060b0e63f12d254176df246448973fc4397f79332b81f4f9d9b863f11cbae39004db1767039bc1e06faca48d49b07d6912367c60127eeb1be5a9c8f9b3cd8c04f283dea70a8376692c552425c8beea3d640623a031c80624c8be3609d9cd00576eddf3ba98ee6c4b407f6312e894b0cde3c6a34ba3a5f25553800d4a807ddb6bc0ce63f4eb63176667bf80b7cddf3169b33a2f95e779cdde20df021f11f26281f523ab50b1b5055f6c9bdbe10ebd1085f713ed3ce50ca619be57fd1045b2d4765ced9a9ebab1ffae92b493bdf84c80561c7a79eb22cb8fefd32584dac94c73b49bb6069ae7c4f1ff796ae2d543fcb3ff036d079e8ea73f0000 serializedProgramBytesString: - serializedSignature: cb8d22d108f291e6052989feacef45af7cb16edc150925321180678fece817999a075685f6c54baf6cc211fb1bc80e08933c19ae6b20e66ed78f7b4d077c700b + serializedSignature: 718eaaa29714a920a08addcb32fa4d4f6aff80c3e5933aa2112221b65766df14ad504b2b44f228abd150acf5901a12324386df1b2deb3d6d8391f6497826d10e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset b/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset new file mode 100644 index 0000000..ca58cf6 --- /dev/null +++ b/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 4a11243f2a6c0254187bde32bd2a8f41 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5c6d571b45149e0d2c4980904281d056b4f5add4b66c80b66aadd5422be2b1d8c3db97eaa12984164b0043a0addffce207ff84e7e85ff08b3fc0dfa5f7de9d25b3b333fb9230246093c34e765eeedcfb3c77eeccec24a41c062feb1a5c56d8029b61e36c99adb31db60d9f6620adc0dbbdf3f21fb12aa4cfe05a82b26bec62444b7c5db646e03a07777bac062df7d91aa49b54bec8caf0790eda96e10e7337e0af0cb5ac4e68b4cceeb3efd83c2b5843112256a8d11ecfb3d02e2b03d769f61a4acba41476e25051012e8b50b247651550daabf798fd406655a06c0dda54d916c87c4a1233bb70b5c8264a6c9e76f134cdd30ccf1be0f729f8cbf2fc94d4b683a73dbc8e25a4bdc2e71e210fd31cefe3ac708f88fd25c9ede6f506f97d274ff38afece089ff3421ea67d527f7dae2ceb8e24b79fd71b12eec5f6c352fbef85f6585e5061665be40d5f033f25b6cb1c02f14a02b7f55a463b2c8aee4ab91c83e762b735708d5d10a0f09a65f2c91a9b62934aaf3967f50a7acfd0b504353649e848b08bbf035da0725bf02e0b2ebf07f9b33462d0e937a1649c7d0b29b67ac226c0891f4b5256a0db2d183665b604d75d92f704d40ed68c32098787dc660164baa3b702391ea0bb70bf451a2ed2f580342d93f6739057a358b20dd1641ad257d45bd0f62a7c56f5b9c42153eba81ec4ba7c37547834dd076b507b87c6d01b465ac10842df35c28761a743d1e5b700136f3074838c4d93a32b63c29d9e7c7993cca1f966218060721b8316aafddbc5fb16bb116a8b1a19a4fb02595067f8f11fa53ff7677fffc7f69b36c51c9a7edf8a302d0c589437660d0724849b60db9d45545486df52c14f4b83c56384dfadb749f59213d04533939f000ba7ecfb50e12508c58aaeea3350bc03a25fb00033451493267083536794823a78532a7833c70d6f743c0983377368571d5e7ca911cc6a108cd2418760870a415af7558c22b80c79eec2e701956ed26c39ceee517e0590a891f6684b9cbaeeccfb9016f6fba44f38eab814be2ea1ae46bc8710c7486a5e671d4b9d2a96d0046bab452ced83cea8ff228dfd2ac90ab7db6b119fa3ded81ce588a362284747a3b18e215bc15031c3f736f2f0fe175e76563204079d4678978a7eda04fe6294feb83baa597a005086ddf953f6235f0a7bfdee109ca891b7a45e807483b4c07c8f86f0bec21d257f884f1d638736c70f12ec0bcd5b81fbe714396c3f39ec45a576dea76990f91cfa3a2027dce78145ae6fdbea2131403db497fdbac19356f9378e69ebe796fab73ba5a2bc0ddaa9bbf2e6193e637a49bef70282c601476609ea54a10f2c6dd6a3f1c9caa86251a05f180c12df7763f06dd22a1dc319557844da87548bcb6e62bd463dfb169572cc4ceb636656e5537dc7bd3414c752f2a5e170ec09b0a0591646f5afe3ab5bc7d7886e3320f2e56d07d6f90621096f3d2ade28c06fb464a92323a8abe771167f79732e36bbe789dd8f429637cd68a9f3815e950f201317548acb149fd7539c53514ccf96978e716862d90e492941dde483131f325c9543b49abf51e26f24605cb40a3a6efa54dc20846f2bb592c919d59393d7b1fe4e93ac9fd109bed8a4e07e1d16979ac562401705df5545c15f0fe75e6f6e146746d5ac3b7758b33edf2ed0282e03fb07547b9cadc27b914ad741e23ef90fcad5cdd8583f991e71e6fe559fef8a0f6c56a5b21590b3093d2789fa677548bfa7427a591b09c538e822b703c16295ac2eb39fa079894616b6c3d26829f1eaf811f08feb24380cea70785f85c36d2d0ef22389ba1721abc8dc33e2b51ad0fda8991dd259f481caa29b2116a936f0ae5d9e87e211cb23105582b66a0b1a67665867c7872a3bee4ab1dedfafe899682d8eb2d7340a9f090f86c2753f3acb0a3acb2eab2cbbd210431e2bc93c2a0d6fcbc215e1038a4788d2236a81777bcca1d05f64f1f7b8d87705462e2285d1ed292116bdaf1963fa93e0e0bab4d143c1c6766e734aebe2ef408307a0696e91270b90a6a9f0b4597a456435e5d02474b5416f8ad602d7ef5d1d6a1f4a7e24e20a98e7cf6cb45be6c87ea27688d74980776276045f8240e7ba0700add32a7a0fdef8b591b49d2a22fe574d8274d607927fd553a6d5d549828d116c695b12fed5910dd2c60e1183e1244f01fc153d46ac92bc7539bcd0baa7dd34bf268687b104de33a61d8ef5194d3d13157146bbfe3f9f6c8a38d98c2308035e6ca6d8e0988c0db8615c3be449bd9691fa6ce66b06595f7cc8c531a89118d12984d6a249f872127cfeed8731e07a4c01d7210037611238dc57e0aa788d0fdcf09d76d11c94695350660428274d42798143e96e0fb6a152bccdfb943950cf9b02f58c00ea543b823a790241cd0ba0de684750274e20a8bd02a837db11548331d518a83d02a8b74c823aa5989e4c3c5c3648c2a02912d202091f9b2421c749c08e37c8af3dd9f8eccc1870b629e09800dc2726818b5a5c89ca1bf5c1ac29286d01ca4f5b09e5b1c5d4822928b30294b74d427949315155290ee246739b7dc37f7372da7c352500fc994980f3da78b9cdab9cbc5d94258077a79503ddbf2135b822350665b700e5e726a12c28067ad8899ec1413d6a0acc9c00e6dd7602d3a0671a03b34f00f38b7602d3e06ede1898fd02985f9a047394835963cfe919bbbc43d27fa1dbe890ef37052cfd92eb741c3c1507c93adf394ff8a3ecb1582705ee394f3f4704bf1fff90167825a85ba2b47ee6e3d0576470179fe4dc395c66f481cc341a6da94744f04745ad3c645259dacc81536f082b0e7dcde734db3fc3dcffad402f74d3021d472e03f3ae707c3c56a57f8f51a53af67f57b4d2ec1a440000 + serializedProgramBytesString: + serializedSignature: f97e72676ea7a683d7961a8c8bc95b2eb369b8a74846039c22a0b69970a4060f27b932ceccf8c350e2dbbef215757104005dead9583fc6884a2706c8b5e5820d + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: + - _maxEventsPerSecond: 5 + _name: StartClock + _parameters: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset.meta b/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset.meta new file mode 100644 index 0000000..4ae7dc1 --- /dev/null +++ b/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51da5675278beaa4c9d5412e3c2f1ad3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset index 87ec2ce..1f18af1 100644 --- a/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset +++ b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09f6b1bd333d5353f5757575989edda284d27fb1c3fa6d40f5a87655abfad5b0baa96ee84fed3a9dd22f67cbdd7f59cde8744cbf0feabcc36a578e33e1af2ab649bf77e9ad5935a7cf9c57433a9dc0fc5e35a23f77e97347f416ec1dd5ff23faa8d8727d52bfea5097d4455519db9043c4009e346bf6c5c0aed84afddea69ed5b923a8145c24815995faad57e7cc62de9456da3dee31f5389a35a5f386f439336a52cbbc8e1257eed23ac5d026e70afa7f85feef309f9799b4c8ec3f4b8e73f79bd331ff1cd906c9e3667bb9c9ef24db90c64dda64f2cf131d202d3669b3d9d765b6579ab4c4a42d26ff21b35d6ad23293aef29cbfcaa467ccfe0b66bbcd6c3f6cb6dbcd76b7d97ec0a4e526ad30e96a93ae31e95a93b69af32f3ab6228ff8ebafbffe3f937fdaa4eb882ddb091348371b1997ccf64ec204d22d9efcdd8409a45b3df9674cba8f5c732fd907e936cf399bc9b55c99ee71906e30c75f36dbfb094f48377ae45511be90567af25b4d5a67f65f21db90d69b3469f27bc836a447ccfe5e8fbc63667f1fd986f4b8498f7ae41d35692d23efa4d9df4fb6213d65d2468fbc4693263cf20e13bdddebb9c7417ad01c3f60b66bc87eaacf2673dc23a45c5cfe2e67f73848d77bca6d9d67ff5565fc351ec3e8755ec7934135ad1258f16b54fe61d63d337780c558036ff05785979dd3a16c5a0bb044b97e8ca173aa41fb842dca6d8e9511bddbf17d501f318142e1629e4bbc927109506e52bf4648889ed5fb3b31c243909ed039b53a684ce0594f68377d4cbfd2a50ce8cb4eea303fa29d6f5e5f0ae43da1d5ce3c32974910cebde7f468994e6b33a5f7b840a7f5f6246ad88befb750d311d4be4bef9bc3b6ef866efdda747a1baf9669fb8cfe6cbb669f4166d7d1dee870fb9da6cd2da60e6d0d689fc0f667a94416a34400fd8a474d355c9ec016fba58c925862e80419e8c874191975882c96b6af5e25b0afd39741d0bf8d9916dafd1bf26ea294417d6c367bec74a0c80fa115a95256f174bb1a5402fb6adb72d8958d2ac8abc61eb55ffde3f1e549d0d2cb3f66e19f8c9b362dd3a4128f49b0c5482ee22417172a7999cd67b0ff3b26ea33fd7a9fd3189ec5dc098ca0b5ba4b3ca2f7b9830ca0cf1de9fa4b371e3b8f3a64f72c88f5db3db0664ca8c970b024145a09fac821a584f4e53c69b9ad5470f4d11b624dee45ddc7508eff7a0c839d9d5ed764499722e9cc8e562e1d3882715b8d01826576b55a322a4d295f6956d88a0707353d21164fae862d5be1c088b232efc229c7c2d998615b760db8a229b6150dd0abb028055e945134e57cd1ace4ca7d35e78e3ecabd8413bec62afc055f4eb58ac3b2962b2b1f584a39e1eb02105ec6095f6f115e51e54ff8031cf30d01146839277c6300055ac109af0c40f3d59cf04d0168be8613bed922fc3fff7ed897f0b59cf02d0168bece223c8135eb9a5a8cee0c0c3fa0733fa28f9dcbda3d8023b3c76c98fd3ae2e1638fd7d02dae8ec1ec5a307a71917cbd8d36869a70bb297338f486e3fcb784dbf3a6ba43715d94ecd7e7e86db05504a0b7d3a692b712ece02bc1464ef0ae0205577282771728781327784f8182377382f71628780b27785f8182b77282f71728781b27f8408182b7738261babdca2338f6a0debc6e86d8a7b4473ea792ea8e4ee55f7e6cda618b6c656147b64b9ad493ca996ef41fd9aaf38e6c354c64cb757d2eb2ede43ce2a0cd23e0eedd04120cd71f82f0935d364bc14f0ee553a96a78c1bb3984876d08e1a6dda8deb8a977858dd10fae3d1cae2305e2dacbe1aab5e182fb6fb3a4d59605e607d03e0e50a24040fb3940491b2038fa96a9f850dd1b0a42e407c0010e405d8100aa3800f53600103b9fd61f07f1d819ec1b43bc0e0b433587a1a1400c351c86a3360c10de9a30e44fa21f9cd63578af01b04735931c074c9ddedfa47d35b5bfd997d90739b38f1568f6214ef0f102051fe6789eb0f184b12fd03ba5aeeae3ee20b1d4e7fabb9ffd303bc299d658a069b59ce093050a4e70824f15283869130c530bd0e92c74c6a58e13de1480f07a4ef869abf0e7dbfd086fb0084fe0bc1ac80a7f52a4fd6e7408f6fe0e2c4d5ae66195c0293ef099e0b581e8e87d8bdb7bd8b02aaa5a480dae177e94f3a9330138ec314e786b00c28f73c2db02a80d276cc2a136b45bdc27599e59c4a69cbd976ce12fd9c8d9d31100ac939cf0b301083fc5093f1740493cc89544a7584934d92e099bb004b4a01be9a76d9257e1661e8dda365e70b34d30dc5d8155a785deba69e1caf782a57c2b5ffe6fa39ff23d63130ec7c33ad78cbe1148489a979ffe4f2be745ddac17bdf6eaabcde40d6f32f8f1a236cb251378bb6771164dc09aedd4502dd846f5a2856202ef3e655b1651984650af5b526f4c9b0aab76b32fce284c0bae5d6db7953ede327b72514aff8a659c1aac0f5cb6f900dec7abcd423f08bd3c9e90cd1daea03b482bc439450717eb7a6cb1ae5eb94b987bf5991774410f6aec50d9e0118c67f0ba4f99c9a95a754dbfc630e79a963eabf5193485348379b4d0d257aff989a367390b7a6d169c6139c3a290697dd09cd1bc133577d6497568dd9ed1f9b0df7e76fa7aaae0ac3bc759d767b3aedb5391d3afebd875535b790d35bda1759d50ee8a6010d28afbb26b9f3d2f28bb3b39bbfb6d76f3c1b407af3c8ce12bdd236fdd3dddab355dbbe547e7f39cce03369d3b3d6545af4a4baa13ebb25bfffbd4b895343d3b5b4e50e5d3c5d9fa88cdd6161fe5e3ec19b3689b5ab6c5efe772fcd8f61067db559b6d6d81d8b6b0f25ba8a75ee02c7cd466e13e8fa7a6a83a56f5690be962824c2d53797eb47c98d3f24d362d9b161003201f1e198498ed9edbab6bdd38d6b5912cf13ebd8be6c7aa6eceaac76c569d588055d00d9bc388e14476de0a5bcfc28f2d17395bde6cb3e58e0f5b52d34ae775890c2cb8be8495c3114ed9e187eb258eebe336aecd192d49aabe3934cfa1065358d6d96a677a0ebd8d1e549dbecc59f6169b6557735ae6f463867c5a56784e3034ae7034aed9681c60eb4fcacbbc9120a816a387d3f4099ba65d79f66dba717402716a1a97660c79a2d6e2b590bd9cbd83367b1bd992e9468bc6d5e8dd1ec04d1c5a0f63abe9b4a4d92d0da247d3c759733d183fb3d5888571efe7341d0a46d3eb81693ac0693abcb04816448c5e484e3091ec118ec6888dc68545a6118ccd57399b476d361f677d15962af7296749b363fdacf1d639b3373b81f4bc014d0e7ab4764b8af52b160325cf622499d1675ec633606b562570257a52e5ffa83a5c7b0a97464e6a2b06f527f799a7ec1260ca997b707d5479272417fa0c732e2b9c780ae78faa41f25caccdbadc36f1cf6b171b8b5c599a34ae42bfd72c1da7a55a94c0b5e28716e84db9b59880ab2db3fb90ff05ef8e808b0abed9460b70fa61936680d4afa50e9bcf39af946b01ea1114e03ee51bc0b736807bb56afd8671d83aab5fd331a58ae3454928812725311523a6f988e1813f88851ee1e702ab8e0b7bd62333705460a8beadd583bd206fd81b48f0b989379ae64fd140506df192ea2c152cd54ad95b9724b45293f77903928406640a2074b8f1166bfb0dc9dabe0acbec9a678c72dc7b9d42bee0a024adf697e663c44222c049950a90372591ad34c806f501632a298bab460ad741826b5a125799c1e5cccdcee1cce0107a59bd1cb616296c0d04dbd392d8561b6c53784a17428391074c6fdf427c49397ce552f856107c3361c4b5d1b47167831cb21d52c8f61264b3d271cd1936a646b9d1f3b066826b4e125785b23f9a1102bc2b52f0da09bcf930aae738828249d5dbb2114dacdb514e90dd0a03597a4f4d30a28921ab27c89e918e68e93db5ba08f6d476115cb7c3c355275b21c5701d22b89e95c4c5776c8f46b063fb20c1f656496c6b0cb6596c39e7d50cb947d88d62a2d910541080cf85d110a4776d05c7a0625ddb1a82ec6d6144b6593cad5ed6c3c47055125c77c2c3d520db6e8ae1da4670bd3d8c0a99de33136c04c462d83182ecf9303c2cd53313c425d6d5384070bd20892b7e37e447b36d4c12502f86054a306689813a4a40bd232c5082f3b062a01a09a8774a82727bf9a9c70ba23c5bb196607b571801dee9422423dae3da4070bd3b3c5c7511ed716d21b8de2389cb3e048a22b29d04d97b2591a5ee2741f4821508f7c2fda46282ef7dd21e97fa66b310e6f8c59a801682ecfd615452778e3fba533b0f10642f85d10ca486452722382c3a42707d4012173f032bd8146c93c2b68e60fba024b65283cdfbacaf60d58c4b415304da8716039aa0a789418b11681f5e0c6882234e31684504da4724a1e55ef913c5998d9504df47c3c1071ddd90174e89e12b21f83e265d6567c929217475c506576708b48f4b42b3df018862358d13649f080359fa105ef02e809897ed27c83e2989cc361519dd41d51a82ed53e157ce284e7ad711649f964496390e15c425360edd43707d26fc58263874178b658709b2cf86e161a91519519cbddd4a707d4e1257f64553d1bd1fb59a00fc7c78fed610d1fb519b08ae2f48e282e186fbeb38218c00c406ed4d04d817c36802d23b19824d8058953c45907d298c2a99ea641c8b6027a39ae0fab2242e7eb25bf01900b1e5c62708b6af48634bff099910e2d925296c6d04db5725b1c1837af33aa34f39df5812bddb29a709aaaf8511c7524b5da2d895dd4c707d3d3c5cc24f9988e1da48707d4312977d6c29381c1743b69b20fba624b2dc4b5d042ba8d852973282ef5bd22da6bda311c51542ab08b66f87e375dc6d3bc14a2b86af94e0fb8e749c1b52ee97fc85d04713ebdab61264df9544566c3cee2905df552f5a3d4ba4602d23b0be17463b9a3e408fe29cd97282ecfb92c83207e8517c1e7807c1f583f07009afe116c3554b70fd303c5cc2cf648ae14a105c3f0a237ea58f030467ccc4c6015504d98fc30ff982c8c442fe7182ec27e1867cc1c945b14ab98fe0faa924ae12e55d9111cdd98cf504d8cfc28f625144b65ddd335f389a84c9ac9f43b1c74cb15767ccff3adfe0b9c6580763db6e35829303ce777c0eaad4b7792680307e3fb69f6f09ce2e136ccb2eed17d4004fa94c06562a417c7da8cdd2dcf6f1255c96a5541270cbf89eb6ff9750eec5a6dc8b12308f1dab0bc0f7726bf42bc57f616d3877e0df78e57a59c1af154de391a066217e0d8d45babc09bc6e62cb1bd3a783b3fdd734961525b62ed4a7fd6bf4b2a44f3bd2c611bf4776671ed6d9cbc16b73eaa869f407ba506a042f0fbfe9989bc4f618348bbcb456bd3586b64ea0d429e5fe15e3af3214252114fd4692671edfd8792fd7123e42242142bc9256899250897ebbe4dd817af7ef2479e6f9c8f57dece1bfcff4f03f2c7978a01efe47499e793f6b751ffbf89f327dfccf4b3e1ea88fff453a8ae7715ff73ef6f0bf667af8df963c3c500fffbb244f1f2b4cef632fff47a697ff73c9cb03f5f27f49f2f4fd7307f7b1afbf9ae9ebaf2df97a40be0eaf4aec3ad35f18bba48f1f4679f017ff3f86dbf21d0ab70000 serializedProgramBytesString: - serializedSignature: b4bf77db168380e992792fc772026ae5c12ee15f7d5c4ee9073e37bb481198a93b627c0b338669d40784ef2b27d98d0c8b0594de1fd38399aa2efd16db4b3f03 + serializedSignature: 1a9f14390b38d160753f8d931569caeeefce2ae1b810e374774183132f62888c068cfcfc0f6d4f8cebfc5dcfae7bd001f07947661d6a6b20a2381090b117ba07 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset b/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset index 851db90..e7116fe 100644 --- a/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset +++ b/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d09781c4756806b64ebb265c9b77c5bbe6225b635b27cdfb125d9962fd996e538b11d59966459b6242b3a1ce7b4733bc786000b0408b0c072877b815d58204080702f1076030458ee000b0458969bdd7ad5559ad73df57abad5f326d38ae4cf6a754fd7ebf7fe7af5eaec9a82a4903f89b5f2d7697152d48b1ad12a3ac535d12fffaa97c73ef9cf3933d78f8b4179ec96bfdbe5676b45558694f0b33a314ffe6e9267436258a61c111df2d8a33e6f115df2ef2699b64b9ec1d54bf27f97bc2b3159266a150da2591c1395893919449c568986f4b504d8952891bff78987e4a75d4a297848527d54297fb5c84f86d4677d526973df59715e99d5273feb90690645af947951492cb9355da83f847358a48f93f4517e2a8ae4ff117d3e5b1f67c9ffa5faef4a7dacd0f75ed7e773f4b118dd3b571f4b2de9cbd0b579fa5882aecdd7c729e8da027d9c86ae2dd4c772746da63e1ef6d803e7325714d74279acd2d717a37470ff83fa7c893e1ed1d76fa0739073469f2f75e44d795b9f1bb933904ecb9c7ba6beaecf0bf46725fa6f9c1fcbf5f1a847ffa3fab96f69fddff59165181cf3c838e6c82828736414acccc0c0c839eec96f73ff0964e309742f1c5b749a87d0b97cf6a48d1ed926dd297dffc3e81c8eade81986cd6974ad155d83e33d5ace23e81c9e5be6c3cbe8b0029d838c4735276313c5e3b84f7a2cbfd9c3d7703c23d2fdf7a4e71967d0751fbe930f7ae49874f77af836139f3fe6b9be029d2326935ecda06fb370ebbbdc23bf19a537b6cfd036bca5cf57a2b4705ca5ef95cf2f7bc5273f4d59ba43a4e2121cefd33a3c8ecee5f30a1739320b1bf4f5d5ce79c56bfabcda93fea627fd651f5db00ec6ce3b853b66f8d9709748c551389ef5d87056ebf07947665189bebe86b0c1a4bfe94e5fb4d64717ac83d1636d081bd609b7bf9f176edf3daf75f8b8b6e14d4fba0a4fba5be81c8ee7905ee7b4acf71d59c5b5fa7a9947e6fd5ad613fabc065d377230672db7d8c4259bbd490b7348a3cb4cb19fcf7af5abd1cf7f529fd786e0bd5e1f8d2fb469594fa173a957c96c4766c94e7dbd8ef01993fea627fd051f5db00e266f3684b0c1d41353f4f182c7860b5a87771c9920465ddf44d860d2df74a72f3531c6a60bd6c1d8b039840d5b84dbef2f0ab7df5fd43abca66df8b4275d8527dd2d740ec776a457bb96f59ed6cfd83dcd23b343cb7a5a9f6f45d78d1ccc59cb9d72c4c7de6d16e6906658eb72db27ad57bfadfaf9cfe8f3ed2178efd0699fd5e73b9db453a70748bb4bdf6becdc2d82b7d974bd35b553a7b9e19366963eeed1ba3e1740bea9633b85bd1dd685fca00bdd0bc74bc2ed73971c5dcb863db24dba6ee16e27dc8daec3d156079bb42bd0396a2b4c7d27808dabf4b147b8dbac3dfa7859b8cbef656d872eff65efa3bcf0b97fda6c1f5d8c0e7bf5f1aa96711b9dc3f10ae27d451f7b3d7af7eae7ddf6dcb72f44bed78be0fe3bdd795eb9698b4cf21cfb90ce8d1e1dcc3dfbf5f19afefc79740ec77e24a35f1f1bd0359b7e035ad60be81c8e0fe8eb2fa273d0ff7b1d9bcbdf20ee7f099d0779be1fb3227d1c146e5f197474a9d8e8e85261dac2079df3699f41cf36f797a2bfe17820825e4dfab993912cd0e74d7dfd0bfafa21918ab77ecf327dd921e1eecb0e3972a7ebf6ef7463cfb027cf86911cb8fe117d5e15f0f9ae6b8509353a725046897699bb497513b488830ee39894990770407411fc829fd5eab1c332100e4801965194563546332c5b2975d65194f98932a477bdfadd2eefe851425f4e7fc4a7d21e01caf5ca7f5d680868485e3fa046906010a8477e52238ec823a4ba209b5167e53fb794d3f2b1bd32d074c94ef2887c14c8bb20d54ebf339349305ce44d7352ca7446b3fae4150374409ef72a0d5bd4efeb4ad32ea57d93bc36acc6d6fa6535b14f1e6fa8a7a5db3e28ffb63df3944666d7d13ea8455d7786ce4c3635486b40fba48a711339f241e408a02f7a5917c3c94915d55e48cb8909864e90295415802363bd4296705dab1349384d9c4c2318dec6740bedfeedf0de2c3b447eb6d8c940762f5416a472f84b1f4dcebbff9dcf7eaed06dda06915455f2a20ca6f9810579d589b96912fc4d282c9c5c0b8a7af1276cf8d570524b0ef13bf7f5a8fbc2674091aa99dc19a0009d927fdc90ff7bd5231e92e23b64d3774456a510078fca9bfbe5ff6ea5765a4ed582d862053bbd2acda43085bbc086bb24d7b833c7173fdc25a376a570c38f9d60294130930e14c1493682aa6d768e95607a43ccfcb54fa6bd2c495c575e3522d3db1a6efe4c6100669d87a99de754c5b3cada9c0ca7114578b285702d102eb32959ea5112f4230417dab24e0d7f9dcaa1f3c367d7941428fee1dd1fc673d678dddf9e57e52aafe6a5199759052a6f8a6c7903082bac5a7933a79cce9c625be64ccd7d45e0c4d4de0cad0a7bd6c010c1d2c091690619dbfd75a0f2a684ca9b9951f3a6d42619f2661665b057f80c5af8144aedd951d59e4a499e13557299cd59d5c5d60fc859a99509fe0e3b3770d8af54ce3adfd759291d28879d66a3a82e9efec0e2f1d838ce0bcc71bee2b82043480e4bb2dc46b23cf7fe986a948e8de382c01c1792fe9859078a62858da2ba98fbaee0d89ac6d0afab0c5c012d167e3db9b00de3e954b45d1235dacea0242f8d2a79a62dc79521bdac39de2aaf39a39a8dead31e3514068362ed4a7ab3e47c45384366c68ba93426ef8faa356c234a1b7f2fa90a5cca96290f8199716e8d29af9a65cb7b688f2cb71911a233309b12bc22a2e03936c1703f4c84476d2ccda584afca82f04a9b7068d5dc110449252d781e558057472dc0f329c9d551252fb04986c6c99d4160cca7052fb4090645ee0a2278212d78914d30740ad688f401932fcb9f34e1a5b4f0c536e15037c232256b95e315be9816bec4168655d47f82350c079d10b30539f3dc6b2aa881466646e4a43c5e525a74a911bfae001369fe017bdd289f14e3a4aabb1a45f0693d7e2b60495581aa3892aae2a809597184af34ecd556ad7a7a7eb1a12ab8a554a95d6f29b567129682e5536aaba8f05867098f8930e17119a5f6068bda8f86547bb92d1ea896c015d678c0e9abfe257c6390d89fa489ada0c2f3264b784e840ccf2ba9bcde6cc9ebb72687cbeb5536e190d75b2222b9c326189a4ab0002e6a53693585649b05c9dac27048aaa952bbdd526a43356aeea4d4de6151fba5906adf4501df9905e06b28cd7759347f3fa4e66b29e1bb2dc28f178513bece261c8ae61e4bd1b462f1299a3514f3bbb3c03c4961d96bc1d2591c0e4b2d257c9f45f81b2185afa74a507dd4125447a9dd60517b654938b53750c21b2dc29f0e297c23c5647f54269b28b50f58d47e2fa4da9b29e1072dc20f968613be852a9b4d59289b5b29e087a202df4631396c61726e4a3826db29e1472cc23f1952f80e9b70084147457a17a716ba38f04add1435dc92f69c5afa393b29239a2d467c31a411bb28e1c72dc2aba68613be9b127ec222bc36a4f03d36e130f30a03dc694b58807adbe8c29556d9a8ee941f0edbda61c5f433efa60c6ab11874a42c9c417b2dc2936a68ef84c8dd907d907568f6763f2c3c28f53050ce6eedd7c2644eb57ad939f8f3a97ee73eca154edb5c619672056aedd2585da39e728d7b2caef18969e15ca3810abf67a286df460addbd3674150add1109ad435d3c287f0f49941ddacd864221db4f3dfb3edbb3e7a967b7c948d9964107f81c1c723894360728c667a3323e48b9c6398b6b345484738d264af8798bf0d7430a3f4431b93f2a93c394e4b6a8928f50922f44957c9492dc1e55f2314af2c5a8929b6d926156105ee1cb3824b18c167cdc2618e203bc4b16b5b9798212de9505e12729e197b220bc85cac9eea83979ca2619eab2cb4172d26770a9d52238a966fe0048ee4728f946267b6ca4acad13189bad4ec028108796543be6b42d8b2127ae06c9e22b7416df4379656f54af3c4315a6be2c14a67b2997ef8fe8f2f7513cae45e57196923c1055f2394af20351259fa7240f46957cbf4d32f409e065c2a8437a6d94dac351d5be40491e892ab99d927c3daae48b94e407a34aeea024df882ab9930a1e0f6521787451c21fce82f04b149347a232e9b649869807efc74789799729951f8baa720f25f9f1a892afd824437fe56610183e0b9bae5a0427d582243026f76d9ef4f9f9ecb67c6ed978595b3eb04aa53a01133d7cba52ed9f5eca919e8cea487d94233d15d191fa29959f8eaaf2359b8baa656db97c89c4dbcc0d3724f84c60b77b56d85f20c9f47cca95066cf4d4dabd0bacf4ccc29916d1200ecbcf606c0a643ad78f4b89edf2d9206faf7a426ab18d3b853fd7e70273bdadb8ae14226b9a51c41fa04ac2f3514bc22025f985a8928728c92f46953c6c930cfef7529080739b163c62130cc39ab0cf46daa0e9f6d18c776762ab72f75e15b17bb453c3b06993fccb49de23a3759b9e32310e880ba3f733f74b1f61065eaf5316bd6cb36895a7f8ee95ee31a85cd7b10046f187d50071972a9ec3b2e1e3d535f55240183d1fa4f4fc2a9b9e87c81ad4b602cb6b055c83a24e6b0e9f8c457e188b6f5016bf62b3b881f0b5632a471e54f65cd5afb3a4bcad597ee2ec9d11cea2ecf9df4394955f6db372afc7ff5239e2d8744d064fc7fb602ae2947a77b8df371fe9fccd8e7d0f53f67d8dcdbe3a8f7d7e5e7a4097b5a0366059612c7884b2e06b6d16b490250f3f1fe756a3acbc4674d48334b427ba3d30c83dd9cac54729061fb531d813c84bf7ca18dfa9eb806b59f1d2b145d6c728dbbece66dbae101eda92d14383d66fa72521a813c3d8f53865d7d753f1133f11bf8e9ac95ba9747e9f64cb336f52567e83cdcadd1e2bddcfc576b6aa59f941792fd420dd6a4edeeea76e19d9b3ec1665d9ab36cb0e072a73075403de595f30385a3f34cbbf53f9fa41d6164f50367f6390da027b58d4da02cb0a63c1939405df14249af859102e9af895b6b14493a728bbbed966d781c0e52c533cf196ae5c94bca7295b5fb3d9bad1d7d6a87e38762b9ea1acf8962075b6bf15e17cd13f9fc6e28dcf52b67dabcdb623c2f40dcc1b45f87d22476b88879744bb1e64691abdb351f6109d71c693aa6e8679dcebea6e87045c7d403d06ec71066b7ab43f3fec536b8cc5eae728abbfcd66752ba3d52dead34e2971445904725369d263696a2b816c70b84d71f8988d032cf40adeb3c3a5347dacd9abbd592f48b7d9d36584b1f479cad26fb7597a1f638e3b44dcdf4b735ab590c0db2f5aeb19bf7c1f6b6fec058ac87750edbd70a302a9111cb3c40f0f4ec21d3679d4306618cb5ea42cfb4eaad609a389db3ad821f4a84a313c6a57766a9d97282b3e6eb36247642bcc9715819e1daa2ce3119decd8f411caa6efb2d9746f689f736a53b7e661a84419b9f28fbfc5f25f422d5f6f54b101fa43c7550a381b1249b56d40eda8c599df0f8667f7497d20274e8d468ecc6ffd7eb7a037484e5f2936d6bd723359618ba135288a62eb82bfab9ebe2f70b1b6c8c892a4d5360ae3cdd2ef815c2dd5b95a90543b3aac19a33765d602366c2f9a64f7a1f03b833a028ee932a65e2648ad106fd10d08a7830d19d1ab8a1ac408b83de3d3334d3dae53024cfb230b3b8683cb39437283c2193eee2c12a2b8b0a01672e5fb38d195bbd01d95884010283ca0fe8e03acb78b53b0be9f13d62c8b9fa550c5cdc7de9d9cc2f603b92b9ed0c6edd61111625cbd8a0fceb43a44db38a07b259142f73a27bae9d6e2e98e6d710076ae3405ec073981cd54c0c0a31ad4a3a9318138407b6d5a0ada0f7142ab707959936ed0a6b0c5239ec18fc1f5c3b9c3650a25eed3c501d7ab25295c3fc2896bb6a5d6c4b0e2566f7eac10c015177a84ef4f133ed6fe4138da744f06fcb451dc502360834a5ea7b767a3b65bcb37cd7f54a09e497580e8541db289511da225571dca7fbd9a64ea8b54676c807bedb7859bea40ed84eac095636ae8c13e64500b430f3f263edca302b5302af0e3006144437062e9273863a97917da1904ea5753c67ed33db01d8b4787285f9b52ea8aaee5410c1c4b84bd886af29fe0c409c5e6b2f0be46ee0e17f1c3371de1fbc95c786337e98f58fd36b5110e1bce522e9cbb10ce9fe2c4091bb3b68fee4e91a15f9c3d70cbb8c0cd44e03ec9096e6e86a8e85e9051cb87720617cafb11ca4f7d9028ddf3198c289fe542790da1fc69eecaa54d45bd36e14c930d0b67a276404ddec26df1ab5c36227c3f930b4fecd06dc561df196e464f2ce642b907a1fc34274adc27e943fd06d34f88bb4fce47207f961324ec233f249cadc47007ac4e76a8e2876d2ac2f6739cd8c2f75a18db896c382f239c3fcf89b352846b766f8b61a3bb0ec17c239f606e8d21cc5a04f317f209e6a618c25c8360fe623ec1dc184398772298bf944f30b7c4106612c17c339f60c671d4672d82f9cbf904737d0c612e43307f259f6032761bd9602e45307f359f60324e35b0c15c8d60be954f30eb6208732582f96bb980498d0d793b948cc59cad3b598560fe7a3ec164ac80d8601e42307f8313269e88bf3efa62428e06d8d8a61fee40f87e93131f4c199901367ad504e364582517c23284f0b73811c2833a5ce86026d1a1c1866d3117b60a84edb739b1859fcb8e6373671bc2f93b9c38cb857da4dc4c39c4af0a9982d07d8613dd42913e5a1e64c319c67af90a17d4d308eaefe62354c696231bd45604f5f7b86b6bd3d8e9702d57c9518327c985701542f8fb9c082b509c0cf42a510c5a8bc508dedb9cf0e0db4e3ae51f1725816ef5da78371faea95cb826235c7fc089abca1203c3bdebcc180d6f73e11d46783fcb89779ac60b0fbea4e01ad9f092371bb8422e700281fb1c27b81a0dae57de04d8a0167e306dfde3d876bd64f559b69593cd08fd3b9ce8dddfad55af3a8db0ceffaae8f26480f16cc64e245bd3fd00c2f9879c3833ad598bffe4c32284f28f38512eb1545641b7f96145fb0417daab08ed1fe7a2d0075f8e15c721df0b08e7bbf984b32e96380711ce3fc905cee00371715cf8b21de1fc534e9c6676c7e9a3e3616133143794abdefa7c2e980b10cc3fe384993eb66e3e629c9258c885ad1c61fb3c27363c290642c6c79b10eb11be3fe7c417ee4d08c685036c6f423422947f91ab68d82bcc3683ee2f82ce915fb28d27cd4630ff32173575f07624e34a74b662de8f70fe1527cea5169c61361764ecf3b08db3df8be0fe757ef92a63ab92cd573b10cebfe1c409df30e5c44f1829621cdd6443558850fd2d27aa15c23dba093743f2015568dd7b069be33e99105a99f0d563b0766390b778b355455710e4f73821aff2401e1078e3e0f13fc9318040ff1d2768b3190ed5163596b2626ce5c2b81761fc7b4e8c33847b4fa321a5489f1210e791f60604f01f72519f071f258ae37b139b10ce2fe4134ed6314c369c4d08e73fe60267f0d626e3fb666c85bd07e1fc274e9cee3dd5c6dffc643502f9cf9c209759fcd281066dcc7e7148ad391a1877b3960508f0fb9c80dd2be2f040718e4695d81662af4308ff85132174467a44fa268f71ec64ce40d0fe359fea6fd6a138b6625c8f70fe5b7ee18ce3eb7a9b11ce2fe6a2fe36bdf31e0fcc1c552f6cb1f10c02f9ef9c20977a40767c0886884f21b85fe2846ba6d96a7503297d2976dc5fe39b8350fe07274a98f035abda036ef51d037ca508df7fe6a2fa09de7d64ac7ed81a47ed08e77fe513ceba58e21c4238ff3b173883378ee2b899ce6e84f37f38719aedddd35f1be8d7b7c46f3d4702c1fb5f4e78de799f0ecf98d0786f1c7523d0ffc709da34e1a922ef2ef0f16bc29f4020ff3f5f40c6b12f741c81fc72be80647c559f0d6427020901352f4032368cd8409e442013f902927175111bc82e04b28013a4f3450839ff420eb665309310b8499ce0e60b6afac1bd7d4e8e0632d836d3a944402773020db7f49ab1e1c3d654df87501672a20c3fa8c1b83b305b2ffc12c259c489d3bc530195c9f8d968ac06e12be6c6674628eb89d7a2d8f0b1bd08350de12be1c467e6b9d78fbb79ee2d0861692ee261f061b438aebcd880704ec9279c75b1c47910e19cca89137fe9656a326cbc7c61cc3c84b18c13a3d9c56058c6c81e116e1393788e482e4168a7e5a201b47e5c3580ee42f8ca39f1c1de59bdc27c47aef315acf1eb59cf42b82a3871d1afd1a7de00cf91efb1bd0fbe10c19cce3dbe631adf4d69954bfcaa9312046e0627b829081c6c7717dfd7ef8a10b2999cc8f0377dbb6707735660d9eadae508e2ac7c6a5caf8fe5d764dd8d70ceceafa1b0387e81411bc239279f70b276fdd8703e8070cecdafc21ec7af71db897056e66256909a4288fbca891508e4bc7c0119c795138b11c8f9b9e8cb048d978c75395bb43c87602ec8279871dc02e73c82b9309f60c6b11e3f8c602eca279871dc95f20882b9389f60c67105f9510473493ec1645cbec706f31882b9349f60c6715fab1604b32a9f60c67189ca3d08e6b27c82c9f835c16c30ef433097e713cc386e287216c15c91abc55320647c6c48bb15e15b998b596dec8be37b23bb3e84761527da700b4e191b466c0b4ef723947770a25c2cbc6b2fc6b78fee406057e7d3783beb6c105b34ed4538ab73b5b4a08f78593eeecb5ae62a98c5851ee1fbd384d72ba3c1773a94fe4e14ac11078459a4d2233fa9911d7f67e9ca05e95d67e5bf7039705efeb35d4fa8b7711bc50d31a0ae82bc4e25bb4f7eea4c1ad702ee3bb14354677861a5dafa4575d5699be802a084da1a129ee8ec9dd0a55a279daa85d2aeb63ebba8e82421ba2560071727a8d58c86b31afd85387dfacc5ccf2c1388f84bbb2be1ac6ab79583deace565268b1cf783f49714f52e25b529a3a599eda3fda2cc275792d01e1ad7f6af817c2fd1f95e90846d6812ebb3e07b99355a0b4f2e608abc0197d3e45fce1e57916540dd096a46f16c80e096d7a39e9bacca4fafce9eedeb70342b482e1bab5787d7a886d3ab1d694e9bd723fb4000ebecf9e0b53975d780f287f6515f70caf865f9776700128b558f8796b6579e752b5b7b94d43e617ea0b684f61904a32427cfd05fd13b9ecb0c1d2f6a215ed4ba8a542d14a9f513be9e555fafe3e4196a65ee87d8cf37a4fbf9c6093fcfaa9f6fe2e439860dea3ec4debe39dddbb74c787b56bd7d2b27cf72c2db27e2bad7d3b7a57bfaf6094fcfaaa7efe0e45946787a9d6898f0f2512fdf99eee5bb26bc3cab5ebe9b93e74c416d5ee1dee667c2e38dc7ef49f7f8bb273c3eab1ebf3757edf580dbb57c88bd7d5fbab7d74f787b96bc1dfe55aa6f296995693bf5daa166797fa792073f855f012ba1552a78300100 serializedProgramBytesString: - serializedSignature: 1b6bb916cbe16e2edec1706e295c79f16f0179f1aaa54edc92a5dc865a49261aec63a494bb0cde923a857be934d22274955c0b1148e1f3937b8b663d16d24800 + serializedSignature: 2176510a018e33ddfe62ca89b30cd07507e78918a08f28051c0af4a4f1c0c5edf9b916ebb119b386593be0ab22802f5c65106bf97ca47cb3fc988f6eb2029606 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset index 9d864e2..316fef1 100644 --- a/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset +++ b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5bd976134710ed913d5ab08db113c0800910487062ac91314b9e720e60b385c5f1f6c2498490641091172411c8635e932fca47e40ff229e12455777aec59ba6734426d1c07e97846d34b75d5bdd5d5dd2539e3087a5997e8b22696c42d5114aba226b6c4267dba45f70d7abb4f5ef9a268d1fd395d2b5477499c4de8c9af8bd6045defd1535b74a8e76b51a57b03f5cba24e9fef51df3a3d71e93afdd5a99535489d56c5bc782c1e89e3d6d104116be8d4966516db65e5e97a53fc42b57528c58338a83a4e9765aa69a36e8394f6da3d113fc0ac0daaab529f966892cc679098ff9bfbc226dcb2f23e283f0ffb9ef99e93775bd68fc8e70cfd15589efcec9765cbfe6f63da7af207e4bd20fb1ff63df3fd902c1f0d950fc9f223f239ef6befaf1f53e9605b60e62e615511dbc281525fa57021af67b2f3b0e86cc6c59bbc8887ed104ddb2440c1e02afca323e6c465258327ac619fdeb770ad508b06848e4787f82332042bd7a477dde77e6d2abf03ef65076c504d513ca03bf77a2a66c9a19e84a4acd1b04d72e1ba58a1eb36e43d25b5a32d934c62570df7592299ee4cdaa0120fd06d7a6e42c3655c7f86a675687f8fca3a98d79b34b36fd2fd2d468bdadea2cfaa315724646a1dd5134a57ee4e5b8fa679b286b577e0eb1f19f9108c30f4d971390d071d449fdf224c7cc4d00d3236162a57c6acbb5404ca2e0b871fada50882e96d8c5aa8f66f17ef6be24aac2d6a6498ee53b06097e11fdfbd3bfffb5f8b7fda41d3e68483656c32c1b4386059de94752c2221de04db1e2cb1a261f82d15fc589697f7107eb75d03edd21390c5ca1424c09ac5e6a82637402fa8a245aa16c502295181da4da9e42a4c6a62996bc8b215ecdfaae227a9d43c3d75e8efb68ca65be20d8c8df05bcaca6dcd9462014e325347524645527eaf494a8e4a7124e577ecda25895f6a040b1a049374d02138a04210bbbd574611f4b66fcbe441df515d85dad7b11670f92249acd0d82cef064698d67a9e3f24b8bd8332e3d1e78deb6905fa7a0686c0c055dfb6d5bc0d3af60655ec612ffe745fb1d71b37bce99e0971a3e664049c5ce88193b488db2ac4d925ac953d8c385cb70529156a9b3ee6f0716f3aecf56a684701ed44c4b86415741066151096380a1e5144c27fe86517428a717cd208cfa9f819deeb15e13199ff52b8278bf4ec8c75edf7e39ad520697c1d3579157ac83dfcba27f124290170073b947ac03e6fdc2d9cda5823ef04b844f77568c1e5d5407cd58d15cfcc273bf8ec32e32077b220ba4f6398b7e253d226030f390a0f99c19e6f53262c16c0400323793b3a3efbaec34a3737a76bed21f11049b1d7e0dab6d5de790c63ef2f64749e5f50793eb25f1bfb6a25d5ef217a5b6339760c843d1ad9bdd9beee7074da0d2067c3ecb6e539835172903f9c8ef1da35e91d6cc55c6a8f3dcbdbbbdd8bed6ac10c75a0afd482c3ab558cd1e27b925701a62db4d8924be17be8e22aa499511398517bc38c6ea61c52cd1404c6e746678a194f889f1d2714b3a334a6e24b49d749d065ce8d75140da928e235c17af94128eac7348927ea948aa8f12851716c4d822dd3d35dc7d9b06a57ccbbd9d34291c4f97627040427ed23c1df68bdc1b8de442f8a32bd9fa3a62c1e505d1582fc41825ba8e4e9c249644b9ed36fc94774967da6b26c3ee4a1fead806bc916695026a45f818da6449e6b74fde26a8275c1534d1a2b0febac3ca3b2b2a3e14f87b76bf91d70a80be469394c4a46f44b5e1a144775289e55a1b89012459d86c11912de8c709d7a8607a3771a3b8fe8ec3ca7b2f3ae113bc3db1dbd9daab897c6da319db59fabacad6a2370f4a8529433982d5a0cf17683fe6a8450b75606d94c8345388aac516983c6566394a3b765f11abd8095b7453d17d1839fdac2e1339b5512dd1f9b78ec0d8a6a1cb95648bb678860c987a1f342ff2df97a64a7d0eb17a64956b8896beebf0eaff5be845359d7fd013efae5704e5ae4c922a4f9847ae02cbde06735e3f0090f7bd05ebc29598b2f78b401b50fa5ffa2c715f048a6013049ca086f2c6095a4d6e4e7c4919252603310e0ad757df88908bbd70dd2af862d5f9bde0fa82467674a2ced4b93306501531b71ae45d7ff023802e0e4ec90f0db7d9b8cbd7d911a0d1ba308d46fb12d68415e2d1c46f858beef34bfe80f0353111f998a995cbb2b947a652921abf83f5f3c4abc78f0afd7b2c35eacc54cffdae44c1f016765cca2756a52de91cdfb8dd068eff3638a422002d8dd98d27b1470819b3609dc31095c557a5ef850e857be2c4ae6a02c988232eb83f2924928272594ee7e75135ed8dd8eda20ac274dc17ac807ebcc87f4d060dac220948adfb3f607ca9c0fcaa2492899335e4658c50552a0217dd01864a3a620b37d903926213ba798d4ac448710e183ee7df96bda831635333e804b26013e0c69c1bccc0af6626e3ec6187443a6a01bf041376b12ba51a1dbf46cca26c6c0cb9902cff28177d92478a725781df1023151b75647736b4627f45153c0e67dc0ce9904f6ba04b6498d5c9fd4a5e5fb91ba354ac68429320a3e32ae9824e38c62f94a93bf3508eea42970877ce05e35092eb3b81df15463808d98026c501c98945389a7ec3526dd92a44f25ee30dcacce98b4967f30f510e51599f7a9f8323c0efff2c1e201d2648de36526a75faefb0d0ab1d4ec1b4bfd4829a92c7d9ff4d2700c2b0e9f6d0fb4fddf08f7bf46f162373d8ee4a33f25f9981ad7a014bfec7f0123a6142a803c0000 serializedProgramBytesString: - serializedSignature: d6e4b9f9ff29586fc00f551f3cd440a58a13bd1db6d56742b26c6d6788c59d918d02d1d4c26fe8d69a25c63688bfdf2916e20661fe293ca7987a7ee66236810c + serializedSignature: dc2c5c101b170bb884ff29a0fd8e5fede7c129d11e6ac6af3787ed118f8f9650fc66f0ef6f206fd0bdd40a1de6df498bb84ef5ab448e5db5199cb0691769cf0d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset index f2fd19e..0808c6c 100644 --- a/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset +++ b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ceb561bc911ee0184106030f802186c641b8c6c0312e0dd249bc4598c6fc480bde6928bb3c15a1830bb081c4bf87272f2027982e49cfdb13ff30a7987e48d728e5355d3836a46dd1a8d462d659c958ea6a76fd5555f5557f774f7a82d2be0634dc3654b3c174b62566c8a5d712c8ee06e09c2027c9d989bfe4cbc81701fae79c89b16e9809af899b286e1ba0cb1a22841cd13b103e101e5af0b1bee97a1ae0d314cdd839f0da5ac0ea8b429ee8ba7624d0c591702486c51a5a24cb3502eab0baef7c407c8b589296c244b59437059879c22e5158069b7dc0bf135895580bc1da8f3461c02cd6f8862d73fda04dd88d34074c2ef068b5bf287e9532cde2181c6fbab4e5c7c2fe3ed3e3aede53a949e6134314cc02fc5ee31fda6bc7769267d349332bc26d36fc978ca57cea57b5da6df96f15e56dfcdc7b047969bf6c5253f2473e2e3c78fff91f9e76438c8da1a94e159597786c5319c9061bfcc9f6571c0a8ed07191ff2c93224c3f3323dcbe22a592665b99c8c8ffae88dcaf0928fde244bc77058e6cfb138f2f937191ff3d11df3b53f2fe3e33efa5764fe822f2eb126fa098907619eb0a8173d06bbce8bd722db8615b174adddddad19dcd19174275ef03345cd96a04bbd06028adeb6497db90492cc2b7bdb88d5cbf85ea26b1e4a1c10516cccd7c43f2b9a40e60ee16b33575184f447e469d0591c40ceac5881106bbd0475bd80af97ca16347b08eec6161b707d4df45e02db9525834442b7e2aff31c683a5eaf00292ea0af217e481caed3f52d716a13f7cb9056221f7c045ef81e84efa9b54ad9dfc0bdaacd0d09999a47b5f3d3a53b2ed655d37d9006b9cf92fffa5123add0080d25776437ecc8621fb1fe5aa1891f31749c0c0e98cb92c61c416679d2e64516a3d67a0582e165ac94506ddf4f81b36f651fa9268d1a1b54f80cc950d671c22bd482c8d244622c40a86a9022bd8cc2af07319f4874e490453ff4960a7a9ab26c34117acc3b262a79281b1e7c9a2ff9c0af443f87c59204e0708570c12ce8206c534098c366ba945ca57c5c61490de576957290aaf5d2a872dc09c73a8c2c4f202f0fe56df25e98fe0c28e6a16da4b7482d942729de1ad59596aaa5c790ceba4967136cfa1495339d2e3b74baec89aacb848a32467b5530f80927f4843b5546926ab6f374ca1d50b9f0fdf70c4d5dbd18587f87e80bd0e35b482ac10fd9dba16ca719e7f1b32463456820ed299d2616cae5d3e215693f0decd834f349c3841a673c794841007681a5b4c78ab0f43b82e750d64b13846e8d34b4750cd71da08dfea328d35e4178403c1c437d6c29afe4cca616dd897d9a528f28bf74daea89a4eac8cb257c405c3ea6b6f6a1cd125053f7a03ecdb011a4365d3f49aaac193d537f2dd6dcadb7e62e95357737df9a1d480e0326366a6bc6a7e771bfaf10ba016940ab9aea3ce85493d2a96630a26aba558431f19c4e5e3ff1013df11e9d7b3c1fd13df6aa08234617543e6723b2cfb1a94fa6a507707a659aea17e821ba28fdd05b2a55f64445a2ecfa933f8b9cf80b8bcd51ac40651cbf345b89429f1e85333a782f4684b74f47782822e17edd483c1c75243eaba33c1295f2808ef2a5a89407759d7a3462a73ea7233c1691f0799db7b8dc006f714147fc4a03885fd4111f6f00f1211ddee988780feb6cef6a54db1bd1e171ad01785cd211bfde00e2a33ab02722823da6233c1991f0651d1c371a00c71515718c4ed5c275155f3dae228c632cee9f548cb125117e8c7d00f77b34f9d961b379f5088b33ea0dcac5d463493b4dab6deebc7e8ac6e17c0d2377e533c30ed129d012cd6ec5885dff189dd6a9e76644f55cd5b9865b515dc3359db9de5698ebbfffb572378cb95ed7119f56f6851fbe0c437c4287c94c544c26756ccf36a00bdfd0f5b4acaaa7dd15ee8a8977f5638d6cf41df5a7ef647f9a15dbf0dda79c6db172da6ff8d3309650d1d3adbe84b1fe299d643995645f6824db14ce73f30185ce431f72bd0c775bd2c7ec520a7fd8e28ba7fe3cefba601889323a89e654127da5914887edace414f5b54abc9d1031bd5f5da4f5045c8fb0151878e5f4e76e411e221746fe9b3af9e755f2a39a37a165d4dc07f2f7fbc4b70d68d8a09f93531b5da173106174580ff7b774dc2fa8b8df88a0bdea2b3aab84028e6d27a4a50f90521e61fc92f2458346a0705b87c29d66a39017ef5b86c2b40e85cf54283c11c2c74d798dcd91f82179de02c95bc97bb974350bafd5f639bd3032cfe864fe5c25f3425d9a77471b5c832d8f388df3c0b33a197ea29261d9a7376fbb0ec7c7c0bdeb810e24bf8b901bec4f6bf7b5f5cb9bd5c9fb5395bc8b75e9ec510dbd7511e8d4da3fc3c897d3c9f733957c6bda116595787f054f148e4c4ba733faea9ea49e9cc6483ea793fc0b95e40f2b3c50b9556ec7cb84c69fe4ccc1c1a95e041a65c3f33a497fae9274d5d888d3ec31664127f72f5472df6dca1813762449c2d7b27029ff016dccbc81dacf080b8c15459656f973a73a0b3e0687ed178027b4a58dd35db7e04371bf14fa43717ba251e7a382a4704ef060fd3d9167676e54d205cba43f0b969412b9b40069daf6f8d424bdcbb5da96a54d8ddb755a533017bfc2d6dad536147e27d521b046e30c10c09dbf6daa8eeea7144c3fe880cf0c11708f0e35e01c281ad52200b34b7b9a45f8e2279968cb21ee5f9a046784c0411d54f7d14bb43a7744f3c8dd584078c7420893091f71ff80dda8239bb59ecaa87429fde4c4df037bc7649f08b0cfc5d0d6dfff1ae78bdc45642aba59a64edb2a8f6cea11298759f7fecf079d1c0e3a4b08c20dd74793afb86fd257f4923eb7a982a3e723127a1b7aa5afad28e72e531edfd05d8b20f5f8871473b10f4cc2860d143c8b2adcf88d0137600ab8eb0cb8872681eb96f6e6347c028570a69c330759d214641683ec9149c8fa2564e5436fde072b831dd598bd5d66e03d6e2578062dcf18785d0cbce55682371743f0ba1978bf36095e528257a02af1b4b40b0cac2726c1ea9260e164721fa0326a5b095370a5195c2bcd836bceac751983ab8fc1b56a122efd24f74e0c27b9430cb63593b0f548d8f081aa7cc63f9eb3b50e06da5393a0394f067cd339de4f06d71870cf9a616d05d9709ed60ee2e9d9120cb4af5a015a1c47cf1e06daf3568066f041ca1868571868eb2641731fdcf73c1b6306edaccf1464e30cb20d9390e9a71d06613336ed4832d8369bd13dfdc73c0cced58c4d3b8619685bad002d8e73b53606da6f5a019ac1ee690cb47e06da6f5b019ac1d1d31868671968bf6b05680b31046d8081f67b93a0e13b70de37ccf5a7b3e307e35506e30b9330e23b8a08d43b3acc55f4bc0c6437e7e9d41888130cc43f9804d19dfe7acfadc57101fc1283ec6b9390e9a7bf9fc770fa3bc660fba349d8cafb06b8bd1ccf7d838b0cac6d9360e1e36fd8c328fc586bfcecf01c83f6656bbaafc1498b31d806196cf9d6c066b0231b83ad9dc1f64d73c6577eb6da2064c696973a19643bcd80ecd873e83c8ecbe58241b6db1c2be3b3b8388eb0230c32db2464953bf371b4b0330caebdd6b8ffcf62e8fe47196cfb2661739c25ff638878ef9a4e32e05e99042e25ededede9cb4df1f467e7196007cd1802bcfb58719c68f48a4fe665881c82f42daabd43aa3d136af52f1370ec221370603b136291cc79976140a28cdedd391499076e1deecaef3564e96fd8f095ef30ef5855a719fcd2c17708a4a5ee3f870db38e46bc48a19234ca4b15bd55b492a53faefb94e547d93aa5dac94c8768df611334ef10b7c55328bc4b4ce127f15f14b53ffd49650000 serializedProgramBytesString: - serializedSignature: 9188854a1bbd406078c2d779acce2431e54f04b3e62e5f9cd562e2249de5e86522a285b654cf893d7f5217594f1782f6f50d1b51986986f4dd008be5ca29190d + serializedSignature: d1343404ccea5ba9dcaaafe3d9e25a14fc561ed042e1587929539eb8db4c118daf27c397bf54791089819380d3cbdf6b2c4a0d9881e44a2229815896951e5901 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset b/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset index ad7d591..5009108 100644 --- a/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset +++ b/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c14c7fbf0e7824b718a97502c140b095e68714871a7a514420c8a3641abb4a5ee2d75777777777777975fddf5ddd99dc93d3b99e7ee3673cf31c3fb271fb2d9ddd9679ef9ce336e597d99f72fd6cbfb3587cd60a3591f369b15b3556ca5f7d768efbac2fb09eee4f369acdcbb9679bf0bbd77bd5876922ff9bfeeb1d6deef02efae82adf1be5ccb8abceb52fffd4c56e2fd5de07d5be2ddf1a7a5deff12cf55aca6f7d16c36864d655358ab58cb2422e6f81f558867311eae585deff728b6d17b5be22bc53de9ebbf6ae5fd9ae9bda9f0dfadf09496eee6b3057eb05678ef8abc6fcad9724fe6625f62dd6f4a99ff070b2e3dc5b597b8eee4fdaf27feae21feae2bfe86eef9731eba3d13b8ed0ddc4a997dbcffb5bcffbf8bfbbec17dbdd5e23e37b88fb55064d40732fa896b9eb8e68b6b7fef7f6dc6b2a6a6a07fa277ff0939d3c07d4c50e3cfa7837b8f41d62dc2dd80b07b3648f8e185a76089783630f826b645095f47103ef97db6f06f86f2bc93783e53dcef20f48989e7b3c03dd76f9e7037583caf23dccd06f7354178a54e3b6a74da417c3b47dc0f11f773837056b290cc6a28ee7700cfa12ef3145d6e49a04b5325bcd35928bc3524eba1e27956d56fd970f08ecbd85d79bf8bb8ee8cbcdf555c8721ef4788e77b88fb91e23a5a5c47c56d637e5df1ac99d0ff03713f465cc78278874ce787596a65360f64d6ec2feec789eb7860635c464d4566cd04325b0a99478afb09e25a00e28acba8a5c8ac9540662b21f31d71bf9bb84e64f1f4c165d45664d64e20b37520b35613713f495c2727f8664a703fe609713f35b81ff5b7b86fcfc2763b1ddc7b7ed57e4171574fb893f9a4486331909ff97f4bb7fc5a577cb300dceb64cbef1a08f77b817b7e6da8e8d850c8b942c891cfb703ba886fd92ca02fb0efcaf7b3c1b7baf732bdcf40decf15d799c8fb792c947e6458655eefdff3f70b83f8a9b559bcefa0309c0eeebdb0d75dadb8ab4efc48ae0bc0bd4e76b2f869a4e8d848c891e94932a18c9f3d92c4cffcf4c44f9d2ee27d75cbe43d0339758f15f7b25c68c052abaf48fd1624719f48860cfb5e063284add4db92c06d6fe056fa233832994fed24383706b6d158bc9379f922e5b9cc8f0b95e7b591e77590e775c3cf2bd34c13a04b93f037b1a62c9c669a067a36385191d14cb85b0c7486f2e4fb22e5bbe6e279310813fcae39f25d0be5bb3aca772d90ef5a2adfd555be6b19fe4e3eaf4c1f4d58287dd49775b445c17d837b52b0a544ef043fbf9500f39856e2babd785e02eebdf868981df8df50d605a5fead1539ad93c8599340c71216aef3ab76d446b1953642e63d42b79f819df3f76d59380f2f04cfa1bcd2b0bc46324e64bd384fb82b13cf4b15bde4fb22e57d3ef017be9771b08b78be04dcf3eb10c4bf5eca7bd53fe9be4879bf24ec2eb6ab78bf54b9df3b41dc6ca784b99df86619b8f7d8359675298cddd224ece4fb74b193f23076f23dc66eefb0bb6ab193611dc1e2f9b6ac474b9b94eda7e5c0ad7cceafbd58d8f67b05329a489bafa5c86bcfc2758bf68adc91cafb91e23a0ae828598f8e3ff3dfcb67fc9a2fe4ac00f75c2f5997acade895adf89bade825ed6125b887f98df46f9ee2df33387f29bb328f1dc142796ce345e2fdb2682cd98aaaacfc6e21f94ce663abc033596e7500cfa00d8876c720d9de91f600fa01621d807bf90edaec3ed1d887c22165c070946bc221cbd14e9a70c836b92e1c9d41383a01f7f21d0c4785b8d651e47751c221eb90301cb29c49160e59ae77d584a35b82707407e1e80adccb77301c6bc5b5ae223f4709478e4138643da387261cb2ef4e178e9e201c3d807bf90e8643d4692af3a2e9e0de4b832dd628ee7ab350f91b93f5d77c454e69584ecb6148bcf709f3aaf2beafc2b3afb8e62a7ae42a7af413ef5785f5af5246ad047ac8efe0fbd5e1ef2bf3aae9e09e87ef1cc55d7f453fd927d34b91531a96b3bd52c7ace43040e1a4be1fa8701a28ae83143d06299c06239ce47b59b6ae047ac8efe07bc9492d0387b270193854912ffbdc1622dfcbf732ff5b87b81ba6f8334cf167b8124ef11d5bcfe26945f413b20dac326db59275f5ead6cdf715b2c72a7623faf9626358b84e3d26085b2b51ff6df58d90b39f783f4e91332eb19cd64d12e8b83f0bd7cd37b2701a19cfc2f593f142e6bce0bbd6b23d27ebe613c2b626e5c52628f24ac3f2da5c23dc4b9bda8b85eb7b07287ac9f745cafb7ce02f7c2fe360210bd72f85cdc51621fef552deabfe49f7fb29ef0f0cbb8b15b270fd52de47a99b17b070ddbc2060d7f68b24ec0e4ac24ebe4f173b290f6327df63ec3685dd558bddc161fb6387b278f929c2c3368367226db1c35865badf59ea7188f077b7b8fb98ecaf3e5cdc4f143a95837b2f6edac9fe2b9d8e4788abac97cab4328985f371d9f63a4ae3ffd1200c320d1f039ec97ae964f04cfa33251ed621b2ee2bfaf86353815f93817bf90ec6970c636d45beecabdc0bdca7120e590f82e190f5d2e99a70cc48108e99c0afe9c0bd7c07c3719cb8d651e4cf52c221fb62ab130e592f9dad09c79c04e1980bfc9a0ddccb77301cc78b6b5d45beecc3dd0bdc57371cb25ebabb261c7b2408c77ce0d7eec0bd7c07c3515391bb270b97efb28c91e5fb02162edfd5efe57b598f3821fc9e9da8e170523c2c1d178967d5ad07487d4e117e2c16fa54807bcf4dc70712c83a595c655e2efb3516807b2ee3f740e7ecdcb0dfb162162e9f4f06cfa1bcd2b0bc4eb22d26cb98a52c9ce76f01cfa1dc25c2dd1ae55ee6dd8dc4f312f17c2db8e7fe3609bb63a789eba9c2fdeecafbd3157fd4f76788e7729c36957257ea56aee8b649b83b53899bb3e236d3b997b83651644b9b2d5564970ad9b23d77b622fb9cb8ec9eb720b265b95ba6c82e0b64ef28e2909dabc83e2f2ebbfb6a453616efe787fd46e37f5d92f8df5b89ffbd035d3b6f8df897e955892b26c7d6d476ca59c2cf652c943f55dacf7216cf579603b7fcba8285d3ef8a406e77d956aca5f8b18a85f3f0558adcd5ca7b512788817e86986cc7eda330df27f0bb4bffc0df2eb25c97715fa1c4fd05e039d4711d0ba77979bfb7b0ad864adc972b7a94077a749373422e0cf3ac8c87a224fac9eff295f745ca7b3917eaacf07bc9b4f2fb354afccbefcb94f7aafc8b14fb90f2653cac65e17ab5e420b9a9e1b958792ffd93f52f190feb155b58afd8ca06166ad757cabf44792fe55f1a761793ed0499e6a3a6d18dc87b358daae1da5709976c9fc870c9f684e4bb5279be47d87d65fc2e07f1cbf3be4dc0de74f980ac67a4230f394fe8b03fd3e72107b078fa3d00b8e5d70359380f393090db738390514bf16393c26f9322f760e5fdc1e27a10d041b6cd0e61e1b47b48e077ce86c0df1c398745a6d1cd8a4d5f009e431d8f60e13c44de8b3ca4a7cc0b641e72a8a2c7a1811e3bc97987978579a27988aa9ffc2e5f795fa4bc9779c879e1f731a55f22769812fff2fb32e5bd2a5fe621fb2bf2653c1ccec279886c974a6e6a782e56deab79888c8723155b90f578692b47b1701e22e55fa2bc57f310e12e763433cb438e46de6379880cd7314ab88e51c2756c385c959c8f0dcbad12bf0780f8e565dd23c0dea8f310d1ff1c3b8ee9f390e3593cfd1e0fdcf2eb092c9c879c10c8ed2be725d452fc3849e1779222f764e5bdac0fc23696e83b8c9dc2c269f794c0ef5ea2ffb3b79c1b2cd3a8b409350f3955d151dac01ae55ee4217de59c1c99876c51f4d82218c87ee4cbc33cd13c44d54f7e97afbc2f52decb3ce49cf07bc9b4f2fbd394f897df9729ef55f9320f394e912fe3e17416ce43641a93dcd4f05cacbc57f310190f672ab670a6622bb2deb552917f89f25ecd4384bbd8d9cc2c0f391b798fe521325c329ef602f7305ce786c355c9f9dcb0dc2af17b3c885fcf4e7bc97e1c933c44ed7b90e55405b8f7dce40e4b204b8efdcbfce47c16ce33ce1732d6047ae75e13f63b76010bf73d5c019e4379a56179fdb259387d5da8d8e316f01ccabd8885d3bfbc4fa5cf1dcb6b65d82f6655e77c487f2f61a1fc37763178ceaf972adc2e0d640c121c2af35a29ef72c5ce2e57e45ea1bc97df5dc6aaf43b56cabc4af9e62a45e69561dbadb49b0be3327d37807bec6af1cd7a70ef852bef9cb07b39f68dba7f06e80fbf933ac9745a5b09d3354a98ae51c27451384c523ebb5adc5fabd8a7b45fc9e6bab02df8f7f23b7ebd5eb1dfeb83f0e47f117657d93f738370bf01dcf3eb8de279a1a2df8d8a9e1bc3cf7d77f5c2dfc830f8618579a80c5b3eb88776ae7e7fa5e1f7d7187e7f91e1f7179b7dcfda1b7edf21daf795e1dd2389fb5549fcdbab9adfb737fbbe927775bfbfc8f0fb6b0cbfbfd2f0fbcbc2dfcb3ca8b28c977c4419df4f8e299994f1b26cba99c5f301397fef1621673ab8f7f2a6c16728ee6e66a13cd0bf877adfcac276be0a3ce7d79bc4fb7d15b93729f23706e11e7c47584ea53f8a1cf93d5ba9c8d94f790ffa5a23cfd53f5ae1781b0b97d3b705cc86cc0a741f22fb478f12ef6f0fb393f2fce7505ea922ef91b01c7fac2c5118a47f772a717a67206fe7f68abbbb9538bd5b617d976263c780e7fc7a8712a752cf69e03db867b24dbebfc241cabb47e17a8fd0bb45d87da57ef7866d4ecaa9947b9fa2ff51e03ba89fea5ecc7dd959d6798fd1840bdaa094932c7e12d9d8e142d6fd4086f4ef0156b54e79a878f7200bd7291f00cff9f52185e943818ce1724d612d45de232c9c3f3da2c87d5479ffa8b83e0674147d76b1c7e3cffcf7f219bf3e2ce4ac00f79e5ec3be17326a2b7a3da1f8fb84a2d7932c5c877b527c7f98e2dfbcb07fc3db2b7224ff5a7146f25da5dd3dc04279f4ce57806fb9bb430cece05a11278353702beb994fb170ffc453226c9f8870fc9e40960cffb32c9c4749db7b0ec4e173c02dbf3eafd8d6f381bfbbd65564cbef5e50e250f401c75e04bc64985e02febe089ef1ebcb8aedbc1cf8bbcb077838a50e9571f85c380e7791e3d8d72b7a3c2ddcc9fe3c9987de5855677613d0f969f14c96b99e1f2572dcea06204bca10ef62cf68e4226bfc2adfcf06dfeade236b302bdfcb357eb722ef95357eecb6203c73e4fcb244362acbb857141b7d2588b3114706b2469c9340969cfffe3a62a36f00ee6f00b7fcfaa662a36f06fe8ebc46912dbf7b4bb1d1b7c4f56d102f324cef007fdf06cff8f55dc546df15fecaf10c9d8dbea1d8e81b611b1d21d722dfa1e8f1aa62a31d34367abbc6465f4dc146e1ba853bc577af69e462362adfcf06dfeade23eb502bdf4b1bbd0b79afdae8dd116c54f6657706e16a26f47d0ff07a2f88c3d1725d6ea7046e641f7b6f8d6cb9f6ee7df0ddfbe23bd11754b9ce5de7e68904b2c55af7d1df24709388c57d2cbceefd7e165ef7fe0088677e3d396e3b1df74f41fe438afc8715f98f98c98f7d20ec40ceb3ed0aaefcb99c632ae3bc0be022fab21858eb51a9470f8dbb6e1a7739559fc53e0271f811d0935f3f64e1fce9c320fec6cbb5215d95ef3e16ee37817b7efd9485ebfc9f8aeb27e27909b8af196cffc0998ecb55e47c26dc1f0cee13c99910c8e1d3b543723e17ee67827beefe92b0bb10eb1ee29a0fee61fd5ecafe423c9f01ee6b56d521143f398aec1c45f647e1f7fe3dc87bc72e517494712be36f19b8e7baa8e91fda59a2f421ead3ac0d70ff986263ba34f1b812bea8e9e64b118e69e09e5fbf52eceaab207c1384fdb127c2eed1bd6e649e26c3f4240ba7fba7c4f569e096cbfd5af83f1fdcf3f7ba3d3be49ac0eae64da25ecb9e4be0c7f3867e883536b16f44b864b9d74e3cff9fc2fb7f01efdd2e51dc7dc7f475a1efe38c63df03b7fcfa2d0be735df22b2e5773fb0709bea1bf09c5f7f64e136d58f429ee4206d7f204b68fbd2bfcab4f73d0ba5bd8257c4fbf62c1c8ee92c148e49931477d56124c3b48085c25445b6fcee2716ae2ffe24ae3f2b3afe1cc89928e6bf4cdc145c2775097fc7649b48dac7eecafb1759a89e53f95cb68d7e15ef0f01f7fcfa0b08f32f224cb2cd93a678da4db633ef494d5ec27422d23f7bd9408658df3fe99b40bfc9ea5e62af2409ef6f2c9427b257c1737efd5dbcaf00f79e7f9365ffdf6b81bf33e47cfad753f3b7d29f3f141bfa43c817f31f267fa2f04e26f78db07cf616abccbbe64a366f0abffe04f6f2a712ef7f09bdcac1bda7d79435d1f4a9942bd3e5df8adcbf855c99afa7186fb20e3cb566c4ef649dff1f10f67f84ac114adcfcc3c2f51be96e43443f9b8befff037efe2764dda2f829f7a39b01eef9f55ff0edbfc1b7d3e43c6111af7c7b33587ff3efb9bbba41fc4fcb16eebb24708ff9a5d6759285b9a59009f663f3ffe6b264bb408439ab060b95935952c60ee03b5006f9f7fc1a03b26381ece9b2ddb6bd785e5309634de1ae7dc064ba64d825817bccaf4d1199883661562d20ab969025e7fcbf1d6693a8aea593332362fe9772be92421e3c43ac1b987186a2c3eb896567d566a13c384bf40b6729fbae65897dd766bc11f8c39365280c49fc61ef84e527ca1bb3ea02b6b25e28f2c6ac7a2c9487f9f79e5e334f8ca64fa55c19eefa8adcfa42aeecdf4891a7df0fe07d372b3be277229fca027b5165893dac66eda9c48ddc176d06b8e757b04797ff37ff56dab6cca7e4b86609b8e7ee6e08e26296cc1fba24708ff8355bb5ff646196f914d85bcbff9bcb5aad8459eee33407dcc37caa310be753623facac4640b6d8f76db6ac67c97c4aee995502eeb9bb470226b325c32e09dc237ecd91ede25499a49a9e12e509efb3906dfbebeda5ac77c5753178f69eb81681671f886b31ab4ca70dde48c1ef0f03b7bc2848ea56f4a366c9bdc6a6837b8fdddc3181acb9b2fc937d086f266123e5cabdc8f604f730cdcb3dc7cac13df7f79d88fe49792d41fcb70cfb9925f7ef5a00ee3dbf76bf44d1597e27f713db0bdcf3abdc1f6c2db8f7e4cc13f9ff3cd1fed95db61145ff7a565ba09b90c53e066e405ba8f2bdec93da43792efabeb2e45c9543c03dbfca393087827b7e6d0774106de12cd00fe3ffcde58b795a59720fa7cde0be663c6c95ee93c48f645a5986c83de344bb6aaecc0f528def04369d25f70e9a06eef9b59362e39d82b0ec21c7217754dc95807b7ecd069cb2c5b75b143f7664e13e8f1dc073f91dcc23a51cb52f1bee012cfa27d9e7e2aaebb3f982a53e16d036f073beac2b7e09e4729d3a0b1d0f53ee0f17ee44be9fd545e1d945c87d4791d71584459619727eb2baa7b07c7f3a90a17b1f652d63b6d0a39bf8e608e539ec9f957b1acb3eb8af14ffe5fb6f1499ea7bd9c725f5933694a3e8209ff748a0c3b74974c849510769a33b293ac8e73d13e8f05d121d764a5187cec27d2f4507f9bc77021dbe4fa243af147590e5411f4507f9bc6f021d7e48a2439f147510edf0ac5c4507f9bc5f021d7e4ca2436e8a3ac8722e4fd1413ecf4fa0c34f4974c84b510759a6f6577490cf0724d0e1e7243af44f5107b1bf67d6404507f97c50021d7e49a2c3c01475906d83c18a0ef2f990043afc9a4487c129ea20ebe243151de4f39d13e8f05b121d86a6a883a84f640d537490cf8727d0e1f7243a60fbd7ab3a7417eee57e9cd3c3eeb346c475f0dd7865dee2cdcab7720f4d5e0ff0cae5c5b24fe04ff0be1e9007c321fb447757de7fa3c856dfabe1e821de8f14cf8f549ec37d3155967fb1c42c4722ef551dba09f7a31196630187d101cba217946fc7845916c93ee13fc1fb7a401e0cc7df613d2bdf7fa3c856dfabe1106dc8ac710a4bf97c7c0296ffb0c42cc721ef551d645d7202c212ecd1e4bbf15896b456be2d609575c712b9e6ee4fe59d9405c3f0afc249beff067cab7baf8621513d2d51bb6e12e02bd67c644d0e73f0efbd3097ae56dcc93da5f604f7fcbd6c8b4c61f1b6087f7e3378ceaf727fab7d15b91315f9625e77e989613995fe2872e4f7ec2645ce7ecafb1b40d893b6856ac5fcf32c26b01256c856b3be7e67314ff1a91e1924bf4c7e5890df2fedf79a337e6a10f7760ddbe87d5aa23bb167b67f1ed01a8f469ef6c49e36fed902d2f7d1feef42cfc5525fe8515955bcb8b38a175cb9e5de4f09386ea8c27b3ede3fad881f38b4d47bd3874df2aefcab45ac1f9beffd84a5ccf1bc5dced67a77b3bcdfab7d798b3cb5abba4c16247e3491facd0c4f667072d20aef8904badabb5fee6b38d3ffbdced7b4c4d7bec07bb6c63fc769252bf31a44abd806dfb7aa612ff7fed6f9394b20d3eba83f40097b1e1cd324a3698c171aae7d5fdf16ff2f46b6468cf8c34747897458b3af3f6273749598f83f864126c3078a0a848c7e3eb258e8591eebebaf1798518560f430560da1debe03de0359ff8461d193e1d1ddce0f413c8677995138fdb49b4bdbd60a072d9ff5f5bbf2db27095a22b05c5e8e7ff2419420d4aa5533972baae28fe9f0fbcb756766107fe06ea9ef2e7a04d4f60bbf7004f84770ccf2fed8e0fd5fee391ee9090cd4aaf03f5c29545bceaac4512e1758c7c75cb5104da62a063a4b07daef3b9cb555ec1c3bb62f31eaba95a188a3eeebd78c5a273048cc2fbfca9425ea4d32c9bc31b9ffa09d73875c584b1f2ff5fd78a98e6f58ccd4d0c54cfd4c2781e4797ea278695019ae78bcf07f7a860d11db4ea60346b0a68e6083ad63db5cf7ead9361fd4edad30d4f36b94d00613698011aca523e88f68cfce20c1a99e867b8b9a62f518364e9961139f619b2aa14b45078c626d0dc55c4eb1a94ead7a8a5a5c2344701d4c703343c17531c1cd0d05d7d319d476994e92fcdd2a5f4aa1e736ba39f1bed79e6ab6a6b7a796489a4cae02664df57571c3116eafd54a8d9c9678e434c024b73295dc1093dcda54f2763a83f2f72aca7c3dbd7a6524cf6b5aa55c46b66589aad9514bc8463a7afeec9c3d49e955ed3e927f8df2be5de27158e7f709acf5bed775372526da2ee5dcbebd4f339be93ac1a26984116eacb37c8ebd0316edaaf1b7c58dbf894e38f7718754b2e9f6b8e0a698e08e86829b611941b626238845c9089a63923b994a6e8149ded134f36a8949ee6c2a797b4c721753c9ad30c95d4d25b7c624773395dc0693dcddd436da6292734c756ea7cb9afd049fc9aa37ec56a85ed5bb47653840d3dccf5faa56b253f14dcc2709fed5415ae37ce048578b4fc5032c276faf8b103f3f5b461a21b3bd67c150c758ffed52bf7f3c2e73957fbf12b44b127dc1a364b2772df634e4ba248ebc5ebac8f3735a3e158656b3dea944741f3fa2e995c18ca2832efd73a3e8ab2197cbc9e52ac152b3843e7896b083ce33de06e4ddd5557a1ab9fc2ad2ebe0d23b6259599e6956968d49ce3795dc0993dcdf54f28e98e401a6923b6392079a4aee82491e642ab9ab2eeff3eb458b49f33e59cb9ec9c6b089debb42cf7d893f66c59f4ff324167a7e7379237d1f64d20ede87bf4a9cd30dd6e5747efdac1b6369d5c33f18b05864007d32f00fcb3b87fa7967ba8387e594dd7426e4575317596542d5331f3e032eb526e7309f7a976a508f4abcbb2e3be0c487eb9455738361786e90a313ccdbb47cce9b699bb607267cd73408df09133e220dc27bea84f3deba91958ee3c2fff3fe5511de1017de0bd37c9446f3ac889af7c60a8ed19a822352fba80fc6648c86c9269dda0998f4c5848fd5083f31a2f05c4cf8388df00b220aefa7cb0cfd96f5c119c90c934df51aef858cfb06473daa56a4e55c9f19deb5d4d7823fe75a249f2296383b1dcf34a5b1df3f3016649c5b3f147c32657dbfbb4b9fd917f899bd5d3a63c5459ecee0797b81cfd8acd2bae02df885a2d799fbbfd27f35cdf381c76681685a45697fe46339dc444d0e178b98c3f5d72538bf5b68e5564d70bce5b9d6ef82e07faf13d13bcbf73b3e99c32429f1b9a31d34259b5fba698d76b26fb47929186d3ab4c7cc710096ff4ed1e4bfab63d1f2df815881375553e0456a290dd249e6952e3e5fd9a4d2355827981719d33579652ecf2bf90058961fa333fd18e56531d6e7a1cb76a2f79154094f011e9e2158786661e1991dcf6c23f83314f3670ee6cfdc6af9b333967dcec3b3cfd95eae52ec3de4eec778ff177b2fcbfcdc24781625fb1c86f9bfbbce7f6eeb09a69e45f07738e6ef1e3a7f9bf9e15ee8895ce80faaadf4c21fe4aafc299fd75dee5b62140d76c13498afd3a005d0a0a432cf9a22ecbffa5aec8a69b167220eb9deff22c19e4f0a5c63a0c1084c83059805480d16fa158932cf0e968ae23c8abf23b19c7a2f4d4e7d6c8d6839f5282c500b53c94f13683d1a13bc084bafbcdc5fe3d70b784e98ed4f96cef65722c85414c5ff3118b5420db50f22521b8b056eb12e70cd7d772bfdca43a1a847667b45c17a16ccc41feaddede719ca019102380e0b60912680fd6b460be0782c80c5589aaf1ac0c97effc91a83204ec08258a209e2911183588005b11433d0719e6996fb41caf62aedab44615d5ccdc0ed8605ae4c13b87722066e2216b825bac0f156c05cef55903b2d174b42aa17ac4958b0966a82d5a456b4604dc682b5b72e585cd0482f8e368a961d0fd02c2f06a3666553b0202dd304293b6290a662c2976b84e746143e4d279cc736df39dcb43f6eba4e38aff9ad6448cd8f9f9511bde637038bf4d5ba48e76d8185a2e15eee971b4b34b63dda7bc26be1cb2219c24c9d267ccec03eba10f32c439c321dfcd38c46f6c43d9b8505bb4217ec962c5edd8857bb0afc0a20aff854bfda331bd3638d4e0f58f14a5705740ea6c15a9d062db424cc2ba073312dd6e9b4680cb4e0bef1ca5ff5fd9e87f9bd5ee7b7aeeab9b4b2288ee2efee5812df8025f18dd54ae27b60e1db5717beb69a240e1b5b13427657bda43e1f4beafb61497dffea27f53d759ef132e00056b50cb8a36eb43260814e383711be8bbd515fcc5e98e4834c252fc4806cd201a9170dc8224cf8c11ae117348826bc50279c97b87c9f30d31277b146785f7f8a1caf5cd930452abdd3a3f81e6aa98dfaf25d4072627c9c8d4e57ac27b508cbbc0ed3a91f210f2ac6f2a0c353119c20bf29c152c0119a14b0b961b41450aa13cedd1fa9c939fbfad330abb71ce8289ee1d61419ae98881161a94c1996528fd6a4d41a1153ea12cc26f8716f550a34de66d2f510cbf657360ba655f2c626ff7b95f7bb5c29d6b3fdc9f36b586fef5aeafd2ef70bc132c65be2f16a1097d8cf9758eaa7f515fe775c7660fbfc7d9ef77ea877cdf7ae9d2219ec522cea8fd5447d2e8ffae3cce2706f0cf3f13acc8bd282b9fa30b3bdeada129101672bb5e3a0bb4b7656678bef57fb72cb442da72262742cc392f9099a647e64d368c97cb9ae2cf2e7f0667261d048cf55b93f8f27facce913532e5d4e62fa4541897dc7ca8b15ba68e1e44e4e255b3f098f9295ba28f167d0667245b33ac4152d524e493952b630fd6ae664fe63d1b24a47cf9f123c3d83f452d95b434feed494c99de6936b59255409b79f40a8add61933a7c6f711ada7562574a5e869b841efa313ce33b0333419d8b466d132b0724cf333359ad789a87905a6f9591acd5b378fa6f91aacd43b5b57ea319dea094a8db598eae76854ff20a2eaeb30e1e76a840f6b154df87a9d705ea33b8f99b7bd3660c2cf4f83f08d98f00bd2207c5f9d70eefe425d8ea10ade8c0bde4f27985bd645a9084e6082fb635672b1c64ab25b47b3920374c2b9fb4b185249bd941955520fc4305da64bae7cb0216a2595174636b6070ec2505f8ea1bec20cf5260cf5953ad48bd386da9d36c1c158d2ba4a93b4fab78b96b40ec1b2b1abd3908d1d8a09bf260dc2376379e4b58679e46198455e6798471e8ee1b85e83433b1b3e018e23302bb9419701b78f662547ea84f3f6cf8da92049d0fe390a137c93a1e0a331d637a7c1f48ed109e7f5d05b52d13a411df4589d601e89b76a22f18b8891781c26fc368df01b3a44137e3c26fc768df00d3b44137e0226fc0e8df0311da3093f11b3943bd360292761c2ef4a83f09331e177a741f8293ae1bc67e29e546c7c0b2e788b4e30cf35ef659a029f4f1e8e5ae0af11857759356a55d18ae653b1b0dca70b0b7f911df2358a5fa7617eddaff30b0ea917551947a9feb0f6e998160fe8b480530b5688ca4fa1cfbefa1a9c8169f0a04e83fa0c0eaccff52d634dc472fb4c2cfb794897b7758a96fd9c8525e287d39088cfc6347f44a3f92b11353f07d3fcd134687e2ea6f9631acd73778ca6f97998e68fa741f3f331fb7c42679f7cd9db7c91972df0f286f9221f1a2a1a1dc1b379feb537dbc5fb3d16e45945bea0e5de5f7ccad06aefd9123f7fd9e0776296f84f8b23e6691760fa3fa9d39fcff18f6b24d7df66578669a808cf02cdc04c9067ab0da815be8b8aca39c5abfca7c57eee1174c86ef4bf8c12a60b7561e206f254e50ba555cbcf1daf5d8705ffe2abc623346c2fc28cec198d91d58c68641763c29fd508af1551f82598f0e734c26b47147e29665ecfebccab4b4ac9236897f7f5aefdc5b320a9ecc70608b703234e89bd0c339817308379d1d8602ec7fc7c09f3f365633fafc0a2fa9534e48457ea84f32a243fb0d6a40a7915a6f56b1aadb5e30009b4be1a8b86d7b16878c3381aaec102f4661aa2e15a9d705e94bec5aa16a5670c8f56945ea713ce6752be9d4a1c27d816ef7a4ceb77345a2fdf359ad637e8847365de4d45eb04dd0e376282df33147c139696de374c4b37eb04f3be8c0f52119ca02fe3169d603ef6fba12e1df189a8fc3ccbe813516fd5f9c3d3dac73a7ff8b4cf4f58b5a77dde8659e5a71aab1c36229a55de8ea5a5cf0cd3d21d98d69f6bb46e322a9ad67762f1fc0516cf5f562b9eefc2e2f92b2c9ebfae7e3cdf8d11fb4643ec8388c4eed109e79370f90150469370efd549e69360be4dc582122cb5be0fe3f19d8647eb31d178dc8f09ff5e233c27a2f00730e13f68844f8a28fc418cf78f86bc1fc2b4fe49a3f586885a3f8c09ff5923fcc888c21fc184ffa2117e4d44e18f6229e757d394f318a6f66f1ab51f181f4dedc731e1bf6b847f1251f81398f03f34c2f79c104df89398f03f35c2374514fe1426fc2f8df047220a7f5a279c57d2f9298755da99bc1a1f5e9d224779f9b772095ab6f7d72ad1e932bc1a0b2d9fc102fc8f26c05f440cf0b398f07f75b9684134e1cf6134ffd3d1dc5e43132e0a573b7da2307c1e0b269f3655253f8f18cc17b060c66249168cad64a68bd55ec4fcced2f9dd94c17e6db95745a1df6b5651b9742e8aff2f61fed7d0f9df36e47f323df83b6e0ad1463c5ec672fb9a31c3dcfe154c722d53c9afea24f3f4503b665623780db3fb3a1abb2f9e1ccdee5fc778d435e5f106a6763d8dda75a74453fb4d9d70de6d523f66de6df21616930d0c63f26d0c49430d9227a64743f20e267c3b8df02e33a3097f57279c236c940a9204536edec3f29ec6a9084e9085bc8fe168a2c1f1cc9c68383ed009e72dd2a631a445da2c56ed16e98758489a6b42f27bc4907c8425a4169a8414752bcd8f75c2799cb54c56b0f19337e586afd52f583fc1fcdf5ee77f13162e58e54a64b85a398aef9f62beb7d2f9de86e98b559d16d52b543fc3eca8b5c68eded9239a1d7d8e05b68d2eb07c7640a20d5ad65463e38f2fb0e0b5d504ef9b88c1fb120b5e3b5df07859311f9c6c3934c1f6627ccc2a4a30bfc23469afd3849f62156fb9c04d7ea2f8f935e667079d9f8d80252ff31e6c3448c1df603eef902c05afab7c5c7ddfff87f9de51e77b7827876083acea955ddf62fe666389291ec7ead64ef19daba268f01da641278c7b5c83aa1bb8441db4ff1ef37d47ac3116f77db4ffbb88adf54b90e87eff80f9dd194b5fc1448c551ee7eaa6af1f313fbb60f11df7333df1fd13a641572c85c7358867e4321b8fe2f3cf98cfdd92fb5cd5d2a2f8fc0be673f7e4310d77aa8ae2e7af989f395868837e946062239ffe585d1bfb0df3b9075617537d368be7df31ff77d2f9cf5ff08945a5fe24a0a28894ffc0fcea89e5db4bd3928afec4fceda5f397d7a67b7b3f517cf80bf3a1379653e0211bed4f8f8d3a19f56f4c833e3a0d78936745352df61fcca7be58fa843e552f74ff627ee6eafce407b8961aa58aff74fef1ea633fc3ae0616d308f60f3032edd7896192f34d2567e924f3e6657fc34e861a3ac13c5606187632d4c4040f34145c0b133cc850706d4cf06043c17530b318626a167531c9434d25d7d349e685eece69e845ac8f091f9606e10d74c2794578782ad19860c248430cf62ea6b0b7c352f7ae86a9bb11a6f20853951b635138320d51d804133e2a0dc29b624c469b3269a693cc2b1a635289c60407fa35d709e62dcbb1a9084ed07fda02133cce50704b4cf07843c1db63b137c134f65a61920b4c25b7c624ef662ab90d2679a2a9e4b658129c948624d80e537bb2a9daedb12438c5300976d009e6bda25353119c6096f30e18e8696900dd11c331dd10473696be6718a6ef4e18e799869c77c438cf4a03e7ce188ed98638ba6082e7180aee8a719e6bc8b91bc6795e1a3877c770ec6e88230713bc87a1e01e18e7f9869c77c238ef9906ce3d311c0b0c71f4c272febd4c73fede188f8569e0d107e3b1c890475f4c70a1a1e05c0cc7e234e0e887092f4a83f03cac195e6cd80ccfc76cafc4d4f6fa633c4ad3c063006622658626321013bcc450f0200cc7d234e0188c09df3b0dc28760b6b7ccd0f686625a2f4f83d63b63c257a441f8304cf8ca34081f8e095f9506e1bb6884f7f54fafe7dbed667e97f1749c9d9778ebccd5a958e94c9cd8ae98f9ef6368fe23b0782e4f433c8fc47acf2a0c7bcf46e90c289b1b50e95631203ac359a323155348f97baeae8df101597e3e368596d8eeaca37551cc63625d2a51cc7546048fc1ea04eb4deb046331c91b4c258fc3246f34953c1e93bcafa9e4095806b05f1a3280024cedfd4dd5de0d53fb8034a83d1153fb4053b52761dd3e071976fb4cc65ab39b0c5bb35330d007a701f4540cc7218638a66135e8430d6bd0d331ce9b0d39cfc0381f9606ce33311c871be29885093ec250f06c8cf391869ce7609c8f4a03e7b9188ea30d71ccc3041f632878778cf3b1869cf7c0381f9706cef3311cc71be2d813d3fa843468bd00137e621a84ef85b5104e326c212cd409e68db5930ddb348b308d4f31d4b81013bcc550f062ac5e70aa69bda008937c9aa9e462cce84e4f83d195606a9f61aa762926f94c53c96598e4b34c252fc1ecee6c43bb5b8a093ec750f0de188b734d592cc3cceebc3498dd724cf8f96910be026372812993953ac97cfed385a9446382f94fabb06af44586d5e8d55807cec5861d38fb60902f31855c8e49bed4547205960a2f334c856b3073be3c0de6bc162bbeaf302cbed76138ae34c4b11eabdc5d6558b9db80697cb5a1c61b31c1d7180ade174371ad218afd308daf33d4787fcc96af4f832d1f8009bf210dc20fc4328e1b4d338e83b07cff26c37c7f1396efdf6c98ef1f8ce5fbb718e6fb8760906f35857c2826f93653c99bb1b472bb615a390c33e73bd260ce8763f9fe9d86f9fe11188ebb0c711c896576771b667647611adf63a8f1d198e07b0d051f83a1b8cf10c5b198c6f71b6a7c1c66cb0fa4c1968fc7843f9806e1276019c743a619c78958beffb061be7f1296ef3f6298ef9f8ce5fb8f1ae6fba760901f3385bc0593fcb8a9e453b1b4f284615a390d33e727d360cea763f9fe5386f9fe19188ea70d719c896576cf18667667611a3f6ba8f1d998e0e70c059f83a178de10c5b998c62f186a7c1e96fc5e344d7ee763925f32957c0196fe5e4e43fabb1023fd8a21e98b30c1af1a0abe18c3f15a1a705c82097f3d0dc22fc54ce40d5313b90c2bbadf342cba2fc78aeeb70c8bee2bb0a2fb6dc3a2fb4acceede31b4bbabb0ccee5dc3ccee6acc2cde33358b6b3095df3754f95a2c997c908664721d26fcc33408bf1e83fd9129ec1b30b53f4e83da37ea84f371ef4f5289c904e3de37e904f30ce1d35404273852e1660cc76769c0710b168b9f9bc6e2ad98da5fa441eddb30b5bf3455fb764cedafd2a0f61d988d7c6d682377623cbe31e57117c6e37f69e0713726fcdb3408bf0763f29d29937b31b5bf4f83daf761c27f4883f0fb31e13fa641f80398f09fd220fc414cf8cf6910fe10662abf989acac398e45f4d253f8255287f33ac503e8a55287f37ac503ea6139cedddfe918ae00453c61fc704ff6928f809acdaf79761b5ef49ac6efdb761ddfa29ccdefe31b5b7a77592f9014cffa6a2728203989ec1eced3f437b7b16cb32f8d6c0a659c67398f0581a843f8fc5625696612cbe80b56f6b6499b56f5fc4d260cd54042748832f61826b190a7e19835cdb14f22b98e43aa6925fc51261dd5460244884af6189b05e2a821324c2d7b174523f0de9e40d4c788334087f138bc586a6b1f8169608b7334c846f6369a591615a790713dcd850f0bb18e426a690dfc324373595fc3e26b999a9e40f307b6e9e067bfe1053bb85a9da1f616ab74c83da1feb84f34d27b74fc5f4126c3af909c6a395298f4f31c9ad4d257f86496e632af9734c725b53c95f6092db994afe12338df686a6f115a672075395bfc62afe3ba4a272a2bde731c11d0d05ff0f63916dcae25b4c722753c9df6119d28e69c890bec784774e83f01fb068ec62188d3f62b0bb9ac2fe09abcd7433accdfc8ca9dcdd54e55f30c939a6927fd549e6e71ff748054682f38f7fc3f2ba9d0cf3badf31163d4d59fc8149ee652af94f2c09f64e4312fc0b53bb8fa9da7f6392fb9a4afe07939c6b2af95f4c723f53c9ff6192f34c25f3fe1dade47c53c9314c727f53c95998e401a6926be824fbdb7e1b16293531950799aa5c0b933cd854726d9d649e8d0e31cc46eb602a0f3555b9ae4eb2bfef771a32bb7a98dac34cd5ae8f491e6e2ab90126791753c90d31c9bb9a4ade0e933cc25472234cf24853c98d31c9a34c2537c1b2a4d1865952534ce531a62a37c3248f3595dc1c4bdfe3d290be5b606a8f3755bb25a6f68434a8bd3da67681a9daad7492796b6537c3d64a6b4ce589a62ab7c1484f4a03e9b6588138d9b0406c87693d250d5ab7d709e7cdaca986cdac0e98d6d3d2a0f50e98894c3735918e582cce308cc56c4ce599a62a77c224cf3295bc2356bacc362c5d3a6382e7180aee82b1986bcaa22ba6f23c4395bb6182773714dc1d63b187298b1c4ce5f9862af7c054ded354e59d30951718aadc1353792f53957b612a2f3454b937a6f2225395fb602a171aaadc175379b1a9cab998ca45862af7c3542e3655390f53b9c450e57c4ce5525395fb632a9719aa3c00537989a9ca033195971aaa3c0853796f539507632a2f33547908a6f272539587622aaf305479674ce595a62a0fc3545e65a8f2704ce5d5a62aef8249dec754f2ae188c72431823b0e6658561f37224a6f11a438d47612d9eb56968f18cc662709d690c8ec178ac37e431168bc10d8631380ed378a3a1c6e3b118dc370d3138018bc1fd4c63b000e3b1bf218fddb0183cc0300627ea0473f707a62238c1f29d49580c1e9486189c8cc5e026d3189c82a97d701ad49e8a99c721599ac38d8ff56f67b0d16c362bf6b7f00fb6fb5fe1ff5de01f04c0b7fb2ff53e09b6fb2fa8743996ad6325be8b19acc47fbbd47f52cefab085decf4cff6db12771adbf513f971bff660ce307ba17b28ddeb5988df3be0ace94a810dfc637f70f8e1758ea6fb91f7e13e897ef8570618250f0cdfad77a7f5700df67f9c71b489961a973fc239e8b23a59d6918f54375d477a9a43ed3e330918d62fc48eb1236c5fbbf86adf78f135826b40b5896f96f16b249debb225fd0b44a7ae5be0b9dbce0197439d23fc8214ac8a66321dbac0bd9502464b3d91aff0089a5fe353836826b5de0fd157cce89ab31010f6050dff1832656317ed44261c4e3b86760213a4c17a2fe488830b6e1f85aeab99dcce20796a72f1433b1501cae0bc5cec6a128408f984f5f986661613a4217a6218ca1f944dcbaa6307e20c7724fdf722ffdf3834cf8011e89f39874856736169e2375e119133957e0e10bc783fe8812dd793de90be51c2c9447e94239d0c8128b7d5b5c2d5c4d11e14a149b514232170bc9d1ba904c222c3bf9d37d7c6f7898822377968a7c725fefca73512e271d65d73c2cd4c760569a38d5adf2e267a11742ae7fa1c8f393a538fab4b83b16ca6375a12c21ae17adf12c9d1f995426ea3ddceb208617fba14b9d56a2345d1d6bd803e3749c8ed3ecad567f8c92835787c37c8cc3f1588d2e71aa18e7e7df2bfcb49b9ed8ad6e2eb72716b2137421ebaa846ca4e767b99ffbaa35d3125f93356c49154de3f5f4287a2ec0f43c51a7e74845cfb89f30579ae4db608557ff5fe2e720b8a6f8f374e5487b61e13b4917be3c257cd032d438192fe224d53040595142b0100bc1c9ba10ec9a520c8df4d269b16827e84ab8e831543deb5b8485ed14ac56a3f7538d9b223f27ab5a6b4e45ffb8ac282129c442b2451792c111ec2c7a58f4d2a2846631169a5375a199c0b0e3fde4b186abfcbb95d50e5d74e951425b8485f6345d68874788bb9949f308ca5a463116aed353b14958f299dba45e5a94d09460a1392395ba42b804817921b72d5e2fdce8b701cb12d4fbc332d257469562213b5317b28929e5f0e3fdc3320b45cd5096c441fb5cb619b666b95c8685f92c5d98f10344619a09d79556a6b9ddba04d3f86c9dc6c322e48961bdcb907e84d47b1da2846a2916aa7374a11a9d811a783c774857cced8d85f15c5d1807a031c77bd3177b8e645827f96dcbb1bebebadc30ddf9f9322c1ce7a5d28710259fd89a39c3722c94e7eb42999b729d306a7dbd7a35da1598f617e8b49f19215fc37b7c924b48cd4dba627025c6e0c254da5c89ea1d51e3b0ba39c62a2c0417e942302aa59436d373bcd8d7a7d0e7bd755b5eabb1105e9c4a9d37511c45abf3a6bb47691f2c5c97602336a9e51ed14285c75675c2548e85e9d2eaf7d124eb39ce648e5f8185efb254cab52839255e3ad38f88aec14279792ab57c9abe4eea5ed0b55898afc02c375a6958e0d7a4790c17f95fa55a1aa62b4ed761e1bb5217be795b394ea9637b3d46e32a1d8d714969c838e6f167d738d7062ca457eb423a36a51c79b23f86ceeb05d2a2f19e884cd5123662e1bc2695d6a15a868ef6435a35f6608b2f95e7e92d5df7c5c2786d2aa56bd530c6db53ea6c0e55db59dedfabfde7a985ae7afd66fb61e1bb0eebb74814bea01e14ff20f55235bdb1b63f16aaeb75a19a9f66cbc4d25f54f7e9657200c6e4061d931d93d6a382d656dc4af5d61b45c303310d6f4cdfacb0406bf896c7ee5aa61bcfae5eae7810168a9b74a15890a650047336a3480af7a455efcb285c36615c6ec6caffeae9947a5f00d57ccd83b190dea20b69df6a5940e2599bd5afbb1c82e97eab4ef73d2a754fffdc1369e3d59fa3939e11f6433122b7a5d25f35da0f6b102e9973cef29ea5363e9b9e1c69331682db53a9a7e9eba3a9d4bb33d94b701816c63baa375291da4c88eab52caadb823a1c0be39d58df7794910aeaf1892330edefd269df8d251fa1e5e98882f39198a677eb34ed9224bd986b59c7fb89c51a787f8ef565f3d1e8697e0cf0bb0ad6b793f7ca8fef202fee5399c7f609e5c7f1e7dcff155efc72a2b32a73d35e2c3b89847bb2823de6fd7fdd631cde1a51d18b952a1c822f97fb92e33dda7cd5c1783fdf0fe6d31679f793fc19c56bd8223ee7cffb49160a5db9d207942c3074c9c3b4c0fbe1aef8ea9422bf8785e7678b3d0ba82342246579a479b5789b0be9bd3c56db8858cdeadb9987b16735ad29b916f771df6ae86da85515b23075e8740f04c859e8b1a6decd42806d250b16eaacf2451688ec30a9af30efd3f9dadb1720db3849c5cd0699824e5c1bdfd482c2a69c05d3232fa8cb589d5a59b93c36eea744d6d847c66306d6357713f90b5f19e6022eaf50abc4f50025aef63eae852c5754c3c39636dbf3a55874f04cf08baa623f5be00db43c27405ed3330ef241faa41a5f4d37972df1136789ef3c10eb86ed1d39298eec213b6daf9f1320bb748e837c983ecf9320792d99ab50566977e54ee05ade2a8eeb114a5cdb698b083e91bfd491d27411281e1ea544d5326459811223bd0f8a8422e184e902ba6923e2e81ea344b7bd8f6e866f5581e74b3485c268ef09e7b1cc0978bf8f8fc37b9c125e73ef46ce1155abbbf1558bae94a85deac5b13d4189adb66f73c1305cb92379d9a6e171384fd29792f11ada04bf671ae6662ee09a36238eeb293b6b67f94e805cd23d0ef2694a900d4320799f57a9efb828959059006a13c8f49fa12f312528583773b731b5a8200eef594a78cd58d59ada6c56e1e39be98f09bb6371d78022e1394a686d357534bc7aeb565dedef097188cf5397abb2aee66e1ded03d041f942e6ca556e7bb0a11e1f04d795ad2e802c9e1307f92225c8063ec8b1fed8c45adf7b973ac4f9f896c4f4127dc1c07b3bc6f85e631bbfb800ed83dde3d05ea6ef22c212a90ba85e681047f50a25aa7a3e2a35df7201d10720a77a957e6c003699e27316b82877907d3f3f8eec354a648d4209d0cda6fa33fe404a9d5a8a70752d40f5c7dba311c66706f01adc58b681adf69f068d2b65a64017cf89759abf0e47fa7312540872521c49cf49a1329b13a173322749419293c2d04d8ed13899c9d7f9465fe7795fabfd913929375373220e3de4a430f09f9364e4272761574d4ee41efd9c6ab72f7322f785e4a438009d933467cd49a1a354b58b68ad981ca4ce9093725d3527c522353ed54c3f452c974f357be3fff35960b97c16d89b1cc254412128dfdfa22edf0bd19450a57c6f5fc5bf196295c3525f9e2cc7753ed70b95f47d52094c754a7b7ee899ac1abd4d896e0791f482f9922bd97296fa9e510bd9403ab49ba9d05e118ba37d87126d6b0d5a7cdaee4236b8ea5847fa70b6a4c2c98f409538dfb509e7102771760238dfb309673f2771e683c4febe4d38f39cc4590a707e6013ce7c27719e02707e6813cefe4ee2bc07e0fcc8269c039cc4f93ec0f9b14d38073a89f34780f3139b700e7212270315a54fe91b97bc95be8aadd77484b8878e4b91e83ecb842596a1b608d5e7f9246183b22115cecf00cecf6dc2d9df499c4f019c5fd884b39f933897019c5fda8433df499cf7019c5fd98433cf499cc7039c5f67623a2806339cd007d0a16c4b857218a85f7e630bca7c2751de0d50fecf1694794ea25c03507e6b0bcafe4ea26c075a3cdf51cf858cb778467a9f6d14a33eeeb5755a8302e6fb4c2c6e1ce4fd2fa9dcbe892b5cecfdbdc17fb7da9fb9c03f70cfface01207fc8c49466bce2839d7950652177fab036a1c2ba1460fd3153cbbab91596f103b23263935ba8e05d09e0fd4409af0980b7749b49d247037c3f6fcdb2198a234dc675a850d604d59c5f323195b59f48c6e599b2c293a8d01d05acf0574a742d04ba2231cd4add66578694d4024fa3c2580e30fe96a9c9d4db8605ae00e87ea744d72a890586f341d2ee5bb29cf07f00e61f36c11ce420cc6f01cc3f6d82d9df41985f03987fd90493b033820ce63700e6df36c1acb2939c0330bf0430ffb10926e1c40032985f0198ffda0433d741989f0298ffd904d3c546e2e70026ab6111ccc10ec2fc0ec08cd90473888330bf0730b32861ca157bf9deff25a1553a196a446ea642f82e4058831261b2ceb4f0def484850e59b7eeafa033ad26254ad923d42f3466235f67c822c912f57ec0226b51624c3e6203056668c4a62715d6f9006bed4c24f4d40a1e176b977900651d4a947c443b5cdc702b2ca36c2c928d18d605d0ea6e0d682e0eb3d601d0ea65222f8c9a1392ceee21cb0baf0225757d1bb1924ee523c33a0b606d408935fa1265c22109b239404dc1c4a98636e11ce224ce1e00e77636e1249da04f86731c48ec8d6cc2493aa39c0ce70a80b3b14d3849d73b90e13c1fe06c62134ed2d171329c4f019c4d6dc249baf48e0ce7a70067339b700e7412e7ef0067739b700e7212674d50516ab135bb84c38b9b083b3dc8a6aa0e0696d9d21694f94ea2bc01a0dcde1694794ea2dc13a06c650b4ad229306428df00285b6762cc277f9b1cf3798fc531b6d9ba633ed82a1dc2a98364ddc71702ac6db766420f8ff9b838d5a01024f4769428f99af5f0f0c568b64ad020c3d6880a5b4d6081ed29b1b5f12d902ffd0cf6eb85bb05178871480e95efb53a95ad67c136b5ee55ce3b01a01d32317f28d58d1c081335d9360e9300cc1d6c824938b38d0ce66e0066479b60120ea591c11c036066db0493b01a4406732480d9c92698846b7bc8604e003077b409a68bfb088d03303bdb049370b20c19ccbe0066179b6012ce712383d907c0ec6a134cc2b53d6430070098dd6c8249d8e54606131e1ad89d12665b0173b9e788630c1458ebfdad4e69cd506227ebc56c03467c72b6e6a21475008d1026590bbd37b0cf1e36c1242cd3e9f646073077cac40a1fbe3dc40ae179a17fc299eb7deba300c29e99181dcff50ba044c7c72d14b9a98bbb502f00387bd1f768c68b9fa52cbe81133e4aee5ee1733fe859ef6d1b50174bf3dd00d03e9440f9928ef05005e19965648364b54082ee4b5d5e978ab19ce20483121918ef21b3bd1e00662e254c79005c70f6a2bc8e13893a7c925e01835bdf11173c64680f0168fb65623017ab578607735ddc05665780328f126570d6ea6a301639ca6351eafd908e3e0ea502d71580cbcfec287845655dd2bd3a634380ad7f267245d8fb93fab198845d6b9ba9d0ae06959d019468eb7b37bc104972627dfa90b5a742d61458e3c04c3408531fa875b173f71d8073904d3849f7c122c3f938c039d8269ca4278992e15c08700eb10927e9d19764386f033887da8493f46056329c47009c3bdb5b31229c8e4556317a06548c8651a2953bf4e72b8033d0674eb62bf5cdc02e8753c26b97b25d86f7c7229c39b4364655510216b98b8d5009671091417d1b40ddd546a884fd4364505f025047d8089570162619d41701d491364225ac4091417d1c401d652354c2194664501f035047db08957098970cea6800758c8d5009877ac9a08e0250c7520ff5c67b3f27790ecb1cecf9e463c812d7384a5c9d5878aa4178286306db562712fe09ec71bced805d9c2c5317ccd49c90894160acf7293c08ece2893fbb025b2dd89af334c32849778323833907e4acbbd904d3c5e393e60298136d82e9e2f149b300cc4936c17471e2cc6c0073b24d305d3c3e69328039c526982e1e9f3403c09c6a134c1737b82f0030a7d904d3c5e393260298d36d82e9e2f149f300cc1936c174714fa33d00cc9994305b0a980319dcbc2c3c2ddbe513c9cf0320676562ac9dcf76975233048f6cac7d1580373b135638601bb5c2b300c8399420e5267ab2f38df7a5af07cb56b6ad3ecdbb403fd15c4aac7c096a2aeb83c8100ea342d81d58e63c4a84d9ac6aafe51c8fc7684fd018af2636ca7358e1390c9ec13de2467a1a2ca5b55032bcbf010bdd9d7e394bb084aad4872b652ff5d42103578b0a1c0376b907253875e9e95adf0acb13d6295d6c38fe002c713e2550756f8ea0080af66b0d430d9f564586f4242aa413c188cf9e999e221be493b33d75782b485e4779cef980db3acf2d2faeca69d1920d07ef06d02ea044db8de916ab8ef620f2c907cb3cb58afc323ed85f2d7c745dfc8dcb8b57df0439ed5e94a81b252ca208d7a7d7a7429705d02dcc4497476a43be039c2ca0c68124bfc826982ef66c16009885996870a602335cde13164b64c7281e032a518b6dc44a3adc46867520c05a9489a93358d7b1fb9b43f6044552b1bdcbb608d16e262bed81959650a28d7e86aa8bfbc735004554a94d38873889730780b3cc269ca443c36438db81c4bec4269c794ee22c023897da8433df499c87029c7bdb84b3bf93386f033897d98493b4f14986f35d8073b94d38073a89f37f00e70a9b700e7212e7bf00e7ca4ce04c7d8f25174f70799fc571aeb209677f27713e0170aeb60927e91203329c8b00ce7d6cc299ef24ce3b00ce729b70e63989f35880b32213fd9e18cc7042275c9845368a390194ea6b6c4199ef24cafb00cab5b6a0cc7312e56900e53a5b50f67712e528d0bfb99e7aae273f11831f58bb7e6bccf5246bf93403c5cd864c8c5e463fca9b707d1bd929050701ac1b3381159ee232cd73ce0516b06ded3497bd00d67db766de09c5915a28d96c90daa018da2f13536bfa3175df8f6d672dc749c02ef7cfd48aa20cefde493665f60600ef804c342039bc42740e67866c916c9aeced00e7819948d8d8c499701e39d0c945ffff009807d904d3c522e75f0073934d305d9c1afb178079b04d305d9c1afb378079482616c204e537df98afc8af9ccff5aa464b7da1fcb340bcdb55f59701d243b76ec3120acc50c3926c5aec5d00eb664aac7cf1608527807771f073daca7d51bb791f7011ee25f11d00b8c328c13501493ce825e2823254ab244bce8f027c87dbbbae8db0f021abb08f05bd98476ccd99eee192dcc5eafa3060a54766a25204bbddc6566e52319ac5f756707711e04e00e6519430d5e5d6452cf9d61484d64906f438d0e576b46d40092b4364406f06408fb10da88b9ba72c03408fb50da88b1b40ef0f801e671b50c2e93164402781cad2f1944075e712a4325a495830918d567605567a828d505d1c02ee01a09e682354c2028a0c6a0700f5241ba112165264503b01a827db0895708b7d32a8b301d4536c844a38e18b0ceaee00ea161ba11256a9c8a04e06504fb5112ae1d6fb6450a703a8a7d90895703b6932a83702a8a7dbb4ea6d30e586d2647dfadb83b6d41936e11ce224cebe00e79936e124ddee9c0ce74490d8cfb209679e93380f0438cfb60967be9338af0738cfb109677f2771be02709e6b13ce014ee2fc02e03ccf269c039dc4f937c079be4d38073989b31ea8285d908951fad45671e43979c4ce93c0362fb409a68b47ec7c0d605e64134c170f19bd10c0bcd826982e1e327a118079894d305d3c64f46c00f3529b60ba78c8e8b900e66536c1747102e31900e6e536c17471bdd15900e61536c17471bdd1b100e69536c17471bdd1a900e65599581c1375690c6925896c71cc1300ebd5366225dd47890ceb3c80f51a4aac1d3558f5fbc78f179fc0d14dd2696233a9e01e0ee05e6b335cc2ea1419dcb500ee7536c3252cc4c8e02e0470afb7192e61758b0cee2e00ee0d36c3256cff93c13d1dc0bd9112aed9812884bd019ba9d09e0cd0de448996af4f8e1f0b3dc6bb2ef65894f96beacbe8c091ad02e527e1497037db34c634983289938d313502634cb7d88473889338bb009cb7da8493740b6a329c63402e799b4d3849fbf3c97096019cb7db849374476f329c5b00ce3b6cc249ba7d3f19ce8700ce3b6dc2497ab80419ce0f01cebb6cc239d0499c3f039c77db847390933863a0a2740f25cece1a9ca9362d619734e1349d3e54901f01367baf0b900927969141be1c40becf05c8847da86490db03c8f7bb0099b02f950c723300f9011720138e6391419e04203fe80264c2f12c32c81d01e4875c804cd8854d06791580fcb00b9009ebc96490a702c88fb8009970e20619e49300e4475d804c38cd9d0cf22600f9314ac8d10e6c737173af9d01cac76d4149da874b86f27680f2095b50928e2e90a12c06289fb4052569573819caef01caa732314133fa69632eee3575398b637d3a13e5bcdc65923be69faf667cbe4aeadb74133670c926685c066cf7191720133670c9209f08203feb026417379c3f08407ece05c8849d8e64905702c8cfdb526b20dd0988acd63003a07cc11694a4dbd690a17c16a07cd11694a47b0590a1bc04a07cc91694a4bbff90a19c0206cd5fce04ca22a63f012563eb06b650a13c85c551be4289b29940c9ad2e7cac6b868e3ada4c85703340f8ead64cd8501ca93592ad73ad01f2c8d728517665e19ae66aef376fcf07f618d43467b2316ca257bf2cf444958867d380bb91de574b69abf4c3a8407f0c40bfee0a68428b2603fd1fc81cde70053461770b19e8daa04ef0a62ba009bb5cc8407f09b28eb75c014dd8f94d06ba23b0e8b72941b74852af9021252dea4ea3c2f82ab0d7773251c3edb7cdd570f70585d8bb99b044acbd15b744c2ba009925ae0618dfdb9a0d858ced2540d66c6d0ff2c6f7b7eec0201498a199af643bb7cc0416fa0125d696026b7fef7f7c5576819f6796b00d99ca31c97aa84e06203fdc9a3d54e13e011777b21c0d507e4489526e24965ba5fcde76ec720380f93125ccbade0d77cc67f48d11b3f7c87091adceaa0f707d42894b6efc21db3a25dab3a1b15e7c178f8e6d0caae59f66a2048f5a7e934e3e232bc1cf01583fb3112be94c53ba8a11c0fa392556b9ea15af6fce0e25fd0194d5f7865438df00f9ea1736e1ecef24ce4700ce2f6dc2d9cf499c5301ceaf6cc299ef24ce6b01ceaf6dc249ba173019cefd01ce6f328113835975e32fc2e6255915bf19e849fa9f4d38873889b327c0f9ad4d3849b75226c3391ed43bbfb30927e986df6438f70138bfb70967be93382f05387fb009677f27713e0f70fe6813ce014ee2fc0ce0fcc9269c039dc4f907c0f9b34d38073989b316a828fd4289936fd81d781a7cc6077dc779d772ffc96ede875c54012bf5dabdebfd7efa72364d7c117441bb07978f8a49b8bf52c2edceaa0ebf85d729f1fefb15de0fff9b6f6cb0d61739b6b27f7f964f2d0393762753c1ee0f60ff66cbc206d29e27b2419141208ffddd1694a4bd4e6428af0328ffb00525698f1319ca3d00ca3f6d4149da534f86f27580f2afad3b6f09dbd080700b2eb20d0d2e0345d0dff62cc171f17ce845c042ffa144d998c5a7db94f8d5f915999a5e43362d7125b0c37f29e1f1d1053e23099e6152263e77afbade1660fb2f1353bc529b2d97efe431da2f0298aca645305d9c7cf8128019b309a68bc7683f076066d904d3c563b45f00306bd804d3c563b42f05306bda04d3c563b49f06306bd904d3c515f1e70398b56d82e9e231da170098756c82e96243f16300b3ae4d300977b42183f90980598f126617165e68a02e54ddb637596b0506ddea5362ce4e88795b5dd3d11ce06d4089b7918f77bd7050cc26f81b00c4c72fddeb02e90232808694e8f8126b9ea4e12e097210b8c453083e27c348b667c2bd00e376941865ffba4ce0bccfb2acf2f5b6b62fd395a053b81175c22ef45e2df79cacd74c53702f61b70416d998125d27567568822bb1c62faf577a08f9d483d52cd18c7842db249b0f5f03006e420938da526b173be87601289b52a28cbe2c8bb0524f6699cf039ccd6cc249baad2f19ceb50067739b70923639c9703e0470b6b00927e9f6be6438cf06385b52e2945b054098a99e9d44bae3dc662ab42341ed73fb4c54ea5399dd115ed34e68b1646bdad703acad28b1cacd7ef2d9b6b9d9cf8920e9b7b629271d4099dcc972d2b701ce3636e1ecef24cec700ceb636e1ece724ce3d01ce7636e1241d7927c3793dc0d9de269c794ee23c18e0ec4089b31d5337ace2d5a140c8b6d6fbb904549476c8444549425d9a607c8870c898aca2d4128c0f75b405a48bcb0846008bccb605a48b23964d00c84eb680249cf44506f2000072475b401296e064209703909d6d01493841960ce4c50064175b40ba7808eff10064575b40122e262003f91100d9cd1690844b5cc8403e004076a704c9172cae674bfcbef512df09173553cc812bf2d521c3d7870a1f5751e2cba1c4176db5a48bab3086004bec9189f676d4a109170726fa00a83bd90895b0ed4d06b52780dad346a884ad1e32a8d9006a2f1ba112b680c8a0b604507bdb0895b0c7880c6a0b00b58f8d505d3c2ea73980dad746a884ad2432a839006aae8d50095b4c6450bb03a8fd6c844a58f92783da0540cdb311aa8b276d740650f329a1ca6585b9fe6f790d56128df43e2c120af1a7c13c7a3298648b0f5e617198fd33d1d2c747d75d1f29ba06a01c408952ee8bd44f49f2199821771215bc1b01bc8194f0f819ace1b596b33dc9c5de132e70120ba61f2e77d0feb603080751226ccbc29dc77ceef07a51ac84937486da4464567907286a06535b2507baca73c457b7c1359693fd02670d7373d96a36b0ca219408db24a902553dee2197b2ef930ce804304566a86d4009fb3dc9808e064077b60d2861ae4906341f001d661b50c29a2519d07e00e870db8012f6ca93011d0480ee621b50c21e7932a00300d05d6d034ad873440674670074846d40097b8dc8800e014047da06d4c5e34976014047d90694b0079e0ce87000747426bae2b893e4db54b8b859da781647398612259ffe55ca82bdba8a432df5d14ceee0e55e4f520ec03796125f030637f371bba3a33980362e13c312a9cd99ebefe4d69123415e38de26982ee6866300cc0936c17471f3fc610066814d305ddc3c7f570073379b60bab837d7600073a24d305d9cb63d14c09c64134c1737cfef0f604eb609a68b9be70f0430a7d804d3c585fbb900e6549b60bab8797e1e80398d12667577e1223d5c916cbedb916012c2741bb1929ea44a867500c03a83126b47a69b46086778ccadb28090efb3edf2b4c2812c0e7726255cb3bd0e09db4c9ba9d03e0aec765626ec564ef35a0d2c36debbb96dcde1fc00c09d4d0937ea11f6839d1c166e086a04736cc239c4499cd900e75c9b70926ed44786b31748ecf36cc249bab31c19ce128073779b7092ee7b4886f30480730f9b7092f64191e1bc13e09c6f134ed22d78c970be0770ee6913ce814ee2fc16e05c6013ce414ee2fc0fe0dc2b133853df6f9bb0c949b667ec172c8e73a14d3849473dc9703e03702eb209673f2771ee037016da8493f4407b329cf7039c8b6dc299e724ce1300ce224a9cc9b6520b27741737f51b0e4af5625b50e63b89f25e80b2c41694794ea23c0ca02cb50525e9dc3a32941d40ff6619254ab98302f7b8d4072965af144edc1b7d8f81826609253c394c8c97db53bd8ff6f6fe2af2ee33b48357132aaca500eb524aac4d05d63c65a82d43675f911db8fc1600b8772600f6dbc600be0a002ea3042837854ead06e95ef1521f94d4cb6d01e9e228793d0072852d205d3c1363070072a52d205d3c13a32d00b9ca16902e9e89d10d805c6d0b4817cfc4d81180dcc716902e9e89d11b802cb705a48badeb9d00c80a5b4012aea72403d90f805c630b48174ffbcb0520d76ecdae33288eb40244d6fb530ba05c9789519bf06cf64099b1fec401ee2c98194c3e7f9d6ce3c7e52c8e733d254eb92ea888a5b217c70027974cff06606eb009a68b4ba67f073037da04d3c525d3bf0098fbda04d3c525d3bf0298fbd904d3c5f2fc2700737f9b60bab864fa6700f3009b60bab864fa0700f3409b60bab864fa4700f3209b60bab869d41f00e6269b60bab869d49f00e6c19430f9d6f71c235c10cd8f6128f5c4c067ee0ddc3e08101e428930f98c0c28d0f5d3ff6e05580fcd44af516ac9dcc5e26767807233254abed1a37e9f4cf792753700edb04c1433a9f55af673b2cc3e0af45b1e6e134c17cbeca301cc236c82e962afe56600f3489b60bad86b79048079944d305decb5dc08601e6d134c177b2df703308fb109a68bbd96eb00cc636d82e962afe50600f3389b60bad86bb914c03cde26982e361b2b00cc1332d1b111bd5bc3c523b8af01584fb4112b69459e0ceb5c80f5244aac667b1112d6443753a13d18a03d99126df4edf25c3cf4ab3158ff788a4d38873889b33bc0b9c5269ca42d25329c6341623fd5269c794ee2dc1be03ccd269cf94ee23c0fe03cdd269ca4e75f90e17c18e03cc3269ca473e3c8707e02709e6913ce814ee2fc05e03ccb269c839cc499052a4a6753e20c46d4f9697f45feb97fa3fddf451e0f3ecf830b2df6542bf27e440dce39941ca144790e3dca5417ebbbb8387a2848e4e7da8232df4994b70294e7d98232cf49940b00caf36d41497a921519caef00ca0b28513663f1356b4bfc92bad82fb333b6370c5907dc6250dc5c98892ee3e89b3e114e5720dbf4e96a80f5225b1239e9042fb2443e0524f28b6d4199ef24ca0701ca4b6c4199e724ca0b00ca4b6d41497a543719caf1a0f17819254ab91b024755c2d6b160e0acc02fcd4bd8864c95e56420378242e7f24c80ecb78d825c0f405e4109b24592c42d434abacbdb6954189f0679e49599b0c721dba83d1e0aecf1aa4c1436a92d58717152f60880f26a4a94dc6b6e87a5be13de1fe95e5f641b00eb9a4cf492a77e0a0a617e48b693ff6b00e7b536e1243d7a9b0ce7c300e77536e1249de04a86730ac079bd4d38f39dc4792ec079834d38f39cc4b90ee0bc91126757163eb498d71f8323b565b5678e4767b4178862bf9224afa33c97bc6b789de78e2f532da7adb4b7a702fd02a8b4dfe40a68c239f064a0df02a06fa6046d36ab9870192bd9a0c66b00ed2d94687976c7715588e626473a46e073afbadf00e4b1b7dad2a7495a99226bb1f70716789b2d28492b526428af05286fb7052569258a0ce51c80f20e5b5092363ec9503e0750deb9355186bbe45c5cdabf17407957267adb7343ddc4f275863a89c9301681d2fbee4cd427d778d5705e61c76a93e3c507705e07699b682615dac100ed3d9468e5dadfd4fadf4917a992d9e9a900e6bd36c17431ef3c0dc0bccf26982e6e8bb209c0bcdf26982e6e8bb205c07cc026982e6e8bb206c07cd026982e6e8b722080f9904d305ddc16650980f9b04d305ddc16656f00f3119b60bab831e4e900e6a336c1747163c83300ccc728617666e151a10a31c6c327d06ceb23423f818e90c75d80ece2f8660300f9094ac81d15c8f044e9789f139e51b8581bf806c07d92126e36abda2b1ad8ed4c36864df4ac956f105d229ec15de0477a1a2ca5cd20c8368e6e0b66ca3f4589b71dd39dd136c317b6caef39dd764e6a3b12146d4f53426d0ca0f26ee6325691a94e67b2add18a01bc6728e155ff8402c29e2832ac1f00accfd2d75de3fb29c09c72aedfbfcf052f674b8517c50e4e6be808603e4709b3650298e3bc0fca7dd1bb79efb948f740ee08403e4f5ffc8cad1ca21bcd5609160bd9323f1be0e57b91f7772092c3e5564a689d6403c98d01d41728a13605c54fb8c29f912288ac427f1d00f862268aa0a80510692f2959117426a8cabf642356d23d69c8b04e03585fa6c41a7d0d0861271fd9b4f06741e27fc5269ca47b2d90e1ac00385fb50927e97e0b64381f00385fb30927698f3e19ce3301ced72971ca8962e18d02b695896287018c6f64a2c3234f29df33006f0b15bc9b00bc3729e199adda20ecdddc4c85763b50357a8bbac619781a7cc62726c213050b58299bcad6fb38cbbd567ce03640eb5eabbd05b0d8b7335108614550d52df6098738c870d6077df0efd884738893385b039cefda849374dd11dd8e0d200f7dcf269ca4b39bc8702e0638dfb70927e9522e329c87009c1fd88493740d1219ce5b00ce0f6dc249ba3d0b19ce3701ce8f6cc239d0499c5f019c1fdb8473909338ff01383fb1b33f9eb04f89ac3f7e3ec0faa94d5d74a4c7949075d17dc8e2383fb30927e9213a64389f04383fb70927e9016464384b00ce2f6cc2497a621619cebb01ce2f6dc249ba628e0ce77100e7579438e576a9d88205889270b102d9949a8f00c8af6d01e9e2cedc570190dfd802927068830c643e00f93f5b40bab8ed4a2f00f25b5b40ba78744e1900f99d2d2009976693819c06407e6f0b48c2ea0f19c88b00c81f6c0149b878800ce4e100e48fb68024dc5c850ce42500e44fb68024dcf2870ce4c500e4cf99e8bb8c7ec81861d14376c8d80100eb2f9458e50af7d46776b8d7bfde0a7404ff6a134cc21638ddac0e00f3379b60ba38f2c300ccdf6d8249d8122783190330ffb0092661014406b30e80f9a74d30095be46430eb02987fd90493b00d4406b32180f9b74d30095be664301b0198ffd80493b02d4406b32980f9af4d30095be86430b70730ffa384196d176e17373fcd032859ad0cac0ae287874aa9195a524576d2e5312c0e2f46096f3bef662de3331974fb73b837fdaa1d009745094e76b185f77ee70a6f1b4784160290352841b665e16dcdf822a9f5a22b2d9c27c2ee35c27637d9c65037811cb1262552dd52bf6d7b13be1160d54fad4c24fbc1db68b2bf0224fbda9420e1ee317027c30c0124db526f100058871260b4a3955ddc577b38405997126507a61e40927a6e4908962cb79c0ec0d6b3152c61ff2519d8a1006c7d5bc1bab893f11000b681ad605dac38f503601bda0a96b05b8e0cec9d00ec76b68225ec3c26037b0b00dbc856b0841d7664607707601b53826dc3a20e0bbbb977c264d0286d4209542e670976d59ec4e47eb113fc3d68467a774542a50cecab4d86f375609f4ded6959b97894c95880b21975f7f2123f1917fb09ba1c6cc25be1e00cb9da005cf34c24e9d467c8b93847ae05c8215bd884738893387b039c2d6dc249ba949f0c6701e8afdfde269ca4bb6d92e12c07385bd98493742f58329c57039cad6dc249baf13319ce9701ce3636e11ce024cecf01ceb636e11ce824cebf00ce7636e11ce424ce3aa0a2d49e1227bfe18ef9b41af730d563714c1d2831259b5aa88e65bad8e6ee056c6e079b60ba787c681f00b3a34d3009872ac860e60098d936c1249c414c06732700b3934d305d9c43dc15c0dcd126988403676430bb01989d6d824938d3830ce68e0066179b60ba38d1ab3380d9d526982e1e995c03c0ec66134cc2794764309b0098dd296156ff2c40421b255ba5b12fe8cec8b1112be9840332ac7d7dac756a29c2c755113edaefc3e1bd3845befec138771f369ef1a1d912161c62d3874d62c13aa0451e90f9de4fb4b858e0fde89ec7fc255b63d906b6da7fcae515fbb257786fb966152cb78be7a407378d46c234726275bddf7c96fd628f7b993fcda1cc7b5a3ff494eb54e84bcc8935f3de14fae15cc5d6fb382bfcb72bfde910f1037972620d422ee1d13d394687fbe4c41a8524573db43727d65123bfaabb28be545dc7a58670a4f7dd46169cef94e31b129754eac74691ffaca186759988eb9c24abc672627cfc7d7d95e73359fc90d88a4aade393532684260a54f8a61cf3170a70dbe0b1369995f83158ecc771a197a20a3d0db9fbbe5d3d67b181deaf6092569fcae9597dc479562bc49d7c9e5c26b7ddc4d276e2061ad3e75dcbd396ea928528c828f8f7a53ecf125f6a41d290260f1f9e821b268895bedd785c6ccbe1ef09e33dab6f771ede7e69b0bde41af5e23e671195963c595708d5929e2f6e5ffcf25c7195af5cb9afa6897df352252c6fa9ef6fdf1c3b6d3b7d61ef1db6ed1ed5b5ede81af5a1b4ed405a309357913d3e85d0e9e3410d73dcd56adf1e0a2b6d2148e94bbcbf8b5320d1c19f83884b1be9dd95f9615dea4b5dc1e43f5e66063fadfc327fb6f76db1a8114df5dc17fbf2fef3fed5fa7f3fccf0225bcd0400 serializedProgramBytesString: - serializedSignature: b5ffb9eb547e85e6f7df9e030b3122131204681f80fe5a29a0825137dbd191eef08ac72a53e50f2d4a59c65162054370eb9cea53f2a95ed8eb8547a4dba5750c + serializedSignature: 39149c20895bd955f92b699b6f55ed9a4f252bf5dd6d816cfc8a73214e4067b91ab823ae0402aefe45eae73810c638a8dc67eace64b3ad5f2c912691c473e205 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset b/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset index 4ca62e9..c17074d 100644 --- a/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset +++ b/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d695b1cc711807b11cb219040080974a37b75b10b1202dde212424212e290131f415802097b41322045ceedc4b91ce74e1c27714ee7706e27cef90ff213f2215ff32d3f21cf9374d5f4686b67bae760a8f50c313c6cefccf45457bd7d551f33946585fc491d961f37c488e815ad625cdc16f7c49cfcd62bc359f96b1dd9e787c5bc0cefc8cf4979edb068f1b9137ef6a79ae5e7a03c5a108bf2ce07e2960c67f0faa89892df07e5bd53f208ce4ecbbf29192b552e6f1a177de29ab82a9a521b7c44dcc09b16d4b914d895aa929f3de24579750a958244b278a9497e8cca2b0b786d562a6dc77b4a3c8366cdca6bb7e43df3222f653e8b12ab6e5608fc22ac608d0a6b557840fec918a29f1c83155df22f2dffeeabf36b55b84e85f5f2afda8a537e5b9dab23b2abd5f732f5bd4a7da73aac52e14112dfd6ab81c401fd2e38aeaf57e70702a453a9c2439a741a491c5d3a1b42a453eb080f93f436869053aec2231a7d9b481c9dbecd8e74ecf39b549855d72f9263085b495aad2aac0a988f4ebb73e4becd067db6a8b0dda14fbb0adb888c36155607d427adc2a31a7edb481c1dbfed067d77a8b0c3a16f870a8f91b48ea970f512f91d27f7b518f4d9a9c22e873e5d2aec24323a5558b3447d4e90fb7609ff725cafc2dd2a3ca5ee1924c7109e2472f7a8f0343977528567d4fd97d4f15e159e2571cf92b8109e53f75c26c7b2ce54ec71c8b6ef3bafe20f916308f7a9b0dbc1b95b85fb55d8a3ae5f21c732bdf4db8ef8bd2ade55726cdb4de55c73c8f98f43af3e627b9f28b4bf5ef96bdb9a21c790d6b0b0daf17f386cf29357742e9dc2deefa2ec8f2665af91c548d09b04eda6ed3bfd3b68105d011ff0b31f935d945de17d2940d34b8e631fbc285b83766d2fb929554bf4eec5cf49196306855e7727f1375712a05c5efe4e912e7e419e1f400f013af91979a55516ae19bceba66cd29e92bfc5526ec864f3d24d981263f2f33ecabb29d576c7f43309dc01e73d2352a6e5adccca3336d0fbf2388f1a8ee2e743d4740ab51f94e716d1779a93de538f0c1f616a6edbe7e5775d9a630a995e47bdd3623a6fb9467636f5496b40fb2cfa10efe5c8bb9123e89a5d57d5b03c8b5ecb2bae9c788fa1d5c880c331a864b421b254d1b9769145bf65c44530bc8d6e0bf5e5dbe27d5c3a2c5eb6e8c940766f410b0a39fcafb7de7cbd73dfdf1bd3c5a61d1559e866525b7d4cf3020bf232a98d2e09de26a4d3e53950d4893fa5c38fc384d112e2b7e2cd60bcf01950813d537106a4c0ad1e935f1ec9bfbc8cdc2d055a6a2de08d734ab5bc6c09e7b125bd2be30c4b0cae3ccb41029588dddda9faa96e025fa6035f556af0fe2d8d17f8aac77615c0c38f9e60b581a09f0e2682ab7404d14b7b9a95a0db25b3bff5c87bef4a120fb19f7d20efd7b970de4c61a874c4c154cfb30679b6681dcb701a990897eb088382a99b25213c2abd9bcbf2daa48c3f853d289c1f96122765da20af1b5328d8547c8737e9dac0a4d720e93d847454cd4cc4d31ae23920be56a76cb54359d0d320b842979550825233ac59392ecf59e3877ebc3a834e6741e63d3c86d40095576cc8b22b380ff800f5f0cedcbac0995b8f990b334c7cba9ab2bb52972b38d93056c24e00aedd432993326ef86e0066420f39bb013dec0684ddec32ce5f0513c22a5d8d0184ebb55a39ab4c83b9ca549b24374695bcda24794354c93526c91ba34aaed54906444d415aa61ab3e0353ac190abcd1aefe2bff2c725bcda2c7cad49f8268d70701bc208af3321d91c1149bd4e30c4df124470bd59f03a5d7b8319f052493a74bf99af015c989a12d764857f4e585316eed6d79efa1891e1346a01e7410bff1933ef966ceb633e05be592c43fd22f8fc1dbf1530775f860dea76dfde6b0c873730e9338d56ce2ea1f7d237e63b30ed78913175130dba2a05dd6f8bd00c1ea19e4cc8df9cfc5b508e33a40fe7604ed45a4075d5bc4a73cd5b6f4a7fa72efd0692fe8474256fcbdf71741ca1de15f409a341a349835d3a0dea8b082cca0b8b91ecdf604a7db72ef5da22fba1845a6537accd1b4da9eed1a5ba1153b54add3cb66977c513f26f06efcdab09d25e79064aeef3a134693269b2d7affcdd27838aa5f36f36a5bfcf4cc2e64f87356e1e53b26c86d164934993fd3a4d761469125c23880579b8184ab7cd26dd32e65c1a9225f3169e8cce668b29fd03baf43717b1f1d3636944b6ea3402fff5601057c46340bacd64ea21af0ad1b66c1562bb29fdc3baf4d716a1be88a3783aa31826e51da6948fe8526ed25600b7064bcbde16932ead3a5dea1c053e1a879da6b4b3bab49b0d857db948ec326993d369538dda58276664e5b2bac730e9edd6a497c511052c24956ae81f640547ef2ae3b61407161cd2685d45d8cc92c16d60c1d337b9727b74390587b0cbc5b910737664f2fa6bef4c6f76654dda9c357b75598363b2d22f492d6d621ef6dd343947fbc6cce9105e2b4a61a7e5f7992ad2715d455aa3aaf53c7a5d79f9cdde5d3013b2efdcafcb351cf0967241858e6cc2e75ba7ae53d5e65997d02fa6f8a56fcab58c2ed7a0cc9fd01425583474654d87396b0ee884838f0f7b8f22cd4a1dd44986c6f9948e648829984326954f4755f9b049e53311553ea2130caedad920823d5cb556138b735159647592a1ce9e0fa272975970ce04b93b22e436138b9ea82cda4d2c7a23b2386a2a177d11cbc531138bfea82c3a4c2c2e446471dc542e0622968b4e138b8b51597499580c466471c2c4e2524416273582b33801f7bc88c75aa3fd9cc0f2ad375ed631d3f6dcb0af369382968f575f534f7f4a97ed903b578264fb9039db4feb04c321ecf075fae5f64f18bffc8c2e01f051608bb0d6dd0de1a39c35091f5e06e1e74cadc3f5a8adc37953251e895889bb4dcdce68c466a7c7c4622c2a8b5e53011c5fa602d8a74ba006c5465b97ebd70986b1ce13423366ea36b61dd4fb6fc571d53dd98e4c48a9b3386d36a37673c3157f09108bb676c58bf461c666174cf6bd4f67df94b05794ec351ebac2638d4aa15798c6dde9d02b0c3e8ed92ffb0aabcd1c412b601cf91063b72a7b6062a8f841b81b388138233f9f45eb9c76d32d7ec557bc68dd9029841dc30e9838bd5fc7699c99d39c8cdb2b93028b406ee11e6f42d1395c34717852c7e149460e0391cb8bb9c48421326822f2948ec8a8b18570fb16d44ef7d505e4378c16ebf3de9ec233b7296ea9dd52da3c4ee2876170c9c4e0691d83bda2d8d72ca469597c072d86a9e429d47551dc75d95698010ba3e765939ecf985a737d9ab4051f12d6e4f6186ee79cf3d0d47c7eb95af321937d1fd0d9d7eeb08fd600679e0ca83c096ac3526bd3159305133a0b2e785850dccb42f97e41de642d0b403df0d238785fb2f4bcba6ab2f46690bcb236ca5beda16deb983c5778d6c0db3e5d3ec25d612cb866b26032786d8234694ef5fbe412b5cf747eb97268d864dfb33afbce056a2dac1d23609bf5c057f4d6c2af25ac94bfa914f8c2fdc27ab4e24569d93dec01a017c9e20698dce39eda7faf10a43e2b2100d5b1c77dadff0ea05bc2fc4ce4b470ce3f2cf5f1383f2b745e472bf13ba875c177adb91f05ac5416d9b22469dce8b3d22c85372b5454ab5c2dcbe276a2434b2c4dfe5ac008a46295be0c857f04c8127055ed7d0bb86dc43755bf959e2328c0f6ce96e1e160286a56c332af9c912159cd2ad36539c88d694e646177662501de58aa00ef0e273c6b33a1ff96a924407b8340bbcb09ad02a1593b1fc1f749021cf8b1e1cc70c2a94238c5db329300e8df04d0739c80fc374a2501d7abab0ab89ee7c465edae336f734e02ac9749d9ca73c2d26f3d4b02a2ade50544b3fce5c9bc573209b0fe89be5565da21dc3917b15c2ff8f0236c1e81405bd72f1ee1fcdebc72251c2312dc861f37cde1f5768f47141957879ff16d9532da7e3013da59cd04f6d03201c70e19df1a9009d045650c4d4d61a8af1fa2e760a87f4ffc7f8fc273300a87570656f42b0856bbf70267bbb701d32c9422779e42a95cc4123ce74c3dca3b49aa8bdac38620a62da54d5c4dfad8796e9050716ea992e89caba5f380393e90692e907b08c8054e908de80d99db986497c71a82719113a3fd3c96359b3a27f29eb3ee8c25b28b0b6596a07c500a94a6aa5dbc78cb88b2920b650341f990136593a3bbd13b23c9aee25504e607b9615acbd2a64a3e5eb43cc35832abb960ae25301fc5a7927724b0923711942f96a25c0643093bac9307731f81f9a138c13c9640983b09cc0fc7096612abf92e02f3237182d99e40983b08cc8fc609e6d104c26c21303f1627984974d9b711981f8f13ccb604c2dc4e607e8213668b708fca752f7b34bd1c92d5895fc385f708c1fb12275eef47c39337e92608b84f7282db6e2c97f6bcb6f9f5b0139c3d7b0d17da1c41fb294eb47e03cbe48fd1d710942f97ba94067d7e80156d3d17da3e82f6d39c68e169ba5b2e68b0d9fe4e02b155106c9fe1c45627e8a269a15c165e3095bc96b18ec0fb6c295ac6604b148c9d0cdb12450741f9b9f8f6df8c2e3b5b293d4cd07efeddecbf8bc73f499ce46824285fe144b93b42ff5d78ee8bb5271fe2827c8a40fec2bb595e93bff0bb9fa07c951365a30f4adb52568ced5c1877138c5f8c4f3fcfd819b195c87682f24bf1e98c3a13d8196d2228bfcc89d2deb0652a9549dfb0d54b407e85136434df9371bd92cdf73c41d07e95132d0c9061136a5ebb9b987974ce866f15c1f7354e7c3b3525d37acdafb5b7e892b0fe11e64a9b902b2380bf1e9fee28895b13361294dfe044091b9561a453782c80b97ab3ed7fab24c8bec9896c9f2a7d796c2127640477f712bc2362ace86c2de97982fa354ed475aa23b2376117af4cb29653b655c93481f72d6e78f67f2228f12431db0c7b3d81f73a27bc68de25e33619b64a7d9ca0fd767c7aef1309ecbdb71094df294515776f3c98535192072f45e07d97135eb091b8e58e33ce0e7570813c4b40be1117908cee0e1bc83304e4f7384182cf41dd9d5e41fffb77f2ba945a02eefba5e852824df532f6ce6c53bd5d04e50f38516e532817f111a905e35299fb9f35b256eeed5c60d711b03fe404bb55140f1badc7f7ad777b0e8abe15360d7c9a60fd5129aa7ed07dc2c97388d613943f2e650985cdab85173aaeb4e5dc6e82f54dee125a78b27c253e7a5a4d50fe243e953d890ff83513943fe5440985e183aeb2b81226d8ca09c29f71226c11519faa60ec8ed8f01e25787fce8937d8ab4d923b3ecf10906fc5056412c7e77b09c85f7082cc896207e981710ad83c6e5a795b0c4f12fcbfe4c46f3f12681ae517bfd99c15269b2b7580c0fc559c6032b6b06c300f1198bf8e134cc6edda6c305b09ccdfc40926e3741e1bcc3602f3b77182c9b859860de63102f3777182c9f81e0f36989d04e6db7182c9389a6783798ec0fc7d9c60326ed16683d94360fe811366b4bd1f49dcd07590a07d8713ed3a51787095be906f028fd9f725b14d8a6c2500ffc80930dc0c68125fd7b381a0fc537c50762510e566b162decc9e83dcfa331487d5aa3864023da690093cd19d09b0db3493f27a6141c6b89b3a83191aee0da499d00b479990afd5ce847ae971c6677b8af5b2f575aa6cc17f37bb82774f0aeb75ec93a2f0e2f52ce048c18ec330ff15cb5b26942c6f697f81e293d2b726f965ab13cbf1a6779da5fef699eb57ad47ae6461c96945dbff57c87795ed584c9bf07f028ccb9cb7ff53c03519f9362a053fe9ff016d0261bab2b00000 serializedProgramBytesString: - serializedSignature: 5161be497188df3f16a816ad5502489f35ea499de87f277c172e16aad00f257633a13a12e5914c2d8e1ad6391ee56a925035c8e4efe8870050312da07f587b0b + serializedSignature: 82ae17fc23adb89b12144c8a3ad92937ef5f410174ca1d63a05cedddba6cc141d2124f273df9b5e645d6709ade83f3529342486a1812d885359269a49e3cf206 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset b/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset index 329c7a9..4d75e54 100644 --- a/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset +++ b/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9dd95a1bc915804b80101830b6318bf1c2620c6db34860c0db8c132fd8c3cc7809db24f14cb08c85912d30110233936d9299cc64bbc84dbe2f0f9117c84daef200b9c843e42d92734e57a352a9aa5b4dab243519f4a196baab4f9df3d7a9536b435d9cc14f640cde56d802bbc726d8327bc9deb22df8740f8e9bf0b2bf39e79fb22c1c5fc17b12ae8db17e8f3bf16724d203eff3f06d87e5e0ce5db606c7345d5f6429f83c0ff7a6e01b9e5d87df14a48a34c04dcbec3e7bc21eb3ee48a7878815ba69879f8ba05d912678bfcb3e87ab29520a3389d3a56e785b842b3b746d139476d23d639f91599b706d0deec9b20cc87c41129bfe1a65f481d987e3fcd8c08f67e1b7997faee7c776214d23fcc6a5eb27f8f904ff5ec76534f1cf623eadfc7852c84795de4dc62941962323ca8fe7b82e93c277d03bd22fa53bcfd34d09df1d9978fe2affdec88f1724b917b8dc3f4be9fa24b98ebdfdfcfcb4904e3cefe4d7c48f03527e033cbfff48e906a5fc063576389c2e4a722fda72ebf6a5744392dc210fb997f8f919e13b1e3bf8f134bf3e5b42f91ee3c74e76781fe91264c93e322c3118b619d48f49e98ef174d7a4321e91ee1fe1f767a474f2fd6efab6f06377009b7b04598e8c183f5a92ce96ad7343bf94aec587ce6dfc782680cebd822c4786e3db97259d2f739dffcd0a7d4f932efab5246f9415fae8283f8ef1f3d785ef78bcc2cfdf90f21b97e45c91784cf0eb3785f4625d70ae2beb423442adc60710c7936c9bc509185a546af3e6dce9ddb0a1e8467cc39f11ca36074dc8360850b42ecbd476e5a0e64f295b9733915641ef7bf49e841469127aab388bbf176581ca65e095129ac61d38ff905a566c1cd37065827d0c47bceb3914f93378154a59816c33d0bca6d812bc6f93bce7a076714a2f93b01995ef590099762bbf09671ca0dbf03d431a2ed2fb1e699a22ede7e15c8efa1c5bd0ebb80bc77dcaadd8f62c7c56e5b9c491a9755437f6baf37697c229a6fb600d6a1fa7b6fcbb12a9468920fac65bbc1a36c4a927f687a292f88ea11d64b0719ee732260959a4e0dc148b53fbbd5044d0bf8dc516aafddbe63d0b9d3b375bd464b0b8cf9205f912b6e6b2ff88fee5abdbd142d3aeb238752dce7998e60616e55991ae2209ee2644a30d095454c61f51e1a7aec46205f1dbe9d294ce7f013452cb54580034545b820ffbf09b81c44fe13d09b767789cc33a3647e664e16c51392550688c501737a45eeaea60d7a96037551ab677747183dd7460571e36fea809366b087ae9a02358af2248bdba4f8d122cee86399feec2bd1b40628fdad65db85fd56d73678ac38c7189a99a670bf1ec577626fd69a423dca0227cac3af1f8701e8a9dd8ee923db4cd359cfaf5cfa88a1e8d0c578dd25b867376377d8eaea6a96f67d7b3091e077364895b4a77aec74bf6d276628a1313e5d14b47bb51413b81b44fa8546d9654452d3582633ac127030a6e52f907cd303dafa27fcc83dc249c4d05f49053257b480779c890a78794ae99ce479a554589c44f9752941dfaa23ca6128c8ed3598ae0985e708b4e705740c1ad2ae7a3298fa50a8676bcf696a42421adfff08e9d895139bcabbdac87bcaca7c8386f1574ded4a64278bcd23db845def7cc30f7b1971a204ef6f595dc3ef66a7a705e3ae8081e57793786c5b3acb863f95ff829f2f066bd87b7ebaa0e0eb88a8608d84aacc22b01bf395a4c5a636fe80cce7bd98b4b7eead7095deee7bd725f2567702669960e74f193fb4955eee8af1794154696dca3977c4a27b92fa8e40e5575a242cc56a5395c2828019c285b2797de64a3ec0edc8f4347b786c8a9628f689d6f973473af8cfde81e8acaa8af90035421675d9a4e1356e8aaf369956f601d1fd44519d93d7af5eed1a9ab501703b6845d3ac143010577eb045f0a28b847277838a0e033ba021c294301f6ea845b65107e56251c7b65b8d6a21c00cac2dbf4c2cfe962de95a031efbc2ae651d3f1ba2a31ef21b57329f6041aedd73c729437c68daa5c5419dbc628b64db8c4b67268ab8b651774653e1eb4ccfb5492b1cc274aa9bd637ac1fd3a95e341551ed0494e04953ca883311910c6459dca5341551ed2a97c35a0ca9754c1807a729b550906faae437943c274c921618642c2a44b48289fcebac030ac73acd9a08e35a2937c2da8644b27f97a50c99775926f04957c452519bb0bb80f2368776154251cabdaad52eaf08c5ef098aa0ed398e96555eb70796bec7b604bbd44294ee337ab84bae957176cd7e4b7a83a40bc4f01c28412ba7030aef3a4db013d6942e7ffdf2b83ffc755c27160f07da6989d48316789c9593012f71dd98b23e8aaeb345381ae3a7f90720e1cd8de486b934f01e53d4a3d7130d7919336f1aed08c4b1ade5f107b3b5dde11c525d7c22b624f50be6b05724883567e0644091da73b2a4ecb86396d41da7b90155a8472f3f7b8130ace6152c7e1ae8ac3cd030e8bec3efb08122521f714d89aa3e096a6a31dd250bb79f864df8e7ac9faba9569e1e4ad1f8ba67416dd5359f49e36a23841fb2d7dc3b2b06d7a457e8dc7e2310a5e574b538d68fc58755567d57d7f56a9f410ebeb1dbe816c4f513b0bcba41cde37adb36a4e65d56da9a12dd4c7b6e22d94985d0649daf2f118ae6249399be2fcd974782f9cd159f64065d95d6d79e1a2d7438a9edb6c83d99bf8442fcc325db758ef8bfaaeb41f0b6775163e5459f8466ba15e1bd12f7121e20bf8f40949d8a0689925ebb7c86bb740c606ddb77328cb9d195339dae6973fcae1efd774cc3e5031d3cffea2572c317b59dda6b4c3fd21c7cf9a6e37aeeb2c995759327de8d297fddcbb6cfd58714367c5872a2b2e7b5a51a8f33ba28ade5a5c1a79bff2a3ef4d9dbe1fa9f49d97e2a598ab182d1f514f1823e436b5d46b2ef1b2b046945a57bced8dc12b1269a1d0ef6cd77b4a7e89df76589c96201207fd0feffdf598ff26b47218bf970e7a9cdebbed3f66faddf6eb4c1eea1d76e3b59715aa3ee584d0ab14adf3b649bfc93cc62d726401695a8f396a963ec2526de6a55a17a7a5a1d1437a93b7168f31b77ab50ff9df686a0b78cc7b6e5464854bc99e39c8f3e8720ee324c0d98f5c86474cec91d44b7865a9407788442c5a9740f24f4ce2c121ba1381f36becf971a8ad4e18904d37e4913d3589ac554026fa550a940903a80dc1b77e6012540bcbefe6707a5ccb94380c98fe599fc7b46012d30905a630fad5df04bf5a3409ac4d016c89fa9999526cab0154ffaacba35a3289aab920bc8709d19f0444cb2611752abd29cc2de1bed012ae98441713bc2b3c81fd4b0aecb1a824fc4191f0f23c265aea735cc5a30ddcf437c7f6695635cb1b0269f4417bab6a4df34f98307ab0143d70cbb50f6595d4225a9ad86679340f96c26b2d97ae8a556217d9f21948f24378f5d03b8143f81fb2ffefd1750299fe0821c439043baafdd864548b9234a7dc24e9419e526d2e886d6da5a87e98f8d620f4c39e9904d5c51dde9e75da82446e735c0973287b4da19c10507e6a1265af103bbc63cd2a9fe22d9acb0801d23302d2cf4c22c52666476a349c550063d8da4d618b0ad87e623efa69460ae503153305ea98006ad52428b19352d89da840f53486af5bc0f7bc128dc71aefa6e45c97e00c361ec650b60b2893d54519f676f8b480f285499498f52e5d0c6f53111360ad998435acf0bbc3ef2430e89703a6507708a85f56aab1d93b58b32e7c2cd318be1e53f84e09f85226f139530298f13ab5d08eec74f1e47af9c0454d816302b87593e04e31d5b8c4e91d86b9a3d329207c55cdd65954de68146c3685f2b88072c324ca3e563ce150fac6cd5530ca18dc3153708704b8e95a863b1542b88302dcd7b50c77328470fb04b86f6a19aec1986b0cee79016ec624dc3325c35da804d0f74d011d13806e9a04ea74e5af56a32b6f6c84de2be0db32890fff2c8e3cad1bbe914fab80ebad495c038aea6b77d9719a638b7dc8ff54f251eb93d60980b74d021ef41d1f550f9f18443c630af12501f14f4d226e61e2822cae433f60695ae93606adc314b466015ad62434946bcf64866f6cde2240da3109a9adc0b33cf67a85a0156e13c0e54c826b67ba09b52d9e247c5e1711e0ed9a84e76c14d2ed9ba850db6b6c03ca5901e45e25408ab393f23eb10acc511aeb259e1440be3309d2df62acc1c9086395fb848072df244a677837558de19d317c3d02becf4de28b31b9af17be3e5e9300eb0b93b0ca33f63038716b6cec312e20fe59252263061221de77476e6fc51501e5cf2b1119278f5464ec12f0fdc2243edcd8864f9ccbffb0c518b21653c8ea0564bfacfdf868b0bb632c3e8e0a887f651271b702b12850fe8b31d743d80dbf2cc0fcb296601a6c6e8cc13c27c0fc752dc13458cd8dc1bc20c0fc4d2dc134d8a73406b35f80f9552dc134b86dc518cc0101e6d7b504733a84302f0a307f5b4b30674208735880f94d2dc19c0d21cc1101e6b7b504f35a08615a02ccdf9984891b3677699473541e8fa3ff4c7a349ee94f2091df63f1c778f15bdab1bf253dac6c3f58af2b56cbb3e02dc5033096624ed6725993b71f6c3fc9c9e35f9a7cc470f92509f924e9987fc83d4effc205ff72a39fbf2ce62e13b9bb4bc37f43dd1851d7ad4cd93ca61c4fd5ab2cf5b64fef7dad2ea512a7ff7a7394edff23963b2f7672d36e72e36528795b386e0ccdc267540a7fa2ff03e7a1a4c588870000 serializedProgramBytesString: - serializedSignature: 3a0d73ed5fb48e79b2085dcb9cf6b26444f003cb5db9955f3338205b3677564eb63a52b41cad16280b384c8c822600f2d54b968b3dc729d7b268d010321c920f + serializedSignature: e6bcef750dce3c798fbb102c6d6779310a728760ffe41f567f6291592a19e8bc4bd78348557f61eb7ebffec8d9bd45ca17c21b4e0ac4f0da48a46c8ceae55d09 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset b/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset index f3af3e4..8a672dd 100644 --- a/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset +++ b/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df75fdcc815c0676d96051b178c4d33b6715f17d8a518f74237ae180397d877c118168e3bc004b0cf8ee324977ab9f4de7befbd5cda5f937f213f27ef8d24f6ad346f25ad9845720e3eecec6aa437ef7de7cdccd3cc885d9712f0133b0e2fa36248748b66312226c503310fefba219d835fe393757c502c423a0dafe390775c34ba5c893f8763b5f03a009f96c4325cf9504c403a23f36f8b0cbc1f806b33f0098f4ec15f06ce8a95c04523a247dc1437444d6c878b885179d192792c8676c5cae0b54b3c81dc8c540a0b49c9ac1a78b90d394b326f0e94b6cebb2b5e9266cd41de045cb3286641e67d29b1acbd5cc837c248cacc7483991e85bf72f37d85995a9f37c15f29fc5d313faf37d3cde43cccbf6acbdf4264abf2b79ae94626bf92e8a3cadf661ebf667ede6ea6c788eed53e6da972b1e5988b2d3b5c6ca9f6684b8d991e27bad7b9d852e2522f56fe16225b956fd952cbe45bb6d431f9765beacdb489e8dee0d3167bbdd86d6972b165a78b2d0d1e6d5967ea5c66bea76d2961a6cde635d76dc753e6f11be6e7dde47c2b1fd3b479de4df373dc4cf798e92e9bae567ea3ed7a7bfede026c69616c69b5d9b29f9c6fe563dae662cb3e175bda98fc426c69676c39c1d44b3bc9c7b4c3664ba94bbd58f98db6ebedf9765b4a6ce949916d27d635a7c8b143ccf587cdf48c993f483e637ada3c7e8b29f72c2923c99471c44ccfdbca386fa6e76c651c24655bf9985eb0b13d65637bc0c6ceca6fb45d6fcf2fc44f2e0ab59f5c126a9fbf48f231ed14f9fdc4eef3763fe964f2ddfca44b38fda45b78f7935e5b1df69a698fc8ef277dc2bb9f5cb69571d94cfb85da4f7a483ea60336b6dd36b6763fb1f21b6dd7dbf3f3fa493c2623bacb10638d8b0591928e8316790d3dad2bdd834e145d8a2ff8735816bb0ce1dd020850447e2332ae5c865eb25519f9d5c52a88deddf2751cce989142879c45bce52802959b85df0c095b97e078bf8c7a31709d819c66003723afba0743c05df8cd95320ac5ce42e89b11c3f0ba20e5dd03b59d67ba998421aefd9a21906944e07370c402ba009f67a586b7e5eb23a969466a3f00c796e5fdc03cdc117441fa5896e6b47d11deabca1c3691a9755407e2dc7123dcb7aaa907ac41ed5332367cbb46d6a246107de990d90c4b52b2177bd351136f33343a99b8ec580d192d12592ce758ab48c9b86dc841d0bf8d4e0bd5fe6df0ee80202e9f2d6a3258dd3ba505d91a7ea3e23fbb12aff5dd89e79ad6265272a86d70312d1f5894978c553b24e437211e2f49a3a276fc31157e19c2dc2e227ee3bc19799eff0a289523536e05c4f0367218de3c86bf5938b9475ef400dedd910a21642c721a7e516d2bdf516369149f90d09d43aa9be21cf6752aec65c5c6eedecfe4c35eb66257163bfea809963304dd74e008ae57119471e58b5a093a0332eb5d175cfb3290782447d98770bd2a80cbcf1427d89a6c4cd53c374a9e8dcab0d29f461ce11205e13412ae5029596e5312f56304c739c19b020a2ee5046f0e2838a1723639197aaf28ce761bbaa7ab90370ee767642881c70741e238948df23a6509d9eacdbd22bfd36df1ec745ba5d31d204e175433cef9ca545589072b15bdce7fe1c7519de57c7596abaa73e3dac41c85f5bd38d158e3b9efadca1b32f8ed7937a8e8c95580d78bdcf3aa6f9ffbe58a4d066efaef8b578471df63956b8cfca89175ff3404e994d4028f4f984157feb2f2d7cdf6153ed9ba4961d716eb55f6d66b65052e3e6c909d9eda6baaa5d7844b67ce2737aaba0becb56b54b1217678636617849e674584bd523fd4c8d19b24f8dea442d51ee44ac448117b131a89724b7bf9fdb656e5b772c5a4ce618797d2e4824f4c183fcd09c6cbeaa597155602e70d9b386fd8a9f2061c0d167206ac4528d38f076ce6ca6b5095b7437adf9848c35f06eada6815d817e3b2ed639987136fc6cab31f3db6707aec52e9b18de8815122966f7861e11a6ce534d8add260bb92c40db317295c8b4a4e8b3d7c6f6068312eeb7e2940d9dbb8b21b55656f22658fc91e71da9c87f3db0b55a9cac56e71af2254c056e9105ec50bdfae128efdde3e459f9146a3f66707177b39d57c393b387807fc74e3d7e40083eee40760b5aa6c6cd907553662d987ec1d9cbdb47abeb41a8ee8618e68b220a2b5aa7290c21115d14a497458bafd8478150e4d061c1ceb38aa4739aac70250ade7a81ee7a8361544752747b5d92fd5c27cb581a39ae2a8a60350ddc559dba2b2163f16e62bbbb9725a55e5600ba2f7998de6f061049493e20c1c790a763f83bee829487fe64b973d9c2e6d2a5de84036e108780b1f4c1a392dda555ad0017d4e868f4b90391d6828ddcb697042a5c1064187b3176400b7ecd3b7f771257670de56581bdacf957392abe15c6fc350690aae0ce66707382d4e71d676cba93cf42b3fe51ce4ca39ad2a07fb97dcfe2a6b2506e2d7a57763dd3ec8696d7ead3fc4697546a51576c8e8cdcb8ede94d64c617c0e739a9c5569b287f8b91f8df09a4579be1fdd929c6ee754bad5114ab9f564dc4c05677584d3e7bc4a9f7d0a56def52a8cd851858629796f322374de928f98563d9123e0b4b48ccacc8e09d88af29d8d3623a549d00ef5c87feb8efb99bccde0e2eea3640ca31e7dba72b7e5c7547e83b57249a5bebdba2ff2d57d9c13dc1950701327b82ba0e066ae09757b119cc7f3532ac118dfe2d628e58cb18fdbc034a7756f40ad5b38c17d0105b77238fa5701471ba7f5e5805ab7738207020a3ec1e1b8b20a383a38adaf06d4faa44a30ceda5df32238cfb2de294ef0f580824f739c6fac02e7330ae12939e555ccbd03748edfff5cf34d1560e580855b3f55fb06dccae706a1b35c9ddf0a58e7e7b83a1f5a853a3faf125e29a178d07a90177c816bb4c3011bed454ef04840c19738cea3abc0b993d3fa85805a77716ef78e806ed7cd097e6740c13d1ce73babc0b997f3e7bb01fdb98fc3f162401cfd1c8e975601c7650ec7bb02e218e0fc792ca03f5fe104df138a7b40ecbe68f74d17f770b96d51def935cbbb3de32947e35df68aec5685315692fd9a51180e66e0aec48f5d5739bbc655766584b5386e2d57d3c5ea8195f9c82939338003ecc0ca99bd2b0b5e437218cb80ae8fe4d99443ee63a8a3720e6f065eefcb01dc6e712e0d9a4387cbd5e0748de3745fc5694433275cbaec86a2d022949bbd263fa1e01cae731c26541c3a5638e4ee82e2764d19165ab326937269d05aaaa6cba49c857e2cb9c15932a9b2a435902574b91d1f89e65bbb1f0b6e72166454165ccdd32719daf6c970720e2e71f323bea5796d8385d6da2067f394cae63b1adb617fe0fe8aa7e587c82d8ec834e7c7b4d46e69ab61d7b269d9301ca3e38ff75a75f3e304fcc6621845182b668b70eda0ec85f0d39248c9dd04e9955a73df8285a5cf8146f8d0cff00a77f78d552f0bfe49b22961bff92af4a122372b541ed84c7c905ae77d9b9ef301aa846991250b48cbfd13cf9ba538db5d1a376b755d4a6ee33856a037b96bf10a96b65eed43fe1f9d300458a35cac5406ad78f9b86c9aaef2dd26089aa400eb499b557878129daa13c04cca190e5c7cc59f447c5d1ab9bfaa138efb86c628e0bab63e8b6b56272e6f1b32a280ac22914536b7161e162d5cb525595cf36be561d16a94ff96c812719bf0be551b290b7b12d039a66f9151d463b972b928e54ddac778b9bd306c9a3fa06374d231ce253d74eefc39d9e699f4e893f9cfcbcacb86aeea90338da1ebc2ff795499c6a8f2dd08e18a1584c9be675167df532d8c0d17c64dc43c9c94efa6abc55e7e906793cb73faa38417e30ae993d224ae5ad23dea2d2b1b022a3d05efb5c1dba80b5e2981b7bc967e987be39cd687725017ca3304e5439d281b4c94d39e1a7576465d6bf3aed785b59a607d540c0f9d30871afb845d6e4fa9d143b5f5941b09cad7c233e89c8e20ca0182f27178bcf24404515612944f74a2dcadf04af54e46e7aec73130491bda8bbad03611b4ef094f83ef88a0975e20289fea4459e3abc1b74412e67e02f3bd6182793282300f1098cfc204b33d8230f71298ef0b13cc288eecfb08ccf78709666b0461ee21303f1026981a03236d301b09ccd7c304338ab795bb08cc0f8609661467337713981f0a13cc5311847990c0fc7098604671cae31081f9119d30ad7f8382054fc95b494b36eec7d4062eae0b9c20e03eaa139cfa7f176903b65517b00401f6319dc0543342b93b22f97f9e39a6338ad4b6de7396a07d43275ab7794baabcd6d9f4725d28cb08ca8f17db4bbdcf5b6a44ab6ddef22841fb6631bcd4dbbc6514ef74da08ca4fe844b94d70abe3b9ff5a3b7a7d660941f8c9b5f4c6dc35728dc38fb635f25e82f2533a5116be46aeb1916b5b236f20583f5deca1c87bc0a4f17e5c5be33f45d07ea6188ddfdb2d641467303713949f0dcfa81ec529b76682f273e119923436706d43d27982f2f3e11c92347aa8b621a98260fd4278facd282ef0ee2028bf189e7e338a13c29d04e59774a20c1628695c39d716287513b45fd68976af02adf14f0111debcb8228cefc07bdee69bd611c05f094f8f1ac55d1e5b09caaf16bb1bf03e75a731c8d73675779ca0fd5a7806ab286e9fe92028bfae13252eb8dd773c2d16dd875ae204dc37c23bca6b9c69d286b68ba0fd667806a128aea7ef2428bfa513a5f59526cef5f479f394e8c18b1178dfd609cffa7e1e6e98a151a5c6e98f2a5d205b09c8ef8405a4c6f05c1bc81401f9ddb080d438c46803799a80fc5e58406a0cc5b5813c41407e3f2c203506e2da405e22207f1016901aefbbb5813c4740fe302c20354e096b03d94f40fe282c20353e89a60d640f01f9639d20fd4d57447179b785a0fcc95aa2cc5d93d41802695b93bc4c50fe5427cac2d724357aa8b635c93a82f567c5f050af8f0344afb16f22287fae13254ed53be726a3bea5703dc1f78bf07862149f25df4650fe323c237814371a5c24287fa513a5bfc7a55a23190e1d21307f1d269851dcef7698c0fc4d98604671ec4e1298bfd50933d8f298c699226de37a1f41fbbb62a3f5beb140a3d76adb58708ca0fdbd4eb4d69407d705447dc5a78a80fc4358404671c5a79c80fca34e90fe22cf286ec86a2728ff14de2149a3976a1b924e12b47f2e86977a0b9da2f82ce51682f22f3a51ee32512e8307e27fb77ede7715d513b07f0d2bd8283eee5f43c0be1556b0517c2c703b01fbb7b0828de270b58180fd7b7886ab283eec522b9e9b2feb48e3bdc43f44ce7763785919487afeb70449975dd0490ffffe3fc9fc071ee3db312a4deef370fd7581cfab8c838c719966bf2923857e49be1ad2dbd772e59789d4f34bfb27a28da95bdaecaaf9cb6a7c3587ca5277fb78dfabc8532b296c87cfb5fdffc27a37ab5dba698dfc129711a87943387e39fb22bc47a5f027fe3fe4e65f703db10000 serializedProgramBytesString: - serializedSignature: b21caaceae53b0499825777bf7da8a3745f6a219519a891109d93a2426dcbcbf6d45fdabfcdddc0819c44b94854cc1d88f7f86aac4b9455789e576c94722bc08 + serializedSignature: 899a2c5515443b6cd3de133a9f59a8b96a67c314ff0f5feec138f7bea66f5c07accf55efb2f386dfa2ba6eb2b516b220606cfdc1ee6ecc510fa8fe8df2743b0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset b/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset index e8cb7f1..a2115ec 100644 --- a/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset +++ b/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9721347109eb5bd3a6cd9b20059069c044808e6f2ca86003929738438c555befe9014085b264a64d9b1640a9e205579913c43de223c51d2dd3b6b8d667b76b5b6c607412aefecced1d3fdf5313d3b729f27e0e35c81cbb2981777c5945812ab624334e0ee2e94ebf0f59f82faa7620bca5770ad40db15712666247e2e38e3709d83a7a668c1c86db102658dda174415eee7606c159eb0760dfeaad0cb1980414be29e78221e8b92538c21b14c839ab2ce41b99c0c5cef88b7d05a25a670128f9a4a7059809626b5ad03d341bf67e267126b1dda5660cc96a803cd974431d382ab4332513120cb7e59bab2ccc25f0afe0aca33f67d289ffb645d46deab3406e5d863f23925cb213926b80ffa629993fd8e2bcf309ff342a31d8c1b96fd4f28cf588e287304b2e495ba11a50ecb5149a7a83ce3bcb734ba69d96f4ce323a33c637b49cefb86c3c975c8227e001d55c4a6f008b88b094c3718196fb4483ad5e7eb19ac17a76d81796c0201c67296c82e5be29a98612de7a49353f8be4bd70af4a811d1f1f0147f87a640e6eaf0ad2a66df84fa07e43568f83568990203abd1a817621a0cf999466519a6ad83eb54c5225c3789de0b603bdc334e2474117dcc3cd0f43d781d6a024037e1b94e1c2ed0f535715a25eee7a0ae45f1a40111e50e946f68b6b0ec5b70cfcdb92821e379e41dd954ef878b404df7401ae4de23dff9a09183d008429f1a976e38e051b4fd33a4890f18fa41c6a505d2a731ed2f511d7533c2a3983e1f4230b98c610979fbf6f1be21ae47cac22383ea3e4d12b435fceee6bb5b7ffc93fecbed14ed9af068999c88112d0a58a437e98c8528448be0ba0365645487dfe1e0c765d059d847f8fd7e35ea975c01295a993a15e01488fd15d9e5259415b85b158fa06cc0df2b6236a49f724aa60193cc021ac7a609e43e0ee4cc7e831c1f55a240ceecc8d506193f3c82590382713c9810ece710a46cef37ab082e419d9ffedca7d61aad996d9a1bf48cb305e978d408c4f111a5f7dbc44b34e2833b32b711f7a812774376390b125dfaa45d5ec93952b27d664c4631c018453923d379dd56ff858f9bd5c4400b321077398b1bda6f9f7d023ef1abccdd92fb2c6e83ae6a38f0aacc1bfc356e7e936a521c7ab98359d57717ef708b58ea3ade152217e5a4d12ecd1936561ee356ba5172c04d70970af5e656bd90e5a7cd969fe16647dd1d6720a11db84ebc60269ee50c83b6df8bfb6818d8b641543019486e1cf83ee2b26e1cbc6514c932c643c2c5b360b28e41937ec64c269b403f4326e2a51e10cf71c451f9e32c9e3ae5a299f2306756f416e827ab66157e3d13dcdd81b1bf8030af69cfbd0de3b9d739d16676b2ebf87d8aacec8ce05e3225e3c86475231cc2f47e6dcd2ac2a644415f997a97779dee1af50942fd524402b4172e4d9ac8735e84951f718ceb4e346176a251937b7ebc57f72c9816b44fb805ed9e66502a8853e2397c37c0989e0384bfc3800a854b84145b4ce3a25a3adb3a03739285f39849ca339c94e7352967c100f0b0e2ad941137a8c8dd435125536981f3eabcb6d38b247c1e37f17996e37356e3b33da7aa8b87e4c84db14821a611c1a9b9be577a386192ef1c27df4c84b5e93a792075d2ad0c2aad2412144d127cca49b0640c4026cf99a3d6b0f7c453e9ae4faf343966c2e133130efe72162c66ea5989af255c78d6e85403ed756ea7e77d588efc1dea3c495105b95e53ef29290fb6ae02c56d920be9b6c7e812ab2f8af4b665185b4b9892974c389ce770b8dd95c7ce020faba449ff5060ef1e1b178dd2f0751ccc30ef53cf2d18fb94d0c0a7a6f068012ab3490c7f5286b3afd336a70e91a702776865f1e7669f0bf3b959389dd9ed114a9c149c454e2936a94a172f93f9b8282d250a6801d2053e713bda925e40adca536fd1e7d1727c7997d614cfc524ced6cfdb50f257c73e81c7f4630520704274eee967492ddccebe193f77dc4b9cab44203873e8c131321a9c1f5eb6645a801f747f8df8f73db3c0dd9d27847d254fd1e90dbdb3dc227aabbaef50fa74d838bfa8dafe6422fb6987653e9c96312c5ffa9f47cc32464c0c26a9421060ca1860aed88c0298fee022bb2201d4b7319d6946599f7f2fa78cd98e9890ee46b8ddc48534c5051fcaab36a13c2da1f4738d0674ea2e939db607ea842d50f30aa8538711548b966a0dd4110554cf26a8c312549c788d200d68e3aec11a70ae2de084025cf920a3e552c7d6c5a20d666d4139a040396d13ca7312ca3a74420b6ca70bcfb51db6f9e5b255884fd98278588178e620ad75df2266de1694ae02e5359b5062ea1a7488dc1af50eb49c2dd0fa15d0aedb04ed2cb37623132d72de86f851feaef47d8ba17d0ac05fd804386f5cc71bb2cbd14bd71d05bc1b36c12b32d6697a096931452fd802724801f2e66101d2a23b5b03725001f2d67e00695aaf8fba45661420bf3c2c401e458b4c29407e6513c8528c6b771ebb5905b3680bccac02e6d787094c8b2e6e0dcc9c02e6378709cc992308e6a8786f4e34ca78a2f1ade8384030efa9fce3828294b3017d1ed1b6a1220f1b2acad181473fc5c04c31c9195c34cdf8f7fadfa9a268faa9f74c3fbd38abe024ddcbb9452e422b1efda8e47d961f7ff7a0fcd342da2d9119abe7604fc8889129fcb8ff01887ff3e1583e0000 serializedProgramBytesString: - serializedSignature: 7c4186cfdaa466fe29fd9eec6de55dffef8c7d6a4fe9edf2c9c148bcf380656d0ee7684cc6ea2c10f77e670217f5efca004d2311330521dd9cbeb27fea380a09 + serializedSignature: d375196e7dfb5b90c88f99cfac5deeed2b2f5172194c373e5fc7aa92e6d2c3d5b283c6818326463c4565d1bddeb63ba7d3879b44f5e0df10aaeb8a17cbef8a0a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset b/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset index 268829c..64e6bcd 100644 --- a/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset +++ b/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1dc5f1f8f7d996e5de7bef166eaaeedd968bdcb1656330c655b605926d2457aae9cdf4de7ba80102841e02092d81500201020408104a0209247448f8dfeeedeacdad76debbd3dd3cefe9ff933fd6e9eef6e666bf3b3bdbf71ae432e72731ccf9b58c2d66d3d908b694ad675bd866e7afe9ceb1d2f9e79ea9eb8b589573dce8fc5ee3dc1bc6faa47992ff0c4e74717e973867d56c9bf3e476b6ce39968bfb4b5899f37789f36c9973c6af6e70fe9739a1128d9c8796b262b6902d609d131dd38858261eaa96d7123c5e8926ceef696cb773b74c28c55f922b6e75767e2d71ee548b7b958ed22adc0ab65244abd2b9b7ce79a68a553832d70a894d964f66e20fe61ebaca633779e4d16c2aff6e28ff6e22ff86e1f9751ebb835384ed0ec22a993d9cff59ceff6fe5794ff7bcd173f2bc977b9ee8a0c9680664f496c73ef2d8571efb39ff1b3b7f1eea43ff54f7facbe30079ec24e51e26cfdbb8716fa8746e2b8fe7c97015e0dc0997b8469e0f94c7f3415cda836b50462538e7c773c133e74ab91f68320681fb50860cdfe054793e58d3fb02207bb83c0e93c78e52d666ed7a0e78e60279dccf10af2106d943e535279db38b345d2ed2185e24755771550c2f06723b806b50462538e7c70bc13317ca34ccd1640c02f7a10c155ea5f9084def4b80ecdc340c95bd42869718182a9d8618649b18d6d5def35c390d3f66de3cd79cf9f305cde4313f4df854329acb634108192ddc346af4798ab0dd4158f59e4237fe229cf281fc78290873a93c369269b945bb9e25af6fd5ae3746ae6723d79b68d7950d5d0674b94c7be672f9cce1e0dcd1b3f1a79a8c2b64b82aa03394a7ee576bcf5d29af6f037182cf5d893c7795f65cb6f6dc55c873576bcf35d19ebb5a7b4e5def0bcef9fded6e1cb3ee95d78bdcf36c95be75cd2ffbc9e3b5ccebabae95c76be4f51de0dc498feca3e4fb6f67c97ccd8fd76972ae4b23e7c5143a8e64def254f937c5f67acd56ae776536e9e23ed764114bda393fde20c3efd4e4dda0c9dbe595d754c565b43c3e22c3ed96e7a334bdd4fd6aed3ef495f0be4a8367e4f523c0393ffe16795f37edbefebe31206de0fdb15ab8dfc9fb476ae747a5489b965a9c6f94cf1c0dce1d76cd6e4ec36e5c1a76ea7e54ec943c8c9dba8fb11baf85ab0b3b15d7dfb3a41f5436aa6cf26629e71810565de7c7fb98d7f6ef7365b450369fa5c9fb990c7f2c3887729fd5ee3f2b8fcf011d15eb3f806bcf816bfcf82b29670f38e77aa9f8297fabf4ba557befad9a5eca1e8e03e7d0dfa8f71dafbd4fc937f157b2fb8273e0639ba9774c08c8729281d564706daa3c4e01d794ec9bc0356803b25e54a0ec71a23cde02c2dfa4d9c62dcc6bb3d302b287f1509c613ca61be2a164df6688c7ed29e2f17310fe36105edd83f12896c76c4dfe1d5a3cee30c443d585d3c543c9bed3108fbb52c4e31720fc9d20bcba07e331431e9b68f2efd6e27177887828d9f718e2716f8a78fc1284bf078457f7603c8632af2faa00e74e1e6cfda216ee7ee62d7fef67de7ca8e4ecf2ca69a3da137aba3fa0f1d2ef3fa8dd7f501e1fd2f47848d3e36179ff044d7fbd8c3a0ee8a19e83f7376bcf2b5f5501ce79fcbed5c23daae9f7a83c76d3e4ecf2ca69fb9896f68ac3af350efafdc7b4fb4acee39a1e8f6b9c7e837052f755d97a1cd0433d07ef2b4e7a19f804f396814f68f29f6449bf6d7a5edd3f519ecf44c23da5bde729ed3d4f6bf154cfcd62c9bcf2b43cce663579ab9dca3775ad9bcf91c71734bb79411e9f67de3af5f36edcdacbfa6ffbd9f2fa5c797c5193f3621a392a9c49c779cc5b372f61de3cf212f3d64f5e9232ef95baa9f69c4a8b3f32afad9580eb50de2eafbc8eca9655fdf263e6adefcdd7f452f7abb5fb7dc17be17d95069f306ffdf21379fc3bf2be6eda7dfd7dcaefced5ee2fd0c2fd8379eb97ea3c48ddfc65e6ad9bbfecb2eba4ca538cddc234ecd4fda8d82979183b751f63b7480b571776fb83b8f0e31296cce32a3ea5e09aca5b4b594dbe1ff996bcb6581e5f01e15f91c765f2f827a9d349e09ca78deabf32e978803caabaa3d2f555e6f5e3afcae38186f71f04ae4d95c715e09a92fd1ab8a6def37a32ae852a3f2e97c73f83f0af81f0ea1e4c2fd5dfde5893ff86168f377cc643d583603c94ec370df1782b453cfe02c2bf09c2ab7b301e2be5315b93ffb6168fb743c443c97ec7108f7753c4e3af20fc3b20bcba07e371883c36d1e4bfa7c5e3bd10f150b2df37c4e38314f1f81b08ff3e08afeec17834d2e47ec8bce5fb87ccebb73e62def25d7f5edd57f58855dafdd5060e6b9271e9a6da9375ad07287dd478c1a7529f93c1b913a67b8f14b2d6caa3f2e59f316ff9fc999451eaeadc7daff6ee7f326ff9bc165c87f27679e5f5d823cf5519f31fe6f5f9ebc07528f7df32dc29dab9f2ddade4f15ff2faa9e09cbfb7420b57268feb65f8d3b4fb1bb4f7e8f737caeba7a760ac97bb4ab793985737e5473669712e4fda4caf53e5b14293ad6cf6734df6e7aeec9eaa6c3c54937d5852f6e036886c55ee7ea1c9fe42ca566363159aeccaa4ec7ecf69b2b174dfacbd1b4bff33d2a4ff975afa7fe9eada6b5fa4bfcaaf7a5ab564e6764ab93c7ec5bcfe49d9cfd72ce957be0661f9f11be6cdbfdfb872fb9d23cfb3b4777cc7bc3efc3b4deef7dafdefe5f15ba0836aa7fea031ffc17d77ef73dcf7f656751795f6ffd5d27e0bb80e74e47fc23c5f732ec71afaa9fca2d2e4474d8f1f258336f25c1f7752e9a0ca094c3ff55c5fed7eb5765fe59772edfed7daf3ffd3d25f3d3f46bbafcb5769fb95765fa5c34fcc5baffe49e3a6c7a74abbafe4a93a924a8784d716c4398857a201f3b6eb95fc6aedbe92bfcd1b2ed19079ebe501f368cdf3e9f2a81e2f35de792c3887f152e39e2a5edf6ad74ff786af49dfaf41fa72dfa7fc3be607543d230a1f22c7f4138d99d18724b2594dfe4d6483b0fca8c6670f07e78edc41aa0e93a5bda399c6af9926b7b9765f8e83279a021dd4b105f3e4dd841cefeeff8afbde012acfca3c9a68c58c3e24d14ad3b12df3fa10752e7dc820d5b72c9f4bb4d4f468291994ca708a771a1f524b3ff55c5fed7eb5765ff9904aef7dc5b4e6f9d65afaabe318edbe2e5fa56d634dbe4a8736cce343126d346e7a7caab4fbba0f51e9d04eb385769aadb467debca6e4576bf7751f22c3893955617c4807e43ee64354bcd4fc9763c1398c979a5f759cc6b993576eadf4557328a40fe9df07d81bb50f9173c1c42c3c930f01f3e8125d40587eeccabc3ea4ab2b77a89a9790a5bda3bbc6afbb26b787765fb66912dd800e32cf247a326fdeede9be3b47f67fe6a87249e5d1de9a4d6f01d7a18e6aeedd29dab9f42143d49c1ce5437a697af472f518a2c62d54bf6a3a1fa2eba79eebabddafd6ee2b1f7298f7be625af37c1f2dfdd5f363b4fbba7c95b69d35f92a1dfa32af0f51ef53dcf4f85469f7751fa2d2a1bf660bfd355b19c0bc3e44c9afd6eeeb3e44864b0c64e17cc840e43ee64354bc0669f11aa4c56bb0375e359c077be5d64adf2e207d793b6f3db0b7bafa10adef21a1e65f9c0cce797ebf24852cd567a0fcc97ecceb33f693325e74f51ed6c4fbee849a83b1d32b2f314493b7cb2b6f986a2baafc3554b3c775e03a943b8c79f3bf3af7d3e78ef95a15f7e1acf69c0ff5de11cce37f13c3c1757eccd5b8e5ba32f27f9472b23479f99a9de56b720bb4fb05f2980774ccd6641669cf1469320bbdb65b63374393324518c03d31523e5309ce9d780dffd61b5e8d7d63e147e400fde173bb98379f36d6e2344a8bd3282d4ec3bc7152f299b4a3c468cd3e557b4cf9b9315e5b488c01cff1e358cd7ec7baf1c92df686537e3e314e86df0bcef971bcbcbe55d36fbca6e799deeb225c53ef332a0e22aed087aab8f505e7d0cef5e70b433e3f2ae4f3c3423e3f3cd8f335ef3b3d4df813d2bcefd83a3e3f2ce4f3a3423e5f18f2f93ceff32a0fd694718a8f2ce386a9393661ca38e59b27b2643e9824af4d92722ac0b993370bbed4c24d641e1f9098e8d5273159b3b329e03a3f4e90f7cfd2e44ed0e49fe9c6bbb083574ecd7b3439ea7936599373b6761fc63de85cf583348e5398b79c9ae2322bbc4beaaefa070f94f7a77ad92979e23a94b7cb2bafa88f578e182b4a1507f5bee95a9a4e77e58ddca5859ba1a5a99ab7a558176b36b6025ce7c7695a9a2a3d8781fbe05cc49b873f079c43793335ae33a5de5bbde16bf49be5b53925a746ee6c4dff03c173503f3dbcece71da9ea7c2b0cf18236a8e4a44b9f543626c7cb132540867adf1c56bb4eb544de5373048e0161d5757e9ca7319de7ca187d8d9493a5c95bc0bcfe69812677a1765fce45482c023acabea5c4fec96b8945e01a3fce9772f68073aed73c29a3b1a6d762edbd8b35bd96306f1d463e27e62dc0f71dafbd6f972647f1cf4a3252f76aec6e0ef3f8e8518dc0b33cdce2107670a44c93313ec2aaf92e4785789f2ac7549fc89e64fcc75ce0e379d5ef05e68c88bf1d26633e0632f9f5a592dbb9e05c85e7d777789f1fdb22c5fbdbc930aaaeaad60a75062ca42dd4f89f9de09ed449d49d657c8796a6789f8aaff2256a3ef689c9e7c73ee1e379c56b19e0b5cc8dcbb82e4026bf7e80c6eb00101ef252cf4f48f17ec96bdc6acd76202f351edad7c04bcd0d08ca4bbd578e9b8efb527bffc92cb5ed76f6192e850e89e592975a9f792ab8ce8f07326f9bff4057e7f1d7683a9c924687a37d864bc56b2ff3e67fd517a2cace0a70eee83861801b7ec23c4d87d3d2e8a0e4ae9072cf07e7fc78b0bc7e0138e7cfc9f1eac44a79ff42ed3975fd22edfa21409f4ef2da2ae6ad17a9f26e7532acf85b85e5c735cc5b9ead71394c3a5193ad9e5bcbbce5861c7f4fac93d72f06e78e9c89db5c9e13655fe8a483b5e7547c54dfd925e01cde2f93f72f05e7fcb8415e97ebe012aa2fed728def4679dca471de00aef3a31a9bbd029c374aea5de317d3d883e25553c6ad669e326e829e6fd3d9572a1b57f53f556f3c1dc83a1b70907e66fc07e09dfc786688777bee6525c418e96c56c6d6b0ad2c970fec8ade35bfdb13a827d36f4c20c68cf92ffe3358bc769bd338dcea0830ec0eb054ec3db08d15b202e3ee005dc578a27afb74f17b8d13a25c08bd3251eb150fd67a0557aec2f95706b636a876aecf123b23f0cd0dca9d3b23d83ce7c89f5acdf29d8af00a4dca32e7b5156cbb7356eafcde2ae4ad76d4ae1d325d94f83608fa338b1d99ee2e0d95ce150574ab735e21345c227eef109a9609ed4b9c6bdbc49e119bd94636cd39ee126fab1df72ae76fd33b4b2532b38ee6cd1ab0ebee96102a998a9dd870ed73854dfe5f8aec8b1411532b78fee03f8d7245cdfdf45a29f17f0c5d27c32b22255246be4096f05c2b60b9a2fdb8b816c1e071ac1d43b37dbbbc47b1a294713193e1c9dd5dc42099c24da7b4d8b277f947576479a356c8724513b4479aa8a502cbe5e58891f12051c8ca6a94c715d5f1274cf8c5f0c5920ce277c3958b70c113a0b128fcbc0920a65a943a7fec72fe5738810f126a70b4fc451b9d7f5cd95ae993c785650bc4b50bd0746a62901b98208bf1bad27d62e3d8f640a93137a989451273aea8317549618cd8bb4475a981ac33a9ecf2fafca2d1e3f3c65e9b654e9766225deaf2362c651a9a52a659a6cd3fbdbf4f952ecd6be2954c17fe6366d802b1ed743a60041b990836df37b6cd75af9b6df3818fe11a4333bf56296d30950618c12c1341d14bb5348304173a1a1e2a6b897563d8da37c3368261d75ab1f3a30346b1b181621ea7d8d6a456534d2d31b9df2c381b13dc2ea4e02698e0f6210537351954cb4c67497e6f8b90b2c6091bdc9cf858dd50ddad99eda9239227d3ab8059533353da70849d8c5ae989d3114f9ce698e4ce6125b7c02477092bb9a5c9a0c4bcadccd7d1eb5646725fd3d97719d98da5aa62072d215b99e8716729ba3fe9e8d5ee3a527f4d739edde470d821fa03b63bcf9bba9a5213edeedbdbf71034fb30530758308d30c2ad4d96cfb1f7c4925d37fe6eb8f1b7c1b255afb0d9aaad49328f4b6f3f05400f5c703b4ce53e06951341546e6f92cc4b48dec35bab0d66449d8d4bef8049ef1785f48e98f4fe5148ef64cae5c2762a4973f952e79adb413b43dc2d17addc64bf5fb9d830b6aaa63e85855fe4e4bfdd62ebd975ceeff962a3d9ed429fd47e60806f3f3050f801dee343af33e6293a63396350d8ccdc05f3418323f0415d4dc2456b98d56efbfde4fcd412de0217de0dd37c3f83e60d026ade1d033e24ac2bea8131196a60b2c7a4760a263d31e1c30cc2cf0928bc17267cb841f8350185f736f92151d21c47ea87fc0e6ecd127b6e9779da7aeabd6e0f1dd7488d6e2c768e1b8416fc3ad722fda0586a7f35a2860fe8c51205e60ce67f888e3e167c9a7a3351c69bbd699ef0a676e98c79dd3e58c99b6f2a79b9b1ae92756dfefecde2d622e70d3c354b645910a46cee8b79b80283874b04f470fd4c194ed49336efd30cc78bcaeda291c2ffde2193b754bc3bd9851d262bf159cb3d0d259b28dd8c465b248cb6c087d146a13d668efd4de6c0ad6ea4c137e471dfc0e777371031182d62c01d35562929159f15e083ac1b04a7ca945518c5d25b79a9657f79b8fd0d30d99fa849ef4f6a7fc18702cd5634c6049da31e2b50e7a640add717eb5a5734daea38f1fa8eb518a61c9b43d268a0298d447b2493c30cd0f1074f27beeec55f457f02330f31a47b3f466f10567c4c34151fcce4bf53140e83b1dad824436decd406c16a633958c933d950f218354f51f2ec67b22ad10e2d27b5aa54d9d15b9908eaf9525be014df163835ad970eaf2b66ad43306b9d66523f80a10e3525b768d066729c088e81d76d9c68baef642c66e671223f3a60c9330ccb913322c891c34dc27912cd341472b9a2cba06eb1138b54e484233622bb7685a1185772844949eef0661b1cde730d8339bc5c8c408981401e2730274454f2b0a8cc3544a543a36051c93709e75d177c5674a8bea2024cf2fcb0920b31200b4c40b2820129c2842f3408ffb17130e12331e18b0cc2dfcd0e267c9449380fbfbf295f7635e74b3fa3d36241512365ccce8fc19e538cdc8e36e9d996c9054ba696091fd1755b26bc10c811abdeb152ccd40140db3619638a4f2be62e4cd39d2d9f8b13c4d98e3509e7e5275fd152ab5ac833ad09401f76a41383a39da3eb75cb9ca8f2bfb738bf79e4390ed706aa9c2b7c6c6a9be3e6b7388dbbe1b2a1c76792f571feab462a97982f246e10256aa578ce9d75c6d1f2fb05cefd71ceb1d039f60d540b188799f2729389702b3e309c4d8ec7301f64c2bc3a12cc7587d987ed741a7a6e35a78f1852dcecbca942cae5d36ed73bd7b689bbeef35b99fa1820af0855074c8e0998db5a61705b1fb408e6b6261a84e78aeefa4c8ebb4f7542714bdf5d87ba1e1fe1f657d75bc9cc63eea9df8ed5f226999285933bc4a4909e242bf124996c12cc0be4557e044fc0054f3109e6dd38abfd081e870b9e8a095ee3fc6faa099e6af2c129844fc3cc7fadc1fc6f6f19ccfca7639aaf33689e1d50f3624cf3f506cdb7b50aa6f90c4c789941f884d6c184cfc4846f3008bfa45d30e1b34cc27989cd978e856d1ecdc6846f8a40780926bc3c02e1734cc2b9b33ad44fee9c8a0b9e6b12cc6df9303f8253144cf3302ba93058c951ed8359c97c93701ebe922195103e1612a212b200c3c477a3ab5509e1a183564278e969637d6f21867a2b86faf070a81761a8ab4ca8d746863a3e75befd4d8478d6aa3664ad733a05cb5a8b3137b62d0237b60413be3d02e1a5988fdc11d2472ec52c7267481fb90cc3b1cb80c338ad26058e03302bd96d72c09d8359c9729370aecc117e90a4a8df1e88093e32a4e08330d64745607a2b4cc2794df1683f5aa7a8251e8c25e23186442cee122c115762c28f35086fd13598f04330e17b0cc25f09287c1526fc3883f06bba0513be1ab394e323b0943598f0132210be16137e6204c2d7998473e776123394cbbc273168b9bc8dc1a591c12a3fc14ad0f5585c4e36c585dfe8e3796b90779561ef3ac5f42eee345639fff29cffeb6a8d11f23b7c4f842a413688161b302d4e3569d10e685129eb286b04fbba6bb011d3e0349306cd8006ab9cb2ac4af410072b5e37615ee274930bea11cc4b946379ed8c08f2daa198e67b0d9ae7f50ca6f96198e66746a07905a6f95906cdf706d4bc12d3fcec0834df8cd9e73926fbe483732ba42f5be9f88615d20f8d936d03f7da72711cce2639bf67009fb54e08aa70fee21387b63ad73609ffb24b748e9689abeb03fab42d98fee79af4e7bdea498da63937aa856755711a27e3b3d2d03feefa6cbd9d53294254cb8163b7c5e4c6af9ab91dbdbbc59341e2b4d514276e20e7d5dcd01a9f7cc7a7c6d9ccfd19e1fe046b7f1e8e19d90506236b14d0c8aa30e1171a846705145e8d09bfc820bc7140e1db30f3bad8645e037c650fb7f99ceb1c8be43537ab1cc946cab0a39c631083d98e19cc2598c15c1ada607660efbc0c7be7e5a1dfb9134bea2b22f084bb4cc2f918c3952cdc18c36e8cd45518a9ab39a92c482a18a723304ed744c0e94893705ed65dcb6a97755f8e0e56d61d6512cee7685cc742ced1381a937c7d58c9c71824e78a1538ab5926a6a22f61c56c6e4d6136425e5fe4485c230a9f2a3655bc213975dbfb44eab1c41b4cd66f1c4bbc91f1b1c4018c45a61936ce782c66823f3398e0ae31c14c708f49384fce9bfcf8811b71c1c7615adf6cd07ad3d8605a1f8f697d4b48ad4fc0b4bed5a0f5cd01b53e11d3fab6905a9f84697dbb41eb4bc605d3fa64cc95fc3cac2b3905937c4758c9a762a4ef0c49fa344ce5bbc2aa7c3aa6f22f42aa7c86c9618b858d99dd7dcb6d337039c1a778dced68dadb54921b5df33d0cdb5a2bb50e9803de8b65af7b0dd9ebcbf1c1b2d7999845fd32ac459d8559d47d212dea6c93606e51f763c9a40bbf07177e0e06fb01036c3e552608ec7331d80f86857d1e26f9a1b092cf3749e60d8b87fd24638a76d40526c17c2ced113f82538ca55d88b1f85558161761921f0d2bf9628cf2af4352bec42498537e2c24e54b4d8279b3e77116bed9731926fc371108bf1c4bc5df864dc52b0c9273c53a7bde216ac36aa574db4d045fb1f484c98e8ce5e293cccf62c7f0fa62e5e895a674e7c5f4537eb2428a251a5761829f0e29f86a4cf03321055f836581df85cd02d762927f1f56f27598e467c34abe1e93fc5c58c937607eec0f11f8b11b31b59f0fabf6cf4c92b91f7bc18fdd3d890bbec9249857985ef423384527dccd18e89722007d0b86e38f2171dc8ae5ef9743e6efdb30ceaf84e47c3bc6f94f1170fe3986e3d59038eec004bf1652f09d18e7d74372be0be3fce70838ff02c3f146481c776382df0c29f81e8cf35b2139df8b71fe4b049c7f89e1783b248efb4c82b9e77f8785f4fcf7633cde8d80c703188fbf86e4f12026f8bd90821fc270bc1f018e8731e11f4420fc119370de4efc9b1f24291a94bfc26cefc3b0b6f728c6e3a30878fc1a33918f439ac86398e04f420a7e1cc3f1f70870fc0613fe8f0884ff16b3bd4f43dade1398d69f45a0f59398f07f4620fc294cf8bf2210fe3426fcf308843f63109e2bb6f7e333c832dfa711c50aefd43d1a5ff8b1d2a538b1df61e6ffef90e6ff7b2c9dff13413a3f6b12ce3b0abff4a3758a8ec2e74c0624b670dcb04f0c88ce70be32913276857dcd785718df4687424bac03ec0fa624e629f18d9f24fe1a4fe2e74d82799de05b16b24ef00226f9bbb0925fc4247f1f56f24b98e41fc24afe23e6007e8cc001bc8ca9fddfb06abf82a9fdbf08d4fe13a6f64f61d57ed5249977fbf00dd8c274fbbc6612ec7eda205c6bf6750c74834478d07fc670340c89e30d93605e836ee447708a1af49b18e7ac909cdfc238378e80f35f301cd92171bc8d096e1252f03b18e7a62139bf8b716e1601e7bf62389a87c4f11e26b84548c1ef639c5b86e4fc01c6b955049cff86e1681d12c78798d66d22d0fa234c78db08847f6c12ce2bfeedfc2049d142f8c4249837d6dafb119ca24df3774ce30e2135fe0726b86348c19f9a048bcf1b2542d60b3ec324770e2bf99f98d17589c0e8fe85a9dd35acda9f6392bb8595fc0526b97b58c9ffc6ecae4748bbfb0f26b86748c15f622c7a8565f1156676bd2330bbaf31e17d2210fe0dc6a46f5826df9a24f30f17f5f3938c293e5cf49d4930af46f70f598dfede249877e00cf023384507ce0f18e4816121ff88491e1456f27fb15c3838642efc1f66ce391198f34f26e1bcf8de2f64f1cd5bac461c4342e2489804bb9ff90b57b96b80693c2ca4c60d31c1c3430a6e84a11811124516a6716e488d1b9b04735bce8bc096b331e1f911086f6212ce1d474158c7d1d42499fbfdc2907ebf994930f7fb4521fd7e739360eef74786f4fb2d30c8a3c2426e89491e1d56722b2caf8c0999575a63e63c3602736e6312cefdfeb8907ebf2d86637c481ced30673721a4b36b8f693c31a4c61d30c193420aee88a1981c1245274ce3292135ee8cd9f2d4086cb90b267c5a04c2bb628e637a58c7d10df3fbc521fd7e77ccefcf08e9f77b607e7f6648bfdf13833c2b2ce45e98e4d96125f7c6f24a49c8bcd20733e7391198735fccefcf0de9f7fb6138e685c4d11f7376f3433abb0198c60b426a3c1013bc30a4e041188a4521510cc634de3fa4c63958f65b1c36fbed87495e1256f2102cff954690ff8662a49786243d0c13bc2ca4e0e1188e0322c0310213be3c02e1b998891c18d644f2b0a2fba09045773e5674af085974176045f7c1218bee42ccee5686b4bb22ccd91d12d2d98dc4cc625558b31885a9bc3aa4caa3b16cb226826c320613be3602e16331d8ebc2c21e87a9bd3e02b5c79b84f371ef323f299962dc7b8249305764831fc12976029e88e1d818018e49582a6e0a9b8a9331b5cb23507b0aa6f6a161d59e8aa97d58046a4fc36ca422a48d4cc7785486e5518cf1d81c018f1998f02d11089f8931d91a96c92c4cedc323507b3626bc2a02e12598f0ea0884cfc1846f8b40f85c4cf8f60884cfc34c65475853998f49de1956f202ac42b92b6485722156a1dc1db242b9c824984f193fc28fe01453c6f7c7041f1952f062acda7754c86adf12ac6e7d74c8ba7529666fc784b5b7a598e463c34a5e8649de1356f20198e4e3c24a5e6e92cc37a43ade4f02de880b3e1053f984b02a1f84493e31ace41506c9b97d9cd304df443df3ab72963177ad0b5fcd5218f1ba9c93127c92ba17566e5f1e57febd691a8d384af02bcbbc0ee8e4049f3842a705b612e860935df19e905312e1b7505b89093f3502e187988473c4a7191239afaf2711644ae86fe38980bc6d155683393d821acc6a4cf81911085f83798ebd613dc75a93e7e8c773d3bedbe48a6f745f2e3682af4a994716b14d423ffebeea001ee44c3f25c4589cd93a2c35ce0a9b1aebb1fc7036457e28c3de760ec5db36608ee4dc081cc9464cf8791108df84093f3f02e1e598315d10d6980ec5aab817260c1bf0ef15a77c23e9a54e36e259d6cdde95e2ef1291f17986dce03ce266ef929a90c9ef422c16055c9993257788d023c4d7589688bbeb1d89db4576e47293cf143b47b5adf57a36537e2986bfc17d3699855d77e2eebbeabde3ea57e8c470558a5870f7b19df19d5a936f2f15ee4cc9f44a5de63c551ef00b148761d42f32511fc6b0ca42edddf35c96b39cb36d86bb2ead52f0f9e1205a57605a5f6cd27a5c8dad78371d5f2a0a870a119b72590470ad4a9cbfdcc7394d9d325c1caddfe385c616e1d2f9b74382c4a8128bd125a618cdd40a3b68696e1cb638b457093b2b63873b0fad91f1dc1dc04abd77a28ae9662ca6979a623a31454c93b693ccb7b5d304e635bfb1ab4b4eda82c5eb3253bc4669f14a6aa9c74a55c053c50bbb53b7dcb5158bc9e5a6988cd16202f347f8b898a50589cde1586cae30c5662a9a2e305fcd63ee37c34ae55782fcda1c1ecfbae7a72a2c7e579ae2373b8007af5bea05971e24b6d5586caff2e33d52d96630ef91aa14a88bf7d886c5eb6a3f792e95570c9ee7ccd282c4663b169b6b4cb199ec2bcf4d7588ae9765f59648f25cf24e90b8edc0e276ad296e93b4b879f3398c1fcf37fcbb83bbd902c6bf47b6068da95746749e642716b3eb4c311ba8c54cb7bb8d323fcd13f97d23e3df808b260576617a5e6fd273ae2feb9a259adaee57acab6afcfa42e7ef1935f5a77de9e5776371bec114677c731fe8b7bce9b459b663527983201a1f81697ca349e309815b164aef8dacf69e5c783964dac12b48ac8ec462f53353aca6a7ada7cf14beb952589eff9ab9b91c8b2ae58ec2e27893298e23d194e32de5b54e2015d779e29bf03384bea61229ea32f5682c1e379be2511cc24fec4bcf700c16cb5b4cb1ccf3ddee9895b63e14852f3f16d3fe5693f60501ea7341f5afab47d883c5e036530c9604f0ccaec5cd30b4dfd34bf017262a1b3c0e6370bb9f544c557b0d9a8a75f579c76331f8b91f5f81f5bf98d26e5ff6bd9c80c5f20e532ca7f9f2884b9cc06b85b66b8455eddbdaf989580cef34c570bc6f6f18ac7588c7aa2ee5d849589ceeaa7b0f463acbcc6409763216bf5ff8c97b41fc265edba0efe13d058be5dd7e5a2d143547ffb1aeab573d158bf33d98e5062b1b4b44cba0420ca996b354f57e9a343d0d8bdfbda6f89531da31ab6d6c91a8596f946352cb447f42b9f37bad885d5dad24bc073b1de3f44b13a7a5c49cf0b1bdd484c2733803e3709f89c3f27dec03a8bdc35e8cc6fd261a337c956bf3c5940a5e0b517e01ef47cb549de44c2c9e0ff8e933d06b22d3454c6b9767b01fc0cff568eb286761717cd04f1da5761c93ad6cae270fc77df33a83172b75fede2aaefb8b5ddd7ab4cfc6e2f710d69b952a7eaeb74e3ee0bf6e126daa9d83c5ea6153ac56446c9958fe0b1a3e5a26e7624c1e313129ac29abbc730bb00fa07bfb2ecb9db0bc576c9db17fb9eef592f3b038fc0a1ba330c56181d072a728630ef3943bc9be7da53b8c290f11844990989d8fc5ec516c9c2c78eacc9275a92dac5a1b6f32d72dbdd36483c4e6022c36bf36c52607ad1f7b35f0a691a9d721f92de820da5e8869fb98bfbeefe45b838cebc1e752dd89268e1761717c3c7c8a54479e221763dafe06ebfbc5c758e03456af059589b121b70d517b3e54ddbdd42598f6bf35693f27a0f6d39d2b5b04f36a999bcb6beaf87ed28c22bf5f8ac5f809538c0f09645de97ae3fcc5795f91b90c23f32456ea06f784d5ec70e7ea7c47cc46f9ec76613151e5c6cbb1383c156c2ee57c51f3dde4b46fbdfacf7052b85acc584ce72783687d05a6f5d3fe7abecd5e3ddd0ca9ba79753fbe26dbf997483477fe9c21f23b9f5191ccfdd52cb7bf734bf842b71630a2a6ef6084a79f21799d6b50e9e42afee6d21a4fc827eca796f08c03b07103e6fe0c4e70f8db6463c5f0f921e5c5ca40bead16df9c2a135651255ab3231cb2e5e229b534215d2c4cfd2523408f098c5dfa38a9a50a7c56f23a91cbb8df5deb5850b68c9192e5901ec049d7b798fe8ea76a7b99aa0d720732b994ab2ed6945e8bdff3b73534db50e75a64614f8c497757c002390722d1d6395905b06d9655f92d426489744e69dfaa7f2e4a7feb702140b5d3d38a5b0a1a7426715d85a9b9d5c62ae9667e7410656735c8e3a9f12c25b21e02d92a96277eebe8963a6f592ffb2d660b1fb59eb98b8daa9dc8c4016493c14990cfd909323f1620f7f44a82fc0325c8d61e90bc46c155d8287d274716075ccfb44be27a9edee7295cb00b802b7d1073a799c50159def824b2172891f1c24ed541f5c2a15c8eb01ec178db300ed8f6344a627b91125b476169dc9ea095950a111b05d02a59458d4b269d372689ee254a748d053ab7d7bf2a265590b74627e1fc91124e3b01c7dcf51a371f76fbb824b49729a17546dd7e9c33e45e90215fa1c4d7c937be5db169333c323609ef4f7656750b6301f2897e4990af525775554524be159009a002f21a25aee6c2ee6688de95ede2f5716ad2f31e3a85e9754a4c2d3dd9934f1b8a5be369587612d59f2951b5f264c06ae1fc794f9b1a1d8e03ac26a0cc7c83125657b4ccd48796e3566b7b0bb43cdfa444d8bf4e08bd5592f858e663939258dfa2c4da81f96999c6a7267794a8c9656769c2f55d32ea3ef2108c363e46c22b301cec5671759ba8b2686326839c20d669fe1738e69193a26291e3734c21c7475d2e2740c7534e9a523cc74737694ea83ee9304f17867abac0795aef30c9495b54e704ec9fcaa943133a2790a7c909dccaccf1dd1792e3b3df37a78ea5764e8445557200db3cf09cc75ff5f6ffe763cb797c6cf91d0e81ef1bc67fdc72f35dca72b3974c63772ac16656814e84a9bd687d151ba5ebd3a3963ede2d0b559969d2aca9a7549dea27b2752959f9c7425495e4af9468bb18d0e2333f56f1cf8dd0e1ec4885f30596c4f99e4d380b6289f34b80f37d9b7016c612670ec8ec1fd884b3289638e7039c7fcb04ce8d2850a83ef79d8445510b2a9c0780ccfea14d380b6289f33880f3a34c0c1d6130bd9639920e65372a947f04283fb60565612c51ce063ef3135b5016c412651f80f2eff4f35c56b1d18c2f15514ba94b441f4599d352e7f7b68a7e09fe40fc401e06b2f73f32314e8c173cd8be5fb5a6444687b50d15d67100eba7d4a3c6aa67865be146fe6d85ccd8e4042a78bb00bccf28e1b501f0caeb4d963e08e0fbe7be2c66a038d26c9c4d85f26280f25fd463cfab0424371b5765ca0a5752a13b10a0fb9c7ebc6f9508e26ea6806da1406881e3a8304e0518bfc88405e6d51b0b9c04d0fd7bdffa415794bbe82f8f0ee53d54280f06d5edff642233e77baadbea76862c92ac38990b2cf2cb7d5bd986023354d92ea6c29a0bb07e95898c8e1535de0a0f614627b3d03e00e5d79428fb3138a21c74649987e52ad79ac113839ef3d300e26f2811f341f64d9ee914534503b1d65acd18b4a79b0068dfee0b6871ec84c806d0becb447113b4b021ed7b242b6e8a4065e87b1bb1920e3490617d1b58eb0f360dd0928e289215332f039c3fda84937444910ce78f00e77f6dc259184b9c23810ffd9f4d388b62897319c0f9932d238bf994354db2def3274146670d2c4159184b94538155266c4159104b94ff0456d9801265dd87698b62d842da0ab036dc9716eaed391a1bc39ea3ff02948d2851f24963de163a9f8feed220c3d68a0a5b23802d8b129b5a22922fbaced630be2b2dff4a4086fad4c98626ce06001b53026c2aa4c1152d8635f931a82b7606c0b22981a925557ea79a127a3db289a61300cc2636c11c1343982301cca636c124ec4e23830977986866134cc27a2219cc110066739b608e8e21cc2200b3854d30e3b8d2a110c06c69134cc2013332983d01cc5636c1249c4a4006b30780d9da269884cbedc8600e0630dbd80493b0338d0c662f00b36d266062f385f4c107c26c4ed69cec0e60b6b3092661014406f36800b33d254cff93a6093338d9a4e9e90063074a8cbc637a2b98b396dc1d26f9d9cdf875e5b607f83a52e25383b3792cf91d18ae6eed2d90e23ce12f1fe0ec448953edee53e104aa60de254df8206dfc06c34ac0b86267db801296e164405f0116da8512289fc6e91dbba98ee1a86116c0d5951297da92c93b497aa6b443ef5669250cae5f24f6956496b818a0ed968901597f53f9093b80c94af1450065f7cc0ec856637b31c7a0b46e01b0f5c844e686ed6cfffbad1176624ca542fb3d40db3313f54aff7d9571ec139a0970f6b20927e97e6b64382b00cede9438bbfbcef8de2fa51342fd9a0aeafea0aadec746a884dd1b64501701a87d6d844ad8a82483fa0790fdfbd90895b0614906f53900b53f2554b59c54b5d4f9efe4f7b1fd7ef99910f1c90922c4eb81331860cf1456c2b174b216d3df81b50edc9743195e94a4eb28c8606e013007d90493b01a4506731b8039d8269871dce3602380996313cc38ee90b519c0dc8f12a6da887114ab9f1b31560290432841c21d0395d40cc1231bf09d02e00dcd84158eaca756580e400ecbc43a335561e7d5f19d60254ffd1a602b0695f4e19458fbb0da9574f7bb244b58319bcba63901ab45cb875f83dbed4c753428a7c57b2315dee500ef084abcea3b4cfcc51b045c25bb9c722d5016153806b27b2e75a1c33f62b48e6d627c3ec774e67eb3a75cf84dd261e08154f03a01787994f0d4d68c66ab2344d78c0a5d03802e9f121df7e87e3f0206c3c4cf071e03901664a2e4f6d30fe4ddec89b01ba3980a6b4750b414da8895b477880ceb63c05a8bf6e53c8ff8afb3e80a508eb477c202215ab2090b1700b4a33231c28e65feda73dbe338bbfd5700e7689b7016c412e7e700e7189b7016c612674f50d28fb50967512c71ce0438c7d98473642c71ae0338c7db34d92b3f960bfae701df39c1269c05b1c47924c039d1969ddef229774720eb2a7e0ba09c640bcac258a25c057ce6645b5016c412e50880728a9dfb0f12ceeb205b49b41064f6a999c00a575aba1f58d8560f575c1600acd3ec991317c79947bf0528a76762b20cdf9fd0bb9aa8fe8caeaf01308bf7ad5dbaa2dc2f52117620936dfbb80114483332b16f66a1b0bde40851866c916cbce874608b332901f664fad4ec54ddc6705098b4d3782c15d8b5c03267d9b384358e7388c7021b9d9d89c207568f923b78c05949f15d5add05c02cc9e4ae09eb7c4cea8ae39eec9d41469f631b50c2ba2619d08900e85cdb80c671dae15720cbcfb30d681c779e690c2c747ea61709fae90489e3b7fdee0456bac046a871ec59ba07405d682354427f4a06f5260075918d50e3f895cadb00d4fd6d844ab894950cea3b00ea621ba1120e8290417d1f405d6223d4387e82e93500b5d446a8847b7f91417d13405d6a2354c2cf9390411d0f2affcb6c9ad1944ff9e91cb241bacf808d1e6013ce8258e26c09ac73b94d380b6389730ac079a04d388b6289f32080f3a04c2fa3a9bf9bff1c02b0aec8c40089bf890ea49ff8261b6d5a02601e6c134cc26a3d19cca100e64a9b60c6712bdf6100e62136c18ce3a0f2400073954d30e3383d6c3080b9da269871dc98aa1f80b9c6269871dc986a0080b9d6c685dba413c18ba9b02e0658d7d9889574d50719d6f75812eb7a4aacbd0d58cdeda359f2918c6d42bd940a6e1b60b36536c325ac4e91c1fd0958ee069be112166264703f017037da0c97b0ba4506f719007793cd7009dbff6470fb029f5b6eefae2484bd0153a9d0f600680fa5deed2eb9c965b1735cebb0d8c8e6398f6ca403d7830a5c2b90e10fb3a94f9f740d3d599ffe8b0067854d38497b4cc9707e037056da84b3309638f7035e72b34d388b6289b314e0dc42897318337df310eecde8ae5b76572cf3b29c47e62059aa7bf776543d58f15dc97c26700a5b29b1f70f518d82dd2f8483d34f52415e006cfbf03840269c3d4506391f40ae8a0364c2fe0232c83f03eea23a0e9009fb0dc8205f01206f8b0364c23e5b32c8af02c8dbe30099b0ef960cf22d00f28e384026ecae2183fc1d80bc330e90099b276490ff0c20ef8a0364c2414a32c8dd41156e771c2013ce422483dc0c403ec2964deb483b28c9566b3f0d9cc291b6a024ed4d2343390b58e551b6a024ede72543d91aa03cdacead14e3b8e27507c8ecc764a270527b5df0c0fcf1ad8c0f28ba1fd65aea28c68b24759ce63cc837b5db21ba2cb7b32ada5619d9085a1eb0dd63e30099b0554606b91b80bc270e90097bcac8203705908f8b0364c29e3232c8df029f7cbc2db506d2d5b264b5860f00ca136c4149ba52960ce51890f54fdc971b34666c0add042a940381559e4489b29d44c9adcebb3b7086f661259bcd550a109e6ccf5ed5715c3f733e40790af5d74c2b9cdbebc48ee9706ec2420176770c671ab403f04ecd4456aebdd177dcb3f21c80f0344a841dd2142c2aa6a4d998ec63ee0300c6d3edd9259db09543b64bfa4a50d53983fefbcedc1a37303eff6abb5021b98532e1478ac93c621b60877bf76d471d1498a1e913c554588703ac675262ed28b11639ff93d3d84b587df99ac45a00f22c7b369a271cd924ab39ae0728cfced446f3f5f52b27b301cc73286136714ecae5b070b11c028e5f31d30ce03a37132ba5544f6499f10307585f4f1cf73fbf14a03dcfc6c5eaa423986425f82050ab3cdf46aca4d315c8b0fe0558eb059974047cfa4c353ac5a63eec93b60258ec85367dee95f443ee649f7b2d06967a914d3849b7aa21c3b909e0bc3813df32e3b54fee2bd73b81b68bac9f911a275937c71900e02536adf523dd8c86ac46fa2780f3529b70926e994486b309287c2eb30927e9579dc9708e05382fb70967512c711e00705e41897330abdd8be49dfee24ee6ae147ff31ae8762132d9895c2aa8656084b2880a763fe059afb4651607691d94ac6dff044079952d280b63897232700157db8292b42a4f86f2236095d7d839b93b8edf33d90eb05e6bcf2419c275f864431dff0128afa31e12568dcd32514daacc5443936cbedb6400effa4c646fd545c7916dacb95ddf266e158202e8064aac7d0dd9dbdd1a864f58d8cce6883ae7d6947d4c8480c97a981a02bbbdd19ea1e2387ed8600140f9339bfa3e49e7b59359e62100e74d36e1249ddb4e86732fc079b3bddb6e122ecb229bddf92c407b8b9da39e84164b36ea990065ffad99980e56584fa783ad06f6799b4d9e349f32bb9379d21900e7ed36e124fdea0e19ce4301ce9f67e28ba4c9594edc43ba42ea5bbbe9df00ea1d99f09d0a6a79caeee4f8f9cedf039077da02328e33ee2e0320efb20524e14e0b6420b341b5e817b680242c78c8407e0d2cf26e5b4012f6c193811c0e2cf21e5b40c67103a02e00e4bdb68024dcf2870ce41c00f297f68c0ac5f10ba31f032f795f26aae7413b37e2d8b5f100807abf8d5009c72fc9a0fe12407dc046a884b54d32a8b702a80fda0895b0e64906f56a00f5211ba112b6d4c9a05e05a03e6c23d4382ec9be12407dc446a871fca4ebdd00eaaf6c844a58e52783fa0b00f5511ba11256fec9a0de01a0feda46a8715ccdf97300f5314aa8dd58ba0f6671e5d507b2e2fc31ac5300d2c733d1dec787e4e2de4f7f0440f91b7bf65822cce8648b0f37815ea8df52a2ecea9cf04c0cb3b6f77b7733d82ec627e0c01064406fa4027a3cb0cd27a877a2f36ec2b2d491bcdeb9c205ce63ee2c918a1866ef9600e19399287c5417332f6276cab2db9bd133d4f05c4985741ac8e64fd9338596b05f94acb37903b0cea76d9c4947baf688acc6d90e58e8333662255d684886f5d7c05a7f67ef945ac22e12b229b50b81c5fedea6a5dca45316c9da47cf034b7dd6269ca45316c9707e01703e6713cec258e2ec0532fb1f6cc259144b9cf300cee76dc239329638cb01ce176c9aee4dba8510d974ef8381ef7cd1269ca45b0891e13c01e07cc9961d1af2633969ec7580f28fb6a02c8c25cab9c067be6c0bca8258a21c0250be928921387794681e337dc4a4be8c179d0cb2fa9f32b1d5057ff106619d4af66619247e9d740900ef554a787cd398adc0fae6899a24ef794feefc153f7c1d00bed7ecdc088870dc926c23a05100ebeb99d82a951729d03a33b44a986c70ed5400f0cf9900985fcf009e0800be9189d51bfeaae2f1abf2dc0c40be690bc838cee5b801807ccb1690715c73791700f9175b40c671cde5ed00e4dbb6808ce39acbfb01c8776c0119c73597f70290efda0292b027920ce4c300e45f6d0119c71e9f8700c8f76c0119c7cf793f0e40be6f0b48c2959564201f05203fb0673935610588acf7e71180f26f99686517d5b356f65900e08799183ff4ae9e709599c1dc5d8bd5142bf29e70b2c9ab1301ce8fec99ee4fd848249beebf118cd47c4c89b2a744b98d6d726ee3df672b15999ccf14de208455d276638ca602db1fd8e827d45f4f87beb254eeaecdb3f632f177b9f37badb0d1f8153d1d01c6bf67ea53b62ebc558ebad5d21ed7b1c36a4af0f88e201e0560fec39e49ff84ddbd64763908a0fc34d3b3d3fd7dd992102bd9972dcb4071f45926b2bbbf4a7b7e2cbf8dd109c0fca74d30e3b8caa73780f92f9b6012f61691c16c0f607e6e134cc23e4cbab91900e61736c18ce3f7305a0198ffb609661cb7e16b0b60fec7269871ec846b08607e69134cc26e0f32985900e65736c18ce3beed0cc0fcda2698716c58360030bfb171d933e98cf4622aaca300d66f6dc44a5a9127c3fa5796c4fa9dbdabc9096ba253a9d0360716fbbd4d2b2249eba2647d9f2f014bfdc1269c05b1c4f903c0f9a34d380b6389331764f6ffda84b328963897029cffb365291f694b896c1acd5320a3ff640bcac258a29c01ac927fc3d60a9405b144f93f6095094a94ed587258d8bbb95e86e62491d52ff703081b5022acfb923ec2de78b2257dbb01d686b66472d2f14bb24cfe2e40d9c8169485b144b91a143d59b6a02c8825cad10065634a946a823647551fbff05b02b277762640e6d75390b300c826990039b69e825c024036cd8497f4373f2e8e333cd60194cd285106df808c70888d6cc7ac690067739b7016c612e73900670b9b7016c412e72a80b325254e1e033eb2532d8b1d3efa532c477ae2d74bd91c606b654ba59cd43f9295dcbf01285bdb8292d43792a11c07da376d6c4149ea17c9507e08acb2edbe44e9ad4fc67192eb3f00ca7694283bb064876fb28da36e67a88543867108c0d89e12a39aaf916eb9df2cf900ec02265df0b7940aed6880b603255aef9e97eab85808db22771aac2f2b7d9703a81d29a1b60650ddf593d599caecc554f08602789de82d32b9bf259f82b55ddade6102e334cf1aca99ce917f896a7d0ccbf4d6006a674aa8ad84b4e45ade69ceef4d622bd172f11019ba1e54e8da02745d3231e2187c6a6b1cbf76de1f54d8bbda889574e20b19d63780b576b3a98f88743097ac8f6825c0d9dd269ca4a39064384f02387b64a23de41d85ac2feda1a50063cf4cb487ea367f9d70210bd9fca24b00da5e99c8f0fee7af13362fc93a8bef03387bdb8493b46b8e0ce7bf00ce3e36e124ed3426c3d915d441fbda84b3289638a7039cfd6cc239329638d7009cfded6c2111d641c95a487f033e74804d557ad2156a6455fafd01ce8136e1245da14686f3588073502666c56193b9bc9619bf1ecfbe00e4605b40c67138b81b0099630bc838aefe190340ee670bc8387ed962180039c4169071fcb2c5e100e4505b40c6f1cb16cb00c861b6808ce3972daa01c8e1b6808ce3972daa00c81176ae93242c7ac8d649ce07587329b1a6db344aefe2206c899375705c0f60e6d9049370a7573298370298f936c18c63d7dbb90066814d30095be26430cf03300b6d8249580091c1bc10c02cb20926618b9c0ce64500e6489b6012b681c8605e0e608eb209661cb782ba06c01c6d134cc2b61019cc6b01cc3136c1246ca193c1bc0ec01c6bcfeaa038eedafe3b80725c269609f0ad2494d40ccd811b47056f0580373e133d45dea5555ce1fab17d440e00398112643709b2c209c433339f28b853f60879b336ec25226c3e92adff9900666e4ccc846d8ea9a7b6b913d8e6244a90ea139e79ac7e7dc2730f0038d99ebd61e2f8f185f100e5144a94b5bf39b9cca131dd517abd80ab8edea555db85b5127a4bb20556bd01d8a9f6d8681cbf9d5606504ea344d9d239f16e2c9a5c47591dc3719dc600dc749ba6ae92ceb1246b247e0a7016db849374d91419ce16a03e39c3269ca4db8a92e19c0470ceb40967512c711e0870cea2c4c94f7860befa2c7e989a029f38dbc6e9fca44ba28aa9b03602d657622356d2857b64581f14d69a9da5099f594bf874e1c1b80f5b27f477abd623d82c511b2c1348d639e7f3445b661b5bed0059e1fc0b96162b9d7fa6eb09d1b73983ed625bc5552e6fbd905de9dce59a55b33cfed5eb39dc341a4bd3c8114fb9cd800d8e9c8da2f554e6a9c3e624d26d65e14aa970fe5ee75cad608b40bfc1426120bb9d30bcca0a7b146608f9de1a73ed50f34499b0c3a3538e58d50c439502ed9689bfcb9ddf6b456af0c44b887e0d4e63b3a3e37c116e8dc3678d3896d684cd1dec044b8c727eb92dcd11356dcc1172616fa53c53d7d3cbe4a9955ada5c9e2409736ead88ccced2c5a8a4263d3688dd5eca84d492b4314d1f3fdc665ba448955cde1f5bafe33f8fa7bb4c7661a69d137c4fc9a54ecabbc2f9be5a55a207b34a84c9fa7fb82edcf421120300 serializedProgramBytesString: - serializedSignature: 6d9c493e68d627b5e4cfcb04af8996e3ddc27682aa8fb4e46bcf3930ae324cb158bce12cd65fb889f1f4d95ebb7e1b539df5979d27ac5bda4d40bcbc1cfc9f03 + serializedSignature: d44ec7b3a90ffb7df476dabeb84c8f5c86d7b888c4f9a26126f6bf2d8604a31be8acb06f59ba15ef89d2bf2d917121bc37f3f289027d35e45ed743ad2bb3c00e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset b/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset index 7167e63..3021522 100644 --- a/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset +++ b/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d07781cc7759e230982007befe49122454824019000ab288a24085260170a29b18804d108114d0058a0debb254b965c645beebd48969b1ca728dd49e4c44994ee244ee214274a6f4ee2c499f776f6eeeddcbcbdddbb9bc32e6ddc879bdbddd937effdefcdcc9bb733b363aa84fc4bac915f4745a3a81395a245b48b7ed1277fd5c9b4577e9c23f7fc113128d32ef9dd2aafad11c92c77c2dfaac43cf9dd208f86c4b0bcf382689369375e6f121df27783bcb7431ec1d94ef9df217325c6c99b5ac46e71581c127313b3b390388a370da97309902b31417eef1223f26a0732058554e1a5b9f2ab495e19c26bbd926937df09710ac5ea95d7dae43d83a247d23c8b14273c3553e00fe12453553a56a57be4ff78f9ff14399652241e53c7d355ba57fe9769f7ce52e93445e36ddaf5d9e45ed3f5392a9dc15c9fabd299ccf579eafcd3ea78814a6ff4e1757e165e6fccc2ebc22cbc2e0ac8eb62952e55e912c573893cfc863a37469d9ba07e53fd2555da40645d42ce41ba4f95f90c3996ba1d534bf4965079ca7cca5ca6d2032aefdbc931a5b35c5d7f56bb3e5fa55769d79768f956a874bfcaf71c3986f4a03aff0e75bc929c87f490bafebc76fc824667bc4667bc4a27a8dfefd4ce9731e7cb353c5c1c4a099eeeb94672ae51a37358fd7e1739967a9a40f1a0f735abfcefd6f4d3a2f1d3a2f170b586bf7bddd5cf2aed7ab396af42a5d7a8b449e57f0f39a6f48e697cbae76fd6f8bc59e3f35a8d8f635a3eb7fca3c26b2747353ac7b5f2932a3d4174715ca5abc93548d7a8f416959e54b45e24c7524725af68f94ea97cef25c790deaacebf4fa46dcdb5157afdfd02db8092d79cb4f4079a6c3709afeddea4d9c06975fd25722cf91cff5d8d8eab8b7606a34e8251bb8651a78651874adb348cda54d96f6af9ba348cba547a46c3c82dbf54bbae301aff6d8211a4bb196cddfb3e408e130e6f98b6aaeb1f64ca6d25e5523b3fabe9e2acf0d613178f9784078fd237353aaeee745d946b7cb8d79f55f252f969bef9e418f27f4878db8ff9e4d8bd2ee98c7d48a343fb0553dbe6f66d6efbf5143986f6eb0d2ddf5a951e51f93f4c8ea96d7f841c537cdc725ed2ca794b1d573a72cc70f5efd77f5609afbd9f53b43f4a8e25edb21d0ecdb2c7b4fbba55fe8fa9e3dbd4f1c7c975f73ca5ff8c46ff750ddf6c7d71b54acf937ce755da43cef5a8b4979cab22e7a09c4f04c0699d4afbd43d9fd48e5f084063bd4afbd53d9f22c7900ea8f39f56c735e43ca4b70b6fbf7ebb5676ad56cea056cea04ac3fa58badd0e09afdd0ea9745878ed7603390fe9058d7ff7f805a69c8b5a3917557a492be792f0d68fcbc25b3fe058dad824179f8d225d3f643a699b4addeb9b9ce3e99fd4ae2f0a81d566958e68328ca874923aff19753c591d7f961cbbf9209da2ae7f4e1d6f513cb96dde56e7785a101e5d7fcbad6b776878dde1e03579870fad528dd69dc2ebbbdde9d098e2d2d0fb92bb85b72f9a44ce437a97bafe79724ce9e9e5dfa37ebf4c8e4186ef3bb864dcc7f50d7e7c4a3a93dfae5d773174f97d4578f885cbbefcbe243cfc4ed5f3bb7cdeabf27f411d4f20e721bd8fc1f33eadbc57b5f2aa99f24a99f2dc7cf733e5ddafd207b4f21e60f070f17b50c3e341c59ff2ff32eecb854f4967aadbc786a91f0f6bbc3dac646956bc3dcf94fd0883d1231add57c931a40f89b41d3ea4ca7add296bba8b836ea78f32653d4ae8d0faa4e84edfa68e4b547a9dcaf7451f9cdcbcdbb4bcba9ff698f0fa7125daf92f05d0c5752a9d4864e67875cf5f1f82fe76429feafe71f5fbcbdaf10b24bfc46f46bb4f19ba1d3d21bc6dc4138ac66b044f5dd61b1cb966bce953ce54e1e5e92de71e0817b1f73c29bcfdcd932a9d22d2f643fb9b1dc2dbdfec14defe66974aeb54ea8e41ea159daf9878294960a4f04639226a955e4e153207a3daa0214df7ceecc14c203d1ebee06f15163b2c3be30149c010516cc178e5b0f4c0d61b238af3139308df75f8dd2a737423d1af6616f1b58c2280b91ef9e920e1d021797e2f46532120da2daf548a033285bbce4817f484fc78a91c95c5f64847aa4334cbef01a47746b29d99339b48103ad5ef6994349dc86eaf3ce3023a208f7b90c326fcbe889c7620f70df2dc30c699fbe47076974c2f636999b20fcadfa6329b1564661ecd015eeebc134676d5b45b4a03dc57a18ff6638d8c864600faf15f55d5705c15461e9ec8d0c48f31741a19e8d01a148d750859c2736ebda8c23eaf3103c1f032664a68b66f07ef8d72b0e9278b191950f7429420ade157f77cfdc5632f9fff5e8957b41a5185dde7a22ca2f9010bf42a12733228f88b505232ae1a18d5e14f98e04757a7a988f03bf9ba315f78058cc79ec9ab8004f894cdf2c765f9df834534ca63a7534bb78319faa90662a5087166079a8d4d0ee431269027141be4ecad8a1fc8135272a541863f3382650c82d978e0101c6b4210bdc9935611cc74bfdc5fbbe4bde7241217d1962ec8fb4dee9a3fa630b458ab616ac67322e299343a91e138e2101e6742b8bcf80d8153bb7ab2f42a663cc17d5d9a61a33b7698319dccd6727f1e38044b4c08e208ecb455045be439c745afc7abdde8d73975ad52b581c328895f4e7f64a704b6d4a9882a3c0c2e0c5f1cdae34d684f1a1dbf21b7161506d07303b7a8d37dbbfdb0ed69a901bd6a406f06c75499c614f0c3109f60520d867e5b46a929e1e6d0f82b686660a39f85ca99efdb94703c702a2a33a908509c6d624b57cf2c5e3de526f54c29be7ad2be546eea9913583d7359f564e78153cf44138a18b36a2e228a70ad1fa9b4cabce13184894babf5ea6e06713e82382f43b8ec2c70104e32593858e702633f6e688426f3563e9923beb000c4a770c4171580f85413716853178b4c17fc87f22f8378194f7c1ad7f02f2940c33fdd5427b0c4fbadd689a081d5bd3847b4431c9646799b7022626eb9fde87300476e64ad51a69dc8059c6f53dea07f59feb56d690a9f34c655085abd081e1eb62f455272530e0d5c89b92958864d41b478e61a9919268307f707e63366440da0cb3f2db9ec9327bb717a6e3fda5d2bdedb22796b57bf33ea45295f2f669a788036e42a934120c7b9755630a770bc507fa525193ccee5799cc5e1b4d284d36cc4e9b4a896ff1db2963afa035f1430bb8cd7e0e181332b3b0c56b3393eae36f13183f0710e3ba076d57ee4cec11c8e8355260e66199138a4ec3d772ee6725c5498b8984ab880d2baa461e45ef63caeec6b4c654f26659fc6badba59e25801ec2943b9feb9cae35744e89909dd3021371e89c561b2a6135105a936e06f57296f1e52ce4c05b6b026f8ea1c1694695b589f3aab6e7daec2ce29a9d4a93c45095aa726f3f169b0a03afa55a647a2d9f4d1874e7e3b52ce13085e70759c7423e102de508af3729ebbbe3048e9faae5672bf95e83e3ef6ad920af959fed32f5e6d8803936ca5fe5d8c741bf96c49a09e9b06cb9e017fc1e427fc879369454756840a649d91f42330fb921b2d7a74c23897d5fb9cc714136ffc31845e9417f29a9f2b76911ef24de09a527c52d18276cc67ba1bc8b2913ac9434cba54cbaac1b51925a56d6751887588f39cac51e496f10a55843caed93dd1a2d0baef5e020e2bc47ce73c8d372d9cbd7c9ef247a828eb40e253707dc7b09514d6207d925cf0fa3e4fd889473a55f524edf03dda683799f92b54693954ac2c90a8f5ab6c83c5be4bdc0a5a331a717a23a5b2e4b032e876479ed193a7134592973011fb5197ca44be1f8d822736c5498ef93da1c52f2f72066e789dc2e866b9426daf19a13894b4a14bbf1597112f91b406f6c3003efb4e656a5ecac5b45ed5af1ee1ea4dd25396995df1d0ae10d19926d41c936b308afc79ab34ed59c26f41bfb91eb4a99f3b0f20dd39c65da7aba8e5d50b6d0aeea0c203082f6bf4ac90c75a05cde7156d5be6179d541c7b9de4d2c6804d14ad7e47644a41da98cb058010a1b3514a88c1c0a805335b630e5ca6e5b91bbc1542def12eed37ca79b6847ae2e60ae5e3cd78de8802423292ef5fabf1323b3c0e5a60c2ed33c98b9ac9132ac91baacc1dad0a0d550e06058d544e06348f9f48e069c73700758e2801a1f386d148c032ea1abdbad6ad779e18c0781cfcd1a9f35596b6d8dfc80249b11cd9da93a700edbaa7645774b06ddf45d1cdd4d3247add25203da8a6b5f83a976aa3fd5a9a75b07ae856e42efad0fe53e276942a9aebee17cbfc277d050e31c6b1e52d60734eb5520d2a1e6d04ab71020f33ae49c93c92c752df67e9b55dbd3efd17a976a3fd2ad8e5ba7c0b97146f543c6ba9244fb18464cfad0974da237dd27e5ab54bceafd30e584e37513da86a3f93ad23a3abc2d9788ebbd6855aaf7692596d2a1f2ef54356c2d0ecd5a517b3daa06426b3e9c92a52765d3b44e7835d64f6cc6b18b73f277b76ae33a31f6d1aba4d77b662a1b27fd66d24bb85cb8a826a5ad017d5707ed299cf57eb1165b825a9ff66a03f6582ece7b94c5f6aa184812f11d509aef47c9ba1199b4e49d3862e9c6b66a8db2e53694be43b50abde8ab9d45eb2f47c4932a47afaa451deabb17a5e996792a91832e2559182f3169f012ab70505fcc67a33476123ed25b63f2948dd11d5830607a2e9aad7c2e02b38c1bd56d308ceac6841cd52de71cf88d26071ea88755fe555c099b4c250085c9b284c9214b596132318cc9d87d78ccc7989a70180255f3b0a77b0a6f7ab06a64b161f40e7f6613dc22dc87c885e18f33cd959c6eb79a743b05f98169444ee30c5a388f0dd99db2a9bb3b94beafe64abe8eb3dbb016b58a2b619ba98404d68c30f42bb86a7dbda15a8f0d59adaf311187eab0dd604bee5f46015bf802aee5d0b9c1840e1ca63bbb3028ade6cad9612a07c278e7e4e7a43440e8ca200527e9a4b4ea4efc84297b8da94dc1f86a7711db94bde8f89e4521bbc51d6a30e204f09b5579aeab0b344794eb15be9dd9e9671bc6766617b6336b33d02824cf5cdbb396b38c3a9365401872009dc611a50ff7a144188ba834950941badd223348f7d6847041ba2a93b96130fdb85573739f0b354929f6cb6bcee8b2529d6f4145a49f1f7973f91b143ce10ae633ed41435a22445edc70a6526d521b84aef70a26740d1b9d840f5daf3369101f44f4155183355a477f40e66d451fde899335a4b04be7d98d31c03eacb6905747b8268ba61b026b7a1f6a7a7d86a6ed70cd59c47a934580a6f69b04d14d601f6f02355cab74c0d42ac11386461c12744891e0e1170c919d6715ad29bfc8f1965ad5530d270c3414aaddaae5daad8386766bdac470edd6064ee44326911788b413e88d58b80d72125777b4a78ec23b871b39710f1bc49d34299cb89b38e2470cc4d78424be99c3f2261396f0e47038f5b0eb0846c8bb535d6d18c4b67042351a84fa5648a1b672c49b0cc4bf1392f87526e2e007c234b2cca9593ae5f93ce56d1ce51603e54418cad7735a3e6ad2b21006be7d74b99da37e2c5b7d74eae0a018c67896e32c9d55d6956e8cee946584ab8f37700670b3c1005e9b11ce007670c46f3110df31331cf19d1cf1e306e2474212df65220e6ec909c1b825b05823bc5b52c719c429ae51392d1b13affa0f60f07d2094da779bca85597eb09d933ecbef9b6fbc717d98597ef506e25538f1a238be163763ab1ee3c1bd48a53e359fc519f4a4573ee5330b0e025ae186696784ee73d9e49ef3b9f670ed696bbe2df55e932de06418bb03756edd45e6cc3cbf551aae5e0f0ad8d0f202f2e16f01b09556306fbb4db803747bbc72fabed1a46fd04abb897d5ddd6dbcba1bb8f6ac2308619f066b1f67a19df95ae87e13658887760561d967dad0018ef0b93c091f341186f02454a97c273a1fe234785b9e1a3ccc69f07cbe1a3c62a20ccfb07a82b05ccb13be8903bab700403772c4fb0a40bc89b3bdfe3c6daf99338f813ccda385e3f8f63c393eca111ecc93f0310e8aa13ca1b899e378384f8e6f3110aec2c9a3c55c1ea54799c347c3611fbab11a0e55383935736e7990d21609f5c72c0a807dec4c8bac82d0e6bae0e39cf55ccad37a4e98948cf365edae27d7d76e3ab3239c195a473c3330067350f965132a46658d08773d79be1c71aa3b69521df464b00f5f5e3dd92993ee70fa71316763ecc6d92ace5cc1f09a828d0497851a03dd25ccb332b2f1c1e9e756937e60700b7b03e6bb84ed34a7fc7bf255fe198eed7b0bc0762b47fcbe02103f6b220eaeccfd227f57a68d03fc817c016fe79ae007f36c823b4c84a19f854dfcf48eab1a3a2ed203e9e55ce4cbe9349503a41e0e22c0084fb8cb4418daa147fc2ab75ec05d7c01e738a53e9aaf52bb39a53e96a7526fe3083f9e27e1f326c220e1134108fb0cc67b4c8421e8f96410c21379c2bd06c255b890057ac0d10bf0391b4600bd4e8c8dba9b81b9f9d36133ef933df3763261027f4f9910357676f07e8d8ac476913de067531aaeebece38cfce93c8dbc9f23fc4c9e84074c84a1ef818d7ff3ed7b6ee7b87e364fae0739c2cfe54978c844186221ef0842d8271632cce1fc7c0170bec0c1f1429e705ce4e078679e705ce2e0785701e0b86c220ebd236ccc9b57ef38c2e1f19e3cf1b88363f9c57c59be93a3fcde7c29dfc5517e5fbe94ef3651066f1bdec491afb77d0fc7f64bf9b27d2f67d41f288051dfc761f2c10260723f47fc430520fe0007f887f305fc418ef247f2a5fc1047f9a3f9527e98a3fcb17c293fc229f1e30550e2a31cf14f1480f86326e2d02dc11b29f2e9bf1ee7087f2a4fc24f705afc74be5a7c9203fa330500fa290e0fd8163d63be044c11313f2ea50b7e2a7173079841715a52ed556b2f9cbdc1e14a760a908b8e0bbcfb468551cbdb38f93e6792af43b8a308d7cba73ebe69fc1064f450a9e481658ade57501ec52948b0e0cc09cae972d309a0de2b7e681d15fd18860d83d3d31c4e9f37e1d4621927583e59279cc5e940377d8f3f42f9e3f00c87c3cb261c60d60fc70dad05f572e07341382b04c0ee83ebd94fbedc6bc5db39295f3149b9d947ca9df2d720ce9e72e46d13ce62739dd7f4d6937eb2a7a98591e6594e9a2f98a4b93e84344e9df593c5a62d3ec7c9f5aa492efd8146a62da657c105d3019f875b4f5778ddbe83c3e08b260c566a18e8faec52fa3c80ad499780a5cdbc76c3f0f93cc7e7974c7c6ecfaa2bfa68ad30bd02bd2b8c642f70927dd9245935eb21ec163099eb424ac203d80fea5c16ba5f7b27c7fd5782b574e93d590bd1d299a88591e65d9c345fe5bc353367b46f3a209ccd159ad5a668415b3b5ecedcfba57773f2bd66926f7d88967c6fd696bc30b5e53d9c045f3349a0afd72e749b1da4a72a5e5bfe2287cd4f98b0794ec3469f1be2e003fb9f8d48afba15d709c132bccba2356bfb17f48aff14076f5e7e1da8df2ad0d3be323a9b5b16ae7ebd97d3c0d74d1aa80aa401b74f6d16b0c90cdc4c375fcab4233a09210cefefe378ff4913efb51aef75c88f33ce184ed94ebfa74df6e3d4af2d0f23c5fb39297e2a98afcaf747617d555eee5cfad99738b97e3af79e29dba8a9983dd30738f97e2658cfc4eb2d7ccf949be57d9093e0759304753e12501dedc4edccba536d9d1fb7c12d3057193fc4c9f8b326196f086485d9240c6f85b98d303eccc9f67326d98e0b7b111ac762f38964f13e7f18443ec221f2f341ea24d723f07af31b9be4a6d38f7212fc8249023ddac4c55cb3b59b5e39824a987bdbf9314eca5f3449b92265b9de0d0fe8a6087e2d67ae9efbc7392e7fc9c4e5d519eda3eeb9bb7e51bde845bfda3fea1786d34f709cfeb289d3110dcf1a4fb9dead07b26f3b906e05dc3b1d8dc0996c5a3b6da1452a84eff2490ecf6f98f0dc1102cf201b39e8d63288ed6aa664b95acba738e97e85f3ccec49d7887a85a57485abb79fe6e4fbd5fcea6de163849fe138fd3513a78518c1f8c70373f3b13ecb49f186490ad8f9cb1c0f7447935ed4dd798d85e2f6731cb7df3471bb27c33acc5eafbbf9a7bb4b49147cdfcf7392feba49d2430125dd2bdc2d84c1eedc18e161f93bed651446eedcfd8b9739c97fc324f97e11c4ebcf45ee628e475fe164fe5610cf318ccca329e51738297fd324e5ae405206abbbc51ad5bdca49f85b41f4c8d5da6c31fd62d7d02f7252feb649caad6c9f012f796c16ce16f48ebc43aadf80beda1d7bb667e1bc103ee3973889de3449b431078986d559db331ebecc49f23b415a4f3b4f2e6d3fd3fc0a27f3ef9a647e5a8cd66c177866eaeee3d89e25aeeef77c83d6695e92f48628e6ed50c2595ba9fc24702fca7aa4e43ca7e9475ac3924615be4fa53a856df6178341d9b09137d4e4e6546dcfbe36e3f76419e3615b5c81da0583806a08ef0e48740a7d7d4d1dd2773761779f865562b4c1796d02cc65ab946dacf3928142ada5a1d2055f3da32fe14c244a95442e2d89741290bed224fd7dd0ea04a5d53155b873f8ea1cad293b177f00a58d35db50f897bf3b04dc177f256019d369bcddd9912c2bfd6cdbabaf4502cd8a405672d9deb43e1f8dca09840f2ad702fe4a4bc65403ee7f68131ce7b56d8ec6322311e978491c40ab284f83f6473641f3dfd82c0e50bd31230dd5b76d4215f6ad6a7100efc8a434787f6c13bc3241dfe7e756ca3840f47a220dd19f1403a275b18308f6737421fa539b10cdf26de261c09e7e07501c80eb21cdfc776c0217fc15b471806dc54480adb44423ae076573775cc361cdbbd8b0aca71edf3ed68ffe9a3338f3b8dcf8ae99a871fe6782b8cc15196e6705d39c57306d584560dfac225415af0861d715a1fbef8a2cce517adc6a1e6f56c3b8f5cfc58ff690b23a294ffd0580f09402c169edbe6bb3b59ba7acd08920f46104de2fca073bd46b3c2ccae0c1bb9d86dbbe99b829f3b480f38308984b2b084b58ddcee32f6dc239270b9cde80d23a7b5096da82f21081f2af46174a1a81abb607e5645b50de4aa0fc6b9b504e215dd085d4d492f4bbc9ad41b7c716745504babf194d2bf446d22d5a61ad2d288f1028bf67134a7092c0bba3ef98885fa59d44e0fa5b9b702d5296d715a833a1ab552c762b736dc1ba88c0fa7736615dad606d531ea3fe682cd7252716abfe2e5ba0af21a0bf558c569403ddeb165984d29a5b348340f9f7a30b65dcdda2dd04ca7fb00965f8b1cfc6188e7d9e2070fe63312c33d8d8674b0c2b793f81f29f6c42099112ef6be9ddf92cd6409b6a0bb41202da3fdb046daec8e63051f6ad5a60992d30771230ff254a606e8e21983b0898ff1a253037c410cc2d04cc7f8b1298b53104731301f3dfa304e6a61882790301f33fa204a6456fd21a985b0998ff1925302d063dac815949c0fc7e94c0b4386cb406e66202e67f45094c8b0fccac81b99180f9df5102737d0cc1ac2560fe4f31c0e462437a40c36235b716ceb88e80f983288169b103b206e63602e6ffda04335c00d8e2f8c75a6c681e81f2ff8a0165b0309b451fd31a94dd04ca1f8e6615f7426935fc6b0dcc1a0226bc0b3e32605a1c4a5a03730301331125302d0639ac81b99a8039264a60c6b1fb594bc01c1b25302d3aecd6c05c45c01c1725302d0e25ad81792d01b3244a60c6719ac14a02e6f8288119c7a9ac5713304ba304a6c58769d6c0dc4cc09c102530e338d1e07a0266994d30272b30a1e04e1c4abab4bb3317d4150eb8125bc009025cb94de01628e07a642680cdd971c27fe769ab01b78bb620ed20904eb40969b61851fc1f514c25504eb209e51291192332ef9553279c37ddf6e3519fb03c8bbdcd16b47b09b4936d421b7ed2601c03c3f71038a7d88473aa482f4d715613b68a222d4eb1d67b2f21e04d2d468b192c141cc7c1e33102e5b4d185924eabb618d4b036adba9540397d34a1f42e99b208a5b525531709943346d325f256f03886da661328678ea6557a5f4c62b1cfbecb16945d04ca5936a15c2abc639f01b5d781fee61d4a96ae4fb3e85f5a5b9fd644c09d1d2dffd2e2b31f6bfee54304ce3936e18445a7de951419dbddc4c0faca095c7347b3c389ff72e72481725e749cf3383e8c682050ce8f8e736eb1efb6e69c9f21502e888e736e114a6b157c8840b9d02694b92fd08fa3033493c0ba283a639e38ce225a4aa05c6c13cae521a0e45f596ab111d8620be26b08c44b6c42bcca00713ebb815b6c1aced802bb9e80bdb418034faebdcdf66a598b963c620bdc4e026e32cae05ab45c6be09e20e02e8bce60208ef33ffa0894cb6d42b9cc002530318c5b9bf5897dd8c20e5c710f8fc71080afb209f062e10defc18d50c92f63f7a54f7288ff7e337713605744c7b38de394eeb904ca95d19de060f14189b5090ee709b4571733ba9faefe40c889f45f694dc0fd04dc5536c19d9d012eff2a348b404eb705642301b2223a0e551c5774b41328afb109256c5da7efcb0904fbe44d87e5f8a35338af4f8b5fb59e4220bcd626840b4358230d045aec88ac05026f26a0ae8e22a871dcfeb48580ba268aa0c631647d8080ba363acfa72c3af6d65ad247089495d11923c5716dc75504ca2a9b50869f4962b13bb23693e4010267b54d38dd99ca994b65fa5496f8d9628280b7ae18e31e3eb89c1ef758ecbfad8d7b6e2240ae8f0a90711c401e2440d64405488b33e7ad01394080ac8d0a90163b186b409e25406e880a9016031ad680bc4480dc1815202d3ae3d6801c26406e8a0a9016f746b206e4bd04c8cd368184f9bb70b3133d77d7055b9c893ccb16641308645b6c42062f526c15cebbfd2eda74aead8d4c2612a8b64627161ec75542cd04caeb6c42394df0b170b7dac62f7a3399c0b72d3a81308b6eb53528ef23505e3f9a507a276a5b84d2da44ed1102e5f6e8c414e3b893d12c02e50da36995de5594160310d656519e2250eeb009e5dc2c50ea5619c7f9408f1330774609cc383a41170898bba204661c3796788c8059172530e3b810f07602e6ee288119c7be7c9080596f134c77fd9a3b172d1da0b812b731bb85c0ba275a8f5d2d0673ad05371e2670eeb50927049c9ccdf5e21c362b2370dd6813aeabb44aed6270e447608f8ea304e406db203b91a1f46d07e49956c94c3d8208b736a8858034178c8f2e61a3e0e4b606f23e5b20af2320ef8bcea83d8eaf665848a0dc6f13cac2ac03b6d824585b07bc82407cc026c410ec879591976515bf80ada80b5dfc629ce30868076d8296d43aab36710eb1387f457753fb09bc876cc20bbb2c770b77f54efc1ecf9612a00e47e7015a1cb79cb88d4079a41823f460bdf6fa58863bb613306f8a1298710c77d411301ba3f36cd2a23f69addf7e9240d964bb6369c3273dc062fc3a96f104a8669b40d5186c8edf1dc6110476d3e8c4a92fc06c432a677ac79846d181579d893196f7de789b2d25f41225b4d876cddd8d4afac51199097c4700ce1a68136d8136968076d42668f92db0b7d811595b607f2381f658b402c4717c4fef5d04ce9b6dc2e94e52e59ca4b82f2d994f80bc252a40c67169c93402e4f1a80019c7a5251504c8135101328e4b4b9611204f8ee67373bdcbb1b80199b50ee70e02e6a92881697191b23530ef2460de1a2530e3e80aed21609e8e1298717c33d53e02e699288119c7c5f3870998ad5102d3a25b640dcc9304ccb35102338e2f08394dc06c8b1298719cacd546c06c8f129816a3ecd6c03c47c0ec881298169f4b5a03f33201b3333a8f78e3b8d6e23881b22b3a0fd22cb697d61ea43d4aa03c6713ca95829f48d8245169534f8186aed0c984eb09d0ddc57e9ce17d10e7a6bb64f673f2367862d48f53b9ac0e3aad3d29ea21d0de568ce620d8248538ae159a43a03c6f134a77e7f5616981dde80407b7518bc05ab3d15d04d89ea8026b715c6f0dd86a026c6f5481b5187db206ec02026c5f54818d6377359d00db1f9dee2a8e6f62598e50969668c4f76410afc3e123b8e9ce363b0e209562af80791c1d08439b3c3e8016382ccec82a7b427ec2e17f4a7e4ce713b8a366bd1c020ee059a0d78eb47be555e04cb66320cb0035870a9fe93c153eb3f09d6bde37c1360b98173d8c602512d3153eb0d5cb41011b9e834fdd8a69b3fc773635a882b53f898df2cba98f95a99a58e999cb953e9f9d26a0e34fed76802061ae113d05d36b36894cf3d32ac90c354ed2ecf2f13632c9472b552b401757b2fc83a077a57634d3b968c62d52f30ef10e715866765ec1057f25ff0f524101edc2610100 serializedProgramBytesString: - serializedSignature: 399f759942f72bf14e4e3c29209aea3b389b9edb2930b8a61720936d2b281af0dbeff41c18fe2b945feba0a994ded77a4c7feb177a90ae62b409c8302b465003 + serializedSignature: 5464d9eb411bc3037df7c47ce47f471e0580289c57189a9f78fe54526badb80b55edce96d54107ba4b8f3d72861b4c244e14bd27f2b7bd750f3bee89f0d48501 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset b/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset new file mode 100644 index 0000000..327c82a --- /dev/null +++ b/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: 5c3949f8e99590945884ed76b6833995 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9d697414c711807b85562b214e83100281247348206017891b04e842881b09c9e632081d5858088c0486dcf7613b899338f77d3bf7e52476e2dc9793388e73382f3ffdf2929f792f3ff223ff92ae9e1e6d4d4fd71cbbd3ab5d25d2d38ea667a6baebabeeeaeaee99d9a224e33fb10dfca39ff5b076b689f5b121768d8df3ffdaf9f62affb5f6ecf413ec06df5ee69f03fcd80656eb7325fcd4c796f2cf6ebe37c126f99537d920df8e8ae3bd6c98ffdfcdaf1de67b903ac2ff86f959b1627e511feb60c7d9315619abf011d12f2e9a906931d02b56ca3fdbd81d7e7458140a32498a4395fca3971f9910c7aef242dbe79d65e7855a57f9b1417ecd0d36c6655e12124bff55c6c43fccda94ca2d4f6571feb745ee17c9b452f93f3e77b6dc56ca73705a154a2b91db65f2ff43e81c3b1db6cbe5f1c3689f938bcd51e4d8d755cbb423a81c76babd0fc78f2ad795a37dfb38e87c4e919390c78f29ba2df5d1379e9dbe45cf28b2576858520c56280c562a79ac94793c8e74816d0dcaa346e1b454e11857ca502b8f1f47dcb01cfbf809a58ce5681fd921f644307bc56c9dbdeaa85d963ac516750ae3bbe5f193689f739ae5d50e6cd9ab15d9b3513a6c57c9e33dca75abe4768dc2af586ed7caf45eb40fdb7a642bbb6d34a0b47a9406db7552ce29b45f6c99d12177933caf4feecf92dba44cef47e7e1f47b14392942ce66997e2f3a0fa79f96fb7315794d8abc26b99dcfa6fc55e2df326d9edc2e50d89e518e2f94e967159b342ab66c64ce3ab8411e3f87f661bb9ee97dc546e6f615cd28cdce778b926f334a87ed56e66cc75b2d1b963caa9c6fd7a96df2fcf3681fce1f42e582ed765496ed8aae1b99b3dd2794bc763067bd5dafc8b18f9f50ae2b47fba83dc76f2b7212a86c5e6dfc2ee6ecb36cce3bd1f5769bda25f3bc0fedc376b7c27f274a87ed1e85ff1e4b66e229457e8b22bf4591b7571ebfa05c67a75f54ce2f47fb8855c94b01b82cb2ce2dfa8bc7b9f3e576b1dcee97f90ca07dd8ee432c2be4b615a5ed93db3685a36d8b76746e3b3a17b61d0adb0e8b4bd9538a6cfbba4e8561a7dc2e91db03f2f825b48f7d65973c3e88f621bf0ee5fc83f2bc21b46feb8de50c2b721e53cad58d74ef66693fe455b76d5dcbd13eb27fe998a2939f3c475a3c2622d283bce403ec3a4b8a93a057081a3adb57fa07cd20ba043ee0a75e643bc9c3d3eb5c802672ed1371f124f70c4ddac8b54ac48276eeede273809f312a848eb8b378da9505146e8cff0ea3b07b82a77789a81d02ef517e64130fa846c5551779f77496ff3aa5f4f36cc778e83ecc3bd59b3c2b90779117db7da69f4a10a2abd7f47099d608e22a4fb1815ee7fb63a284bde2f39628e9b0287d374f9b14e399713ea269e3dbdb2237b7ee37f8ffba3c4f4964fa32ea071254ba355cb1cdd4c1b581d227451cf07f8b4c8745007dc9886c86c549d1eb3cecb2c4ff195a4e262e1cb52563b3401673a435b1a41803f5b80886d7d1ada1be7e5bbcb7f120c74b173d1930f772a141dac22f2d79e4d9e7cb5ffa67dca95a334b8a2166b58f6a5e60415e436c894b82b70af178710a0aaae28fe9f08b50b43787f8adf346c579e10d50227a26a70162d0b51f11133e93b27093a2337b80b96c9202010981d5dd69fa158d025ba4035b9a6bb0fe9ec40b6ce9945e69b0f0a327584610f42b034570968ea088c2468d12ece36956c8d3298e8e8a7e12bc1dcc6542ef39224a6fcd6a5267db0c8f8ae9c49ba21cdeb42198dfa8d0d6932e17a4610069aeac94558a755611e39011a356b103e15e1ef11ce620d2d2ae092d209f09d1cbc279c779bdba22639e13fc0c8881d2e1b42dc3db1e7302db63aeb0c77a14e247594aca12719d25c488a66f9a5c373525eecd79de941e69ce4931f2aaf2f4c6546e30e82e89cb68ac21668d29ad6da7dc76cbed71b9ed6389b8deb40b848ccc0a4219ae446738312d772ae7210f38e5ccccb650673661cba5446ce29517cc32958230000616ac90ed0afe209db0cf22619f4c72a4ac93d0582705cd6ab146e1d41c59d41259dfa022952905853a446456aacb0c129768badefff01f97f0325a781925bc52231c1086113e5b5789c57c57eee3f6cca21bd0b832707453c5bcc2eeb0b14db9ce34406f99a650319d69aa68d3ccd199464cd9e732f4c49d5b78e32c0fdcf956337dd8e9973f659ab954ab59a16935cf16876b35f374a6119ef49c51d3b8a711edffdaf8b5f7737d6e89b9a19bfc7addb4a3b7b1560636568d30562dd34d86862b1165bef93ac2d0bb4cd3a8c11dff453b6aa80dccbe8ef98d1ab22f2b659505ba46053d2dac04bbc6eed0202ef0df14ff03a9f6181ed2604adabaa7c4d5ee1274bb5b48e5bf4a97ff5c94bf75d3089e490893ef5d943359ad7126cf958473268b28e16b34c2ff9608277cb1467852e47832879d489019467dbb80e5ed3285410dd9bbd78bb651e1d2cc73228e2057a1338b98b563ee89c22b2ffef55af3dfff71c4659a386d9a2554655ee7559901ca084fbcc0ecf59b51de6cc354e64a2a6859af095ae0274cd0b29412de1881f02a4af88608842fa3846f8c40f8725d33146d339763c5363939312c2695c23746b8a7a55125a16f8949a61fd0f917816a8fd5947d5211d86705257c7304c257ea8483f19bb43c55c9495a720d55ece6088a5d4bf927b885c415ab8470407554a9b74650eabb29d8dbb285bd8a2af6f6088abd9a12be2302e16b284beeccd2926b756e4d749c578cba352a96ed1211e5b06bd0185d9cbe4b474ceb01770b0f082ed36469296f59afb38c8838ccceef53653767913d812dd2c2ecf97d13a5a42cd1a06b7c6089bd411a5f0bddf8d6519e6e5fb69e6ebd4e32cc75ed0f52648f79d246cacbb546e0e53650c2db2210be9112de1e81f04d3ae130a8eb08c2bb9c169cd4790111ff5f9e162fd02fdb16b49ee688fd4027d76896c22a2986238d1e2d3ebb12d582a5d31fc4e2c601e177cc9582f23c29aa5a756559ad36ebaa95189c4d4fb77f92e731c0ac699d7166dd1c176de53aa8ab5c62c4e8d5c147512ea58a79d5b36ee61771445120aab63551b5ed5096b5ad9972bd872370bd5b28e1472210be55271c7a68b84139ab1e7a1b25f958b692b753408e470064874e388c2f4e04a9231e03919d54a94f4650ea5d3a77276674c6a6c5dde9c60df6f278742eaf476712addfe9157e27e5e177a22a31e57b7653e63f1581f9f7506dad2fdbb6d6a293bc9c590f91f936875e5af05e9d601897df1344f06e5af03e5d531033730f4c4b53702f7545df10ee0ddc104e8b8690f46808d194976a06fb756607eb9c0962f6d3b4d95b758261179e0c54d742ec9f306b216d54033e1741036ea7849f8f407807e51deecbd63b74ea245b6baa01ac59430b3ea0130ca3f68b410457d382bb281603d9b2384855c04b1155c06e5d06b0ec3b1884491d2df8904e304432f0c09c6b956f8de2455b79db8765f23bdc13c0eadf65060bd817c4423678894976bf48c7d7a46f650a13411da6ca39ac2b67ab52ce749e5639af711f67957282ff9e1237828c7b94944e771e712e1f85d1ef08a5df884ebf14a99f6a912e6991a01a64669da354e92feb4abf2f90755a79151c127d8e3510ccde3a99e9768cd2ed7e9d6e3b14ddf01dbcaa6dec2995e0d6d14b0ba3cd714a9b519d364d21b4095bd3b0ac301a9ca034b8a2d3a0258406bdbe1a5092d46bfab95dc3def77092d2eb81cc3d5c277b504ca98cc9d86d3a3d5c0fa5df18e523f431678fc8794844aa96ae560af43dd3e5237a29ddaeea746b63f68d89f6c317bac737e887372cade1e19b3bfcf31a9702b7ab3d247da49e9a6e881b46c3539486e33a0dfb48ebe1fc714ded1647ddb5d55f4ab073a2aac57d14876b3a0ebb490e3a7b3863a849a63e5c45f3703f881546a77e4aa7eb3a9db6933ab94be1d408eaf784d2a3eb2539171cc2e8720fa5cb833a5dda43eb3291a52e51f414f7523aded0e9b82b637bc15cc7a49890f7d35137711f46a3d39446133a8d0e646cb5ec348ac27667284d27759a0e4ff514f60de9f8bd1c565f05251c61037296aa7beacc4e764bf6253da206c29d98b7c4d938da71be40af5fdcf63cca3f2f09efe815b3398f7879db4c389da538dda4fa1b939c20de68e7594d88767c155de34d287b0ee7280eb7a8c8c23f2aece5275f92fdcb209beef1d5794ac387288fedaf21154d4c57ec7b1fa5e36d9d8e9d91c487b617b753c3c586998d2e2f507aded1e9a98e2ef5f96736bacc34cebd4869f0329d068722b1548fd0eda6e869c259290a0f334069fc729dc687c9bed7ad39b69c8e8b5a7afb31089a815b4a66f5f412a5f32b743a9f31d8bb7465dd0b4753ef072922afa422302ad7b07ed8599f83c61499fbe2214ad35705f151edc2aa960527a746e2d758fabd38defae9fc175c154683614a8357eb34d0cf14419ee1678a2cfda8f4f0164af0df9878894ea79003331a27840fb33c44523cf8909a6a7ffe6fb583125ce5c421e753532dc8ff1d77af61f43beedcb72467faba333f2d74be6413f226583b7f9de857bb25a446b62c4e5a3c0532d3347d2d432fe9284a8ae7511a33ac4dfea5781de4364b5f87c2bff2c912704cf6fa31b855ed826c18c353a1bb6f2e7ecfa76f1402ec9e3782973b42d5b2966e6e306b79edb904bcafa22805f45f6f1211bc91a04764aa3e4c3b5110a09e2c49837a834950d68b57e1f201d18d15021cf8b1e1bcd1249c79a29bb2a24f5c87ec98bd10606d40b0de641256b910602f3f605c8580e98522c094882bc2d5e836aad79bfab1a5fbebf92242ba2d463e3784bc21b5ffae85be2ddf4afe66e6784996ea771a7c1b5b83470d6bf074f80d448f990e39f5a1620a42ceb7fc8f4783298806df0a100ed9c193f0250f9bf42515cc7a85c0a004a80e07f15023a5e69ecdbb4ecb1c9e261e44b54cbc4d0572ca8f9804b94482b4aafeb898fba3e70f369b43993085720742f9682e505275d289d260ad3486720142f9369328576a6a65d0553ca368cb4da1dd84d0be3d179e738c9f0458af784c931b0459650ae40a04f21d2641564a909749dfd9e78069d0779699823917c17c2c9f601aac99c660962198efcc2798cd0508731182f9ae7c82d9548030ef4230df6d126695d2f9c01d12936225616675429508e8e32681424406efa51c60f0289a3d2ef59cce8c0edf0253f81208df7b4ce25bce82c699ce9539837d798b29a80d08ea7bf311aac1866e0c6a3d82fa3e9350bddf995878131c0c817bbf4970f05670fcc656626a3e3a64734d212b46c83e601259bdd24b43537dc8d1a984bbefc860c3de6d0af65a04fb832661fbcd1a15feb8a714a1fc904994c1678ddcf78619455b670a6d3742fb619368570746eb7d83a851ccbda630ef42983f6212f37c967ecd37869d7ec5b8317835a6e0cd43f03e3a9d9ed439ff6e709c6e6cfe7d0942f9b1fcf0a4baf97783688dcdbf3721b41f3789b63a305af56130839ef38029ac4984f51326b1d664d54115668cba17c1fda449b8ab02c3f5bae9de28e4d3a620ef47903f359ddd57ceea6bb529947310ca4fe70265b09b1a0a7125be16a1fc8c4994cb986e2ea09b17e5f60c9bb3df88907ed624d2c53e0dddd6d428c67a531817238c9f3389d15e98b36be6e80cac934b11cc274cc284a51c3c4b9abe8b32fd884de105f5b310becf4f6787e3bc0fc4e0ea91b19ad88e507ec124ca8a40280bf7cece8308e4174d82acd380bcc1d24f0f1fe25b08d567da74731102fca55cd4d47407e4d5e80bafc93723905fce179085d88b5721905fc917900627e98c81dc89407ed524c8b50ac84b4cfd02d80bca53fef457c51aadb3c666ed3b11eaaf99446d2f796ccefd9287b165b9f908ded74dc2b327e6ec7a0a0f37d9cf16c1735fce35fb993505b20641fe462e6aa8fbd69b71794ae1c18b2178dfcc4597146c6454785d523502f964be802cc420691902f9ad7c0169f0ce786320eb10c86fe70bc8428c366b10c8efe40bc8ad0508b211817c2a5f406e294090ab11c8a7f305e4f60204b90581fc6ebe80dc568020f1cb43be972f20771620c8dd08e433f90272470182dc8e407edf2448fb46aef4b36c306161bd49b59b75ccb0658b5684f50726b186bb8bb3105f48b110a1fca14994d9ddc56910adb105df1442fba35c367eb8f920fd1ecd9976e3d60184f5c726b15a5ff152d80fafc611ac9fe4c253069b5a2bc439a13684f2a7265106bf7b58ff5d0f06e1769b82bb19c1fd9949b8c1ded555b853c0e508e4cff305642136f7d908e42f4c8284770b0e8ae55928a2c14e669129542508d52f4da24a3167a073935ce79e207de6cc7b28601fc2ffac49fcea8d08d6edd7adae377e04f9ea47a3a88d8553eb11ea5f99446ddf4f4c8553ce77d41b9d1c499a82d98560fe3a9f601aac99c6602e47307f934f300d0651c660ae44309fcb279806572e8dc1bc1bc1fc6d3ec134b89e6e0ce63a04f3f97c82697005d318ccad08e6eff209a6c175756330b721982fe4134c832b99c660ee41307f9f4f300daeaf1b83d98160fec124ccd51a9899bd97c660d064ecbd342d08f31f4d625eca9cc3506bb5686886cd3fad6233e62b3e52b5fc943f31c7376a0479c6b3817c5f5e836671a6c13593d610e88da4d6f76a2c945cc7b984a3e2f800d763406cd3dfb19184fb1963d0d585f9222e6f9940d55bda8b802ea66f4d6391d58728bed443a7a9bf7e74dd9ae36195240c2c66b4fe7f06bb4bb38b6a5a29befea58f5b7e48aefb1ce7270f8942c14ffcbfe8df020189ca0000 + serializedProgramBytesString: + serializedSignature: b9ca04c462ce25090c1ff26f495328f071fef1c523b5e578cf8eb8930b332fe283cf568be7fb069a4d08ee578efdb4e3043e0e864d9698dc41ed7cbada3cbc0a + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset.meta b/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset.meta new file mode 100644 index 0000000..54a8c57 --- /dev/null +++ b/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d6ecac3cb49e00b41bd6cf241876ba41 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset b/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset index 94be726..35809da 100644 --- a/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset +++ b/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595953134110ee09594240443cc0b3d427b110773dca77c40bcbab80f0625931c2c68a95042a0916fe005ffc3f3ef80bfc43beebd73dbb61d99ddd25caa085ec566676ae9eeeaf8fe981824b78d40d14abb4440b74932ab44e1bd4c6d702ea165edd0afb5f5107f57b94358cdda02b392bf9b9a6cea25c44ab4b3dacdca235d40d195f261fdf8b58eba3c5bd75fc7ccc52452caad0037a492f685a9dc921b12a8bba419f62b9d408cafbf409a3be30c59bb832348d6219235d196b81e970de6b7a2362b530b686351d6a82e63ba1387291d78a4c5239415dc0afcce3fced28e1fc0968d568935c1e54d70780385c990f2e931e2e687e80326fdb83189b206090b022f8f5e80edd364a784e1d8bf0bd20650d331a427438b9c5b7c416cc5c13af1f514f17fd8f45bbaca006466ed233d4bcea2ddd02e0af635456b16d132af66905e5a6d07b0bb69333f3446255c6d72c81a6b6b4167a424037d16e0a87cb527e144e7de17e117d3db1fb362cff3eea6dd92d297b07dfa63d5702c8cc3c9a0d2ead5f9b75a8a6079086b97787d8cc8e34f23734c2d00f0f076e5874d947d49784268e30d441c69140ae69dcd2a17457df6d7225ae2e25101c5cc6a48466fbd678dfa3bb99b2989161755f10097634fc636cf6f3f7afd5bbce6ed1ee90cb66a22ee68896052cd39b5153090ad922384ed16346e3f02b13fc25ee5c3e40f8f5bc86cc1b5c01fa64daad003581e60a3eb6f16b62f23ca6aec992b66418ef29a11b8f099504dee4e199c7621ac00513c023070d707e44c90278a42fd70ec0fc98112ca72098c7431a824326047913d5b08a60057d3af57928a30d392f39ea71eecba7685db8d75970daec10c3e7927e6e091fd9688f42aab918da66a4c704e93949936df19aa695a2492ba3071f38b44736734e2133d29cee5e4ed8f5957933dae3a991219b8734041d03821ebbda7183bbfdc4e394636cb1133825bc4ab1293c14903b60ee15b66f48ab4b2e0f296f80fb078bd702e39c38ae8083777dd1b2294c64dc46eafb9698e649a1830cafafcbed254c764cd2e5cb949e84970289425a409aede9d0497a82b51adc79a9e0b217a8d9dfb4a67c2e2679b7a1bdde68f30e654de085fca90204d88babb2bc8629bd7cfa2f41e343a03713fd392110666bfb700167a39a0730eb129fba78f961178f117f64e9a2b7d74c2ce90f131281b6c1de8680eb4388987f7060fbe7383f19b5ef99848dec84577358f478e8d47f1ef93c8e7ca729720b2e781c28ced8f4e671d154553ca58e29d53eed06048aedf62737aef22e2f77f622caef7bba066eca26705301706b81e5f5f01d251865be4a9e3d28cbb6a07422504edb3e5138c35ec7e016a65a836adc1654c50854676d427535b03a9d97b6c56199891e10e9a0fd34f843e661b3c54204e07336011e155bdc9010be407eff30b006d9982dc88622909db709d944ea11d20ea65803af640b3c45872661f43861bc4091dc6a26d5ca6712b158676e9381dc6decfe5cc20dcfa849bd93c5b9cc8cba47835d6bb269e6a7586c4dfdd433a6afe6bee96b3fd24693a47f92421ecbd08acb37ce432dff25d67ba07631d369b96054a0794ddcc7cdb323ffadeec81ce717c9a14e49a91f0000 serializedProgramBytesString: - serializedSignature: f2819f66f4ec8e8a9b1f4e483ee18f9c5b9551796bfd1c571df2715a5833c22883b563a1aac68e15aae3c564bd0463f8c9665540c151c65e62f898d11c343907 + serializedSignature: 100e7940044df1fca2dd19ebcc0a27762134d9efbd5ac9fed2c2f3499402b1a4ab7a0c2f692b66d8e1173f56b0484bfeb1c03dc4c36a6b6d795740d12fd54b06 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset b/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset index eeb0c44..6ecbff9 100644 --- a/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset +++ b/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d675b1c4712ee450214108a086514104212b02b845040122209a12c116c2b1891246183840149f6455ff09dcf177cf97c39675f8ebee84bdfef47dc87fb017e9efb76775d353d6ced6cd7eccceed6b28bbd3c4cefccf45457bd15babaa767b628aaf42752a73703eaaaea500daa5f8daafbea9efed6a1cb49fde7ecb9c72fab695dded1db217dae4e6d4f71257cf64436e86d8fde9b51b3faca076a4497e378be578de9ef3dfada31bd07476febff315d2bb2585fd4af3ad525755155462a529018c08b66ccb108c81559a2b7edea397d760c998246a278aa526f7af599193c37a99976eb5d573751ac497d6e445f33ad2634cd61a4b8e4f552855f9453949ab2c494b5e6fb69b3bfc4947bf5ff52f2ddad0be53e734d37d907c9ffeda1ed5eb7df1c3b43f6a1ac33c77bc83e94f5a4ed7a53e7ac8726e50dce9fd3ffc5fabfc91c5fec2977936b96996bce7bea2c37e51e73fe02d987b286d0a83165353956edc1f462e69896bce2a1ed5ed760ea5f32fb65a62c36653969cbd5c74a734cd72979d51c5b61ca28a91f35e50173ed65b20fe52a53c6ccf92b641fca468ffc8d1e1c0e9af357c9be96b5e80d0f1db7fe3153bf97c80e658b39de47ead1e3fd1e7a4d1ebe5c5b71e53ee4e1eb90c3d7e2751e3a4b953f5fc7cdf10195685fab3de71ff39c5fa3ec76b9d6942755a25d9e34e50973fc71b24f717822053eaebe0f7bf47dd894aefccde6fc35b2eff5d70a531e51893eec1e83f2a8a1739dec83ad4f05c4717d0a1c2b191c37a4c0b185f0dc62ca8da66c35d7dc20fb9a6ef1acd9df64ca532aee63ae3e5c795c3d71f2b8e7c3cad3ee91a7dd946d449e36536e366587479e0ea3834eb3bfc5479ead9e73d4164e19ba3755a0781d79d11c5f64ea2c31dfe1d836158f65506e8ff352eaf25265ca4ed2862b43974ab4e72e158f8350ee30e79ff45cb782d0b2f1653bb69df0033407435eeffacd4eaeede208661767747f3fa4a654b4082a019a41d320f7cad40910902e810d7cf660b3b33ad598d2042c59483fe638b33a8a375ab3908d9132c277076e87748d71247a2bb989d7929a00e626f4df1849a166f4f16eccc020891ad7671ab4838ce355b77457755dff255219d0cd4ee8346c4c77180f745340ef96663bb9662a9120ddf25e7355d374b2c1497dc405744aef4f2087bdb87d889c8e21f73dfad82ce6a6f77476daaecb67b1b564d9a7f5775b9b7d06323b8ff6a4903beea49eae9a3ab534c07d14edf32d8dcc874600fa925bc60d174731eabf94a489b73074820c24be3d86c601842c9270ac51453137be9a846078199325b4dbb78377b34e34fd64b12303eade8c12c435bcb16af7bfa65a76fcb73851b4832a8a29fe9614a2f9010bf46a23eb9328f88b505cbc38068c7ae18fd8e0c7a1676f0ee177ea8d63bdf00a28c19e2951019175c8fe88a932accb21fd6d540b715f3dd267a06b7b64226092966240b214814eee465331cb415d64831a474e7df362e9dc64843fd84be6a488831dc53c68838f49726d61d254643227d769de7861ea8d73bb5efe4fb15d2fcb502fe9b4c66966914d33cb72ed04a9a3be9f5e96cfc915d70b7cec189631b69d8a070ec1c536047196e6862882c9e9b1fbad5d5f7b5723f110739e07fa7a5b3aed8f290c2fea3d98daf12c473cb75b93fc701c710817db10c6b9a4a74411eed7c79c0140179e1dc79809f9e31052bfa4ade229935d823c5c7d17d30b3855fa0039f1477f6560f45721fa307897e496d34c894d33385b373e2f9ae9c3f973c8f26fa3149359d6cbeac07a59837aa9f7d14be6bc725a29b5682506317dad2550fe4f7f8a977a4400e762882fb1a9bc7c7e92d6f4ba0b488f2a03771715be3967d8ce62a94d3580de7a0b5390a026a9a68257cd321b7130864a5b9608b60c23e1590d0c4464800644baac2b0c69519ddb3e49ed97f2ed2fe7dadf606b1f262307f55f4cffa7e6036a4e63ad301c95719eb0d1e209ab8a2c70fb78c20a1b71a8bfc91625bc8457f184cb39c29b3324bcd24618c4d81284f01a9ef02a5b50c0d6aee43028041993db43c256959cd9a3f76f43ef8739d83e1d7a9d9bb40de6fba02ec73433deeeb461eef80514e0aeb98ec9e9abb0898a249c7c07c28c1e56731eb8dde6816b8d071ed0ff53c4dbe0aef1201e1b32f7a3c3f8dc1a8e871d361eca92a2407ce41aa6d5b55cab3b6dad569056b9d6d38b38eb6c7c8027ece24cac1af50f5baeef879109743893fac23bc622fcea1627315cc5335c61735df4e75c0e00bdc96938f7dd6d0b5f5667ab51f6c15faaf639875bcf99dd1e3f876bcaaac355723cd4da78589ee47010adc2b6b9816b73afadcd75acbbb96da7e76c1b392ef6d9b880a90e686334541b9b6cfe8171764cd43ffc0602136899d91ddac07a9745dec92d8ce57b7d4253fadce81ee9f956e896d4dca695e921ebd06965d8e01c7b33675af536d3020ac35cdee4635c5b6cad80713558b4115b43c18a03d89a1cefebf826b7724d46fd9a6cf56c4235b9cdd62464e131959c85ffb3245c165e65230ef5e1fe4a26c9f2768e7063868477d8220ae62fb99c0c8773f7910a4c4284ef73613dd47eef28daeebf4dca3e6b9d9a05ce3b7772ba3994a16e7671849b33245c6d533a268bc3a24a77e7587b55a73aa7cf0de9fa637847168ed331761bb6e0de3f70ce275ee56f10876d0859ede108da438d5259e58eb395dd369542167434884acb7995d6d808834a8f05217c8427bcc746186cab2508e11a9e70ad8d3048088bd4ac536221669ff672c44f6481f83e1b71889927ad61c84bb989a7bcdf4619e6445a8380ed332752c78592531986927a5b28c161dc6dd150c2a55572b741da028794760c296025125c72a1a5c1a6091c12decaaba09e5e40ef088c7ea772a730b2c51987789473aaae0c9d2a6653258eac074555e937ade8f676a9a716fd15793ab022bb5191900465872f4e8d07b8a07b26c3a0dbc875423d59e8840e729dd0d94c3ba1268eed735960fb10c7f6f94cd96eb639cd06f9f897ad89527fb7b910c416ab79740e73467e3143233f62230c06702908e1769ef051ce522e676a29c76c9682d37737e72dbc6623b45e0982f8361e97161be23061743508619f99a5e35c44e9cd424439c111efcb02f19336e2d073f70781c467f4d3ca59f740a6d67dca4619e6d4e02199d4d37866136a4ead8d339cc733349c760efe273284bf8383ff5aa6f077da284352783d08cb3e4961978d3044f01b4108fb44f0d39cf6201a26cd2e372a6e5893bc86a8016fa540e737abcb111dc6206c8e62c072c22a9ca7c12cbe90258c997473123c6993a04d29a64d87dffb3abc0fea7c0402ef8c96ea2e4ac573ca1f4f3c9338c31846be339c7c8336f9da436bc85df1e2eac74fd6c1c0b4c348d8c34978cb26e1715642b77bbe8f7bc075a20ddeb1ac3fe465b2ad560c23d5594eaa219b54c758a968fb8e3c9d689d4ea2f19c8f045e39a95607f4b5e3216f409ee3241ab649d41ac8d3da340fa3c8bbf35454e69e965e1439cfc9366293ad5fb9130cee8a61fa40a0c301a486b7f1d13dd056cf5ccd2e9d303ad679157533a6257f88b51b8c2c707614d7a0814c40377e8d575afa1c4436747c81c361d486c335411c9cb894f8368a015c9630aeb7c3184bc3a091ae1f5fe41019b321b2db63f56db88e7008d37a1a8bcea3ec77f4f7bb59b2e04b1c9fb76d7c9e9ed35ce27417373de695a3dbc8e1e79561e88791f43227e91d9ba42d6c64b545f8442dcd26f56b527de0154ea6bb36999a43f7816e2fef3d3b833a8bf7fece9ad7411c9cc6751e4692ab9c24e336493a03f512ddc8d7908926f99095f572523e6593b2d12325b5b8743c2b1b71ad8f93e069cee2c2f873a21f410f3f33b7d0eca2f13bbfe81d46927e4e92094e17f1c918ef548cc3f7cc9cff3b47a57bdd014e82494e82f475615bee9779eff31827c13d9b0463c2f953667903e75dd9d0f4e31c4ef783c48d0e44c091d6b5d53e7d2c5874c88ea69fe02498b249509d22be03f77ede946e4cb8c671f98c8dcb9aacf5a78e4c6138bdce713a6de3b49fe534398b71face1e3cfb8cbe7c08d732cd861833861f57a6dfa3dee07098099237503ba1d27759240fe6f97e5699be94373929676d529e64b50d378dba31ba4d61ee36e2e9b946e6d6a1f2baee48a89369647b9293ec814db2cbac64dc3c951bd78794fb5c56985cdc4f7fd9907e9093fea14dfab373fd9ffbc2c321e5dc6872725c4762fbb9703356d998df2ad57f115caedf859c4c6b4a971123670411c595e9b1399952bf5c09d09ec4f7414c685db9bd72ea572d3d52fcab9692971ca5fbd69d5452d8f2930692a150e952cbc4bf61a8d448e4d2d248e362f08526e9b3a0d588d16a511497a2ef4fd39a5273f11cb4b6c86e43e1df33e21070473411e7eee0946ed87156dbcb4f52b699ea11a07a24e03e959785378e81a13913b1d3cab9f1011f707b0ff1d359b3bcf45e3d93ec232b312a3d8b39d834d21bf5fa0c3e67906f9cbf8dda7c6d20bb8987617bf88c41187efb9b3c42c62042be034038ed0694180494774a7a3ddc1d878e7642579ac0d433eec0b6542478d212f3f29ac94bab9626c48d3541804827767461ec70607f9724eceb0dec4e1e720fa1e733f8037250964a41d946a07cb724942b0d94cd1e40e3cf818a81b74a0abc5d04bce725c1731f2a1d31f173d66387aea4a236582505e33a02e37be6d39d1387358291b1460aca3d04caf7e6024ace221323a320946291711981f27d92506eb358e5c2eebf0f1068df2f096da581f60eebf2947dd1e8592605e63602e60bf904a6a0658a815946c0fc402ec0e4e2a777fe5010cc2629307710303f280926bc690c6ec63dc29b726338241c2ec07cb29800f662fef4de870ab0f75e4fa0fc902494eeb8e6e0021ad75411f05e92046fb30a9afa24a6e682fd74bb14a84708a81fce475005bb183150eb09a81f910475bf4a9c80a36b5ce08d8de9ad741405fd8814e8d504f48f4a82bec280eef4e900bb4b7b3cf92e47f6802b96024e11e03e2609dc5e8fb502195865665b9d39e8b3562d4796da2d05788c00feb224e0e5be963a2307dd3229e88a08741f97842e552e5af883ca5202e52724a104099c7190b38c0f16768c9bdb6c85374b544260fba4246c6e0a1f5b4029fc0a02dea772e1bec1e6d41b0b704ebd9d40f9e9f98c8489a3724128c546e5ab09949f9184729305cad44b14053b973a29483711483f9b0b48530f2b0b1dd25304d2cf49425a151852fbc24b4170c53aa63a02ee2bf3194d0bff666f0581f2f3f3d9c717fecdde1602e51724a1dcadf879a470b348a240774a01dd4080fea224d0c197cc08c228b664661581f14bf3e9fa399b97178ba22709945f9684b2c1e3fac3b870f5697c84d07961cda8f5712ffef19cf8dbdf44adb85a0afa6602fd57e6331748ecc00e176007b68140f9554928ddc992a6053459b29d80f7b55cf4fe349abe99ee1cd510a0bf2e09f40e0bd0ce6faec0cfaedd536795f373ea0b6daa791101f81bf913519b0a30a2ae25507e5312ca9d9ebc6084bc286d61af03dd4f20fe9624c4d51e8801c447e637c217fe944b94c0fc6d4998dd458d34eaf2379745c1dc2605e63102e67724c17413ad030b28d12a27e07d5712bc98c7e1c795ed41f7d1402fa3583881a093c0ff3d49f8d3bbfd2278474bec5ec15602e9f725210d97701d2dc0846b3381f207b988acc98b75ee992a85075e8480f74349f0dc9f93e5260473f4384d8514907b0990afe60b90829d8d1890b504c81fe50b90070b10c82602e48ff30548c1be5a0cc84602e44ff20548c1876bc4803c4180fc69be002938c72406e47102e4cf24810c973d16e28b2c9613287f2e0965668f6b0b422b364d779840fb0b4968d31b360a422a366cdc4220fda524a4b00e98ae31b98016e9dc34165c145e2e05dc6202dcaf24817307898716d0f4db4e02deaff3a7bb692ec0eea69240f99b5cd86163eeed50ac435949c0fbad24786efec8d961a14f562c2540be962f4016e264c51202e4ef2481b4dd22a30417c27b3ff611307f9f4f600abab818980709987fc82730056780c4c03c44c0fc633e8129382f2906e65102e69ff2094cc1992031305b09987fce273005e727c5c0ec2060be2e09a66d2e28f15767dcb25d5787df94829f72be8f8b1045fb76b1f1f76e02ed5f24a10d3784148c9f6243c83504cabfe60f94470a10ca8d6ac1bc4c3e062b4afe46cda136c5245e2df3febbda88dffb209c77bdaf3608ddd37c5e506358c37943fc908abff73d0a718efc405bb01f4cf0a709f8f853fbbb222fb0f76876226b9acdc68be66d92a6968fb792321fad44e199b2052dff3f40ef46ed68a695f89304f4c70b2e29f8b902600a3ec5ff07c7914bdf84b80000 serializedProgramBytesString: - serializedSignature: b457924834fb1de13f77518e136d7548649205294582825c8f8d7be30647ac88c629d805010455b8d7df0b327cf5f7b6344c43218b040a3b941e0a054d69380c + serializedSignature: 811af31d5541165467cb0725385587828c1839fb3df8e4f512a56bf18a74807d360258758ad4807aced69826225063d70836a8f058660c5a104d0660ff59b70c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset b/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset index d4fcdb2..34601b6 100644 --- a/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset +++ b/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1cd959c0dfcaaab6e46ecbbd9cedf39e8b766dcbbdc996655b6ed2c992ec73395b9656b2eed44eb274f65dae91a31d2484244002a143e825d40402841e204080a3b703420ffd80a386f7bd79e3fde6edfb766676f65bef98483fed68decc7ceffbfeef7bfdcddb8a94903f896df2a357748956d1247ac480181763f2bf56791c95bfce991bde2926e571487ef6c96bdbc43a9f27e167736299fc6c976753e28e7c725af4cbe3b0ba7e5164e4ffedf2d98c3c83d041f9979177252ae5433de284e81017446362898f885ef5d0940e4b805d895af9795cdc9357334a298824a52e35ca8f8bf2ca94ba362a9576efbb2aae2bb346e5b57ef9cca41891326f2989b56f3608f58f700ecbf4b1511f17c9bf3afd7f85febf56ff8fef5fae8f8b03debf421f9704bc7fa53e2e0d78ff6a7d5cab8f3be45fb5fc1b46e795daf22a794cebf09dfabea70c393bf3c881631ae995d6b2af69d9ef3564edd2329e46e7705c879e87eb2386bc4fe8f3f5fab8ca87c51a83c16e43f7dd8edc8a4a47cf8a661dbec760b006855372e0d88cf469d6b26f6ad9ef3364ed3518ec3518341b0c5c799f0cc9e01183fd467d8fd4a9f28b75d8067ddc8764ed33d81d306c3ee0e833abc591356b42871f34d8ed43e1941c38ee4771efd7b23fa065bf6ec83a64b03b64b0db6fb0d3f22aeb43b273d3eab0119fabc71123fc300a77e5c3f5d13c71e4cbc31bf5f1a8963386cec19e8fea74fc9471ff061fbb96e8e331749f9bcec751d8311406c716adc7b8115fabc161933e9e40b266e9639bbe7702dde386c3f1a4befe0c3a97b6367cd890e33e774adf3f89cee1d86e306bd7c7d33a7c0a9d4bf9d5b50ecbea1643ce19c3b656148ee58d1af22e3bf21adea5c3ab0cbdcfeae7eea07378eee3fa7c8e71ff397dffb43e5f8cc2b1bc1943de1b861e6eda9fb7a4fd0514761e85c1b1c348fb0e477edd5bfabcdad0b7cbb0afcbb9bf76a3a1877bec41713faa9f7dd6b867b33e5ed6d7efa27338ded4e1f7d0391cafe8f0e7f4b95b0eb8baf6196cafa0706ccb8cf0da72c8605b63c8bd6830b8a899ad33ec4aeae32dc3ae5bfad88dd874ebb8ddbaf0317dec17f7cbf5da3774d816e31afcdf60e83860d8de8fc2b10d33c26bc33ec3f65a43ee25c3f64bfa395737d7f6adfa98316ccfe8e3a00e7f5e9fcf35e21932f41f44e1588f19e1d5e32d43ffa5fad82972f3c5e328ac138561df1847e752fe1cd7c7dce77c7c62f69b861edb447e5f7f12c99e67c4715b3ff33674af1b8e7518f5eaa074c64c661b72bb0dddb52fce71cfe71bf7f7e8fb5f40e758ce8be8dcd5a34e7874aa5f45c8ee3564f7eae376e12d3bdcf0261f9e9750dc970c4e53c2ab53b3c1a95278cb9909748e757e425f7f099d83bc571d79f5af1bf2dce7ae0a6f1d77551faf096f1d77cd8867ca88e7d384de6e3cd78d78ae8bacffe03ad0f5a775fa784378db5b371cd90dd77ce2db60c4676babb8f7a6d0393cf3b223bbca4dbfa06d1f4f585542f5484fcbd2a64fa65a4add04256ad0aeb3fba47fa7194457c307fc6c56d1de9115d5841460e9b9f6a87ef11dd933da69edb92e4fd423bd5bd5679fbc6358097d25378a8fe44401ca8dc8df0cea764fc9f053aad70e1def6179a549363086d553376557efaafcf54ae995d18ec8c2372333f1b48c0ae4dd946ae7dee9671274d1cd67baa44c6704615486b84027e4f988d2f0a2fa9c519a6694f6ed32ec8e1acf189355c07179bcab62cbb57d52fe6f8bb35b23b3eb681f48a0c29de10a37994e486b40fb946ac37e36451e448a00faea577436ac4ca912e9b59c94f82c43a790814e4bbb96b143214b78c2768a94ead774e5100c6f63ae8576ff7678ef11cd796db19381e45ea92cc8a6f0dc0f7ee8b5f7efd979afca6bda2e91525d9a553ea6e5030bf29289a53912f29b5055559906454dfc091b7ed5e5b85842fcce7dc3eabef00950ad6a266f022416086802666494191904790a8475a947a1dc9c50cae6a44f1a84d528c4b915a89f9a14e40a1be4da5243f62f55f241aebd6f571632fcd809d61104fd74a008ceb211542db26bac04dde6d74559cf9e95d7fae4fd19559643b8e353ee448013e6bd333fd3d9f7adca324da9c075a8b95868dc7374a356fdd454d913aa5e255431a2a392aed292746948ba068bf569b07eaea1789da1b8ea51da23abb2f9891af5ea2d614e836be34a4a9fbc979a28caef1bf36cbea1faff2b722c0916df7cdd4151653ee10e0b943b141a03e502d536178054596873013072915757d30316d01e5043c5b5988a6b49c171d552712da5e26a2c38ae3a2aae65545ccb0b8e6b3615d70a2aae9505c735c7966355d1d05dc21c9bad950acbadab6cb9558d2a2ecbb1c23faed52ecd4a3aa7ae5139b510e9542eadb7a53aa4c45a5baa8371ebbc7a9aa9be864ef5062aaef5545c8f141cd75c2aae0d545c1b0b8e6b9e25ae940aec29a137e3766a61febcc9e6cf6ab474798e1d416273275fd40fd516d9ac5cbab00828a79e6f4b10288e124fb326488f0c73c6cddad4d56135d8929539aece2136d7a27c4f40929c57eb52a6952ef9132f694b3c55d5c27827af668f0549e82d2aa1f995a19c620155bf6da5eab76d05d76f0ba9b8b6537135151cd7229bb3abc0d28fa514d6cb049f680cdccb4c8b7c432161fb988b6d2905f476504a994993a69366892d69548ca5e9c066e70fdcff8ecb676f4b7b66d4a0f0b47cde36df903fb960fdd676838c3da97609b39f59a84654f22db5251f106eb6296926dd2e3ae91a29bfd85d04bf5866130eb97f8fc81d6ff98cfcc9115e470b5f4e69beb7089aafb00907defb22f25e4909de1f51f02a8be094ca98a5ec6a78bbd2e18b4858dbb6d54c3b7ba63b28ec7d047f15a84cb6da8650e5bc2b2529c6f20d4e153606772870117658d15c23820d95851d265b63f37a207b2488d71fa6bd7ead2dc9549956cac1e70ee9544f09671232bccf1f0d9c482dc23ef0ec173f952ceb6cc902634cc78465d2c15a86d6d069b3de261d4aa4e3d64c6e4a3e484b7e84aa575a2df5ca9b1516e179ea950d36e1e0ab2722faea464a705b44c19b6c82a1263c59849af051ca474ed97c04621d12f026c20d193cacde351897deeab478205fb9b37f613c6933a5c3699b0e5013de90bf69f9174c17b87b52dd1946ab24a555bb4d2b18761c91713f2bcec940b87f4cea702f548c8f51097dc692d01521137a0b25fcac457822a4f0ad14ab733656307e05139977d594e694aacea785bbc0230cb16d54bce76df1d629ef9d541e32212ea8977bc279ea762abe0bb6f8aa94a7762b1bc3f95e13154f872d9eb9284764e32bcceb53949b7416c14dd236e15065c0dad14855c60e4a725754c93b6d929d6e7bb4627d1795c6dd4104e749c2668a454f5416bb29c9bd5125efa1285f8a48792f45f97244cafb288d9f88a8f17e0af295a8900f5092af46957c9082712d228c4354f25d8f987c8729c14f46147c84127c23a2e0a354eadd8c9a7a2d94e4bea8928f5924a7d4b011bc9550fa190cb32755bc798b5bb6d4b5f6f2e07d9264628ba02710a26849f5058fdbd218526220885bf6d349dc4af97b26a2bf9fb009869608b84ed46e4f1b257ca808c24f52f9e976d4fc748a2a67872396b3a729959f8aaa723b25f9e9a892cf509e3712d1f3ce522a8f4655f91ce576634570bbf354161f8f98c52f508227220aeea0403f13157427a5f26444951fa7044f4514dc45b1b81395c5454af27454c9dd94e499a8927b6c92611ee5d92098f3cca3f45282ef46147c8962712f2a8bcb36c9304afc5c10955b68c14f502a3f1f55e52b36c950cec10b9851cbb9ab36e15009be1084479e4af01ac5e3c5a83cae532abf1451e5276d82a16a7b3988e03c75e00d8ac52b5159dcb4484ea9d9ded22ff4808187f0333a9f23f55c94e3c4f6d6fedb45be651e54fc542bbe8fca57af16215fdda2ca99cf8d58cef4535a7f5e11b41ea0847f7e11846728245f1011c920a5f5171641eb214af86b45107e9b2a71be286289334c09864d7972c6bc4f18390af7999bd4d8f7b82c276ec88ede33f2813e95afa0070d57a8e7f25df15ef32e420863e5539495efb059d924dc097bef443c9eac77ac7567c2da54f9e85aeaf76c18cd9fa6347fa74df38d81353fa535f712c6eb66c368394269f92541bc08c71ac68bf073f9ae14cb8b46292bdf65b3f264402bdbd5b85279593a4659faa5364b0f105ed7a3da108e4dc3baa57043593ca51f87f9e3fc6543b12c1aa72c7ab7cd22e808d9c7ffa8128f4a457f29c1ee291687098ac37b6c1c36193e7c4cfa1a6ccf78cf28ffce898cd2fc8eaca84c5db34b6bc3e8f90ca5e77b6d7a1e33f4ccc689d3e89cf2c129d981beadb8d19ad2e1c54a8749cabe2f0b93c370b96ea68dbd84f7da52cc9a6a8ab2e8cb6d161d3152cc4b12a71ae48e3ea9cd3d71415e1d52eb3c9c350bf953a378697587b2ec2b6c9635e7b5ac90542a8e15d39415efb35991267354540b0a2b0f6628eddf6fd3be35507910a4e62d6599f02c65e3575275949b579d75ee789f1f473fe8a70f8a3edd4f6fbf7f679be4e9bc24d3a56a988cb47e46dddda4ed81ab0352e2b4b20be4669fc9df3af15eeb95cf422d1f86c35d8ac357d9385c61e4e0f8b67763e25e551a0dcbcf5b2a95c3d0c0757a1822f728221fb011d969787fabb2d5b1cb6db574cbb0ec6848983658f6a930163c4759f0d5360b7684b2802e656cb61556fe3c4fe9ff35d153c0a6bf7f0a84b5e06d94055f1bc402ecd5516b80427b992f50167c5d100b30d1a816149a8f5fa42cf87a9b05d0aa0ddb0b1955db440deb3dd882f6408a5583bd44d9f70d36fb4e07aaa5cd567b874cb9ecc8c083acaf5fa6acfd469bb54703597b4cd64c03bac76c6be386b7cfafb4a891bf8904bc5fdaa6ee849676a7aab5e16c4aa4d46b5be9fbb5acff6e8410fba8f42fa0da7dbf9ef4df9bf09b04bd3761eecaa542b7a9f3b3c2d66268426d066c9dbf4df4967c35da22579624adde637bd82cfd664855f705ef8a947aa56e6b81dee4afc50721b659761f0abf3d9723c05db39e8019ebec926fe7cb218ec9dc3da012c569260eea6932dfb8fdde2fdaae04b86f531461ab4ee71d24285e2675910ae3963555156948936fe10437df02ae53de0a7df941f5d8682c80a511b06fe504b6c802ccfeba4d1cb0dd44d8be8d13db6c0fb6ecd67d7180f46a6516d2b7973a339ed2179d45adf1f02a81bcea3b38812df400cbce5c78b7861c8805b48f29683555867073b2aa58bb00fb91a69b47b005529bb8ab76749954f206cce6927ab5bcdc34ff4edcdc4906ca6cf6bbccfa3119a25248866aaa24037b78922c61b3bd087beb3f0dbd88ef12ffbf1bf86968e07f374018d6109cd2eb7b384baf653ac59cfedc98ea33e79b358177e40c1da26c3e5ce729d30e0631b09072ed22aa0cbe9713e7521f9cdee1df1d7c286bb850ee45283ff420517ac7a8d27c285bb8505e4628bfaf1428fb7529692eabf27a25234a36af5c87507e3f27ca959e1acebf4eccbef11dbf52731582fa03e55509ed8921ce2710ce1fe4c409dbb20ce5efb2150f579a0bd72284eb873871c1d6177d44e3778a0fdc662e70f310b81fe604d7a8b3ed1099717b3c330f8c154b1d17cc4710cc0f97022655479b6520234cb612703d82f9114e98e11a3cbb63d8e0d98650fe08274ae8b44f89dc0d9c184bc6355cd0ea11b41fe584e6b61271b91864a69dd113fbb9a03e8ea07eb41ca136c7106a2782fa63e508957114880dea0504f5c7cb11eace18423d8fa0fe443942651c6463837a1c41fd583942656c7db2413d86a0fe2427d41516a87eef52b0fae9612ea47b10d29fe2441a6e5c9d717488ad41ff2442f9d39c281b344a8878508174650fe7ce52170f5c15173881c0fd0c2738771a7687f6c309312d9ce5b1136ad13fdc16bf2cbc11e1fb594e7cab35be1179d38807a123e8619b926845607fae14652335d811ff41b86508e5cf73a20c3f11c1586bb30dc375209c1fe7c4099b203b917ab793eed21b23b2a15bc085ae16a1fb855264ea600d1ec6de385bf97818a1fc454e94502c4d18cba5e2387a390701fb254e6010d18c08b09cb878d07671415b82a07d82131a2c7deb472fc4c6b78c9b8d90fd32273268505313aff1c55787f0fdca83ac224a36b6d8c285328350fe2a7789e75410ee7784c4d7ff6a10b44f72428375067866107fc98ab3a14ffcead80604efd738e13d2abcbd617b7d8bf7417ad81603b420d4bfce5dcd64bf9cc8fdaa99128ddbb0356c56227cbfc1896f8da59af1eea8417fdf26eba8361bda5e84f6f552d4e0c196a930d6e06c9dbccd08e56f72a20c3f72c3b82c80adccec46387feb417a66fc17dfaf45287fbb1428838de4c471a47b1742f93b9c2861fd16d5618c5f35b31461fbdd07e981255b2fc196996f2194bf573e35f6de1866e62684f2f739514257cb9983cea8e398eaf138ab2118bb8ef55ce06621707fc0092e7c5387d10fd99a3ad710ce3fe4c4b956787be2deb7b7fcd7ed30d6d86c93fefb10dc3f2a67b8715c14751dc1fd634eb8f8bdfc5135f8d62ffbdf251cdc6043b806217c831321cc75381e3922c53caef6620361f11bf65d8890fd0927b2f596eac779c315467cc6c419791c553ef8702d42a94080ff941370b83626e330065b1b732b42f9679c2861018aede5a5f8ceee5423749fe244b74498cbf5e82d2519b333dbebc52710c83fe70459d86a70c6c15eb65afb2042fa179c48f18ccec3b3127735c2f797a5a860828d48c6f1edd83308e55f71a284850378d54fb76e3f320e606ce182361f41fbeb52542d94ff39aa3bbbb333562d6fe702791381fc1b4e90e1478218ab15b691a02e84f36f39719a8315cee8248c4f3ebc2341a710dc4f73c29d27a8d78ec6f42df1ab661208dedf3df812d3698c330e99b135c6cf21907f5f2e20e3d8ab694320ffa15c4032be9dc006b20f81fcc77201c9587bb381bc8240fe53b98064ecd3b0811c4020ffb95c40328e3eb281ec4720ffa55c40324ed1b2811c4220df2c17908ceffeb3811c4420ff951364b8919f382e383d8450fe1b274aef76ebb95b9e9760e357b64ee10604f1df4be18fc1a6bae2b85df6a308e55b9c28615d93f9966b7ca7b9aa10b6ffe0c4167e088db1edc836847609e1fc4f4e9cb5162f8c5f7dbc18e1fa2f4e5ceea098b382c7d9a9b944d3586cf01a11bcff2e9fca238e7b426d4728ff87bbf298bcdf74019903315e895b89b0fd2f27b6c2a6f6e3384db01321fd4c293275b01e4a1c17d8df46286106810d2534cef0e2a72e91bb134f1cdfd19e8b0026380142d4d9c5a19d320bc7af21bd00c1aae0f636b72983bd2eeeef59af40006771020cdf1389e35bff6711ce4a4e9cee9821d53a8cfb94e963086455b9808ce394e92604b2ba5c40c671ca348540d6940bc8384e996e41206b394116d67f61f44db6fecb5584b48e136963c85a7c5f0cebf0d308e6ec7282b93f8630db11cc39e504338eadcb3482595f4e30e3b84df00e04b3a19c60c6711173338239b79c60c6f1eb9c772398f3ca09661cf794da8f60ce2f2798719c683d80602e28279871fcc2dca308e6c2728219c7fd544e22988b3861e28551e65280b8cf6d2f47101773420c370d16c73d008e20944b385146dbbf94b117c43665d183d02e2d8597065b8111c72fa94822948de535fb13c791a31b0a674d9521fc648ef056652c98db2fb273d54de29480f705338a6cbf3c3f278ff0d44d09e4aafc0d9706d7e5af2d3ca11666b589bb523d080579034af6a8bc3aae96c5a4e175fd65e012f3b54b247db6b44be65d6693ccbb823399f0dbca249967137be7e97cdfc4930cf4650c49f25b2e92c4b7ac24f37c7f7432c00ef2c980ab181cf694feae1ef637f5939689fe24b93314b86f426905fe009a9e17b0cabb4fc6dca78eddf2ef968a3705754f02be24d1a9709aee57358e878f8a517de686fbcb047fcd2f6d79c299c8b295532345cb697e163985033c3f2875ef57f420d4cf527ffbe85c5b9f275552f076f7436dff0a48779decca4d1b95d3f7c8941fd019ab43de3ca094829faaff03ef42305587f90000 serializedProgramBytesString: - serializedSignature: 841681616626c747bd0527b6b5ede80a800fa57b9552a63683869d18077d0d258e823a9afdf490c0193d06cb91f8b3aecc9c9600b63c45b31c2d270833a6f80b + serializedSignature: 83b2df11305438a0409619cdbeb0777f5304594b3ff36311a0cc755ca2aadb75f4798efe0f00e5b38e256745e262cdcd2ea48090e38c4447bd0ba408839b3f07 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset b/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset index 46e6645..c8c037f 100644 --- a/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset +++ b/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c14c5dbc7e70e42470141ba82a206911a0845544a68d209200a08210921124820a159b137ec5d51b1f7de3b2af6debb6247fff6de7d776667ee9e9dcc73b9cdee73ccf2aa1fbd6cfbed33df79a6cfcec47b32e79fd86eceffa6b3296c38ebc1a6b12256ce163b7f0d777e1739ffba47eafc24b6d4f92d71fe5fe05cdb8d75aae149fecf2eb136ceffc7384795acca7972192b747e4bc5f57c56ecfc3dc679b6d839e267e73bff153b77c5ea3a0f4d63796c229bc05ac75ad520315d3c5429cfc578b8620d9cff0f63ab9cabc5c228fe929ee2526be77ff9ce954a716d9163b4ba6f269b2d82b5c8b956e83cb39495399af384628305554cfcc1dc9f6ef27737f9bbabf35f43f9771df97703f937bc9f9fe7a19b95e2deeee05ea5d9c3f92fcbf9ef3779dcd33d8eff258f7bb9c7b1969a4623a0d15bfef691bf39f2b7aff35f3d47ebed34ec4f75ad9f6b43d554799c2b7f07c8dffef259e79eca2a796ea0fc6d237f0725ef997aa63cb7bbfb1bdb57daf90e387658c65e95f7b590bf9d4198b791bf5dc0b9c152e75dc94c31dc43feee297ff7d2f8bc1790cf1019672aac2a8e1ab3f47ca791fc1d5ac3fda9341acbdf6101349ab8dceb744a716f7770af7acf7037fce23e9566783cee97bc47fc1d73f505f3f7b5f359f2fc07daf97ac8f9fac8f906def34e5ee35e9f096c99e97d26364b3eb3111c3b766675d03466cbfb3e0436433d75fd23edb9fde5f98f4198e073fb23cfcdd19eabaf3d3707796eaef65c03edb9b9dee7d479956f88637efd13378c753e91d747b8c759a3d3f0a554d746c9f7cc93eff9141cf3df0279fe3370cce3e37af9fe77a58eb42356a8e914a6d6e1f8511bf766defc77a4c6b648f39522a939da7daede6a96f4737ebd58deffb9574f9c877a9bbc7af5d7cafb551e7988bcef0b797eac6697bafe91763d07bc175e577170bc3cff2538e6bf4721ef1ba75dd7df371ec40dbc3ec17b5fec0479fd7fdaf15729e2a6a916e6f9f299afc1b1c3aec19b35b09b58033b753d2c764a0f63a7ae63ec2679efab153b15d6135932dfaeabf964a9d4f906dcabcef3df15ccebfb2b5c8d46aba54e96a65722efff161c43dd35daf535f2f72460a3627d72f29cb8aecef1df43a5ce77e098dbd5576ad4d3ec5aa8bd77a16697f287efc131cc6fd4fb7ed0de3703e7afb41379ec89cc93c736507137d91f4ba7c65b8d159b0ace4d97bfd3c039556e2d00e7a00fc87a5aaf05f2da1479ed0010070b34df3840f3d97dfcb1f78443952f301c8a2d0c872a47cb0ce15894221c8b4138cac0fdea1a0cc7bef2b7bea65fae85a3dc100e5527a9291caa5caf308463498a702c05e1a800f7ab6b301caa8c6fa0e9576ae1a80c100e55cfa8328463598a702c07e1a802f7ab6b301c63e47995177d0a8e9d34b815d3ee5bc93ce5af3886e950e96cd2749e44e27d959757b5eb076a3c0f94bf0769761ca4d971b0bcfea3d7fe6a65d4f7c00ef51cbcfe93167e95577d0a8e9df06d9daddd779866df61f2fa384d6793a6f31de257ab354efaf5c3354e87cbdf23343b8ed0381d897052d755d9fa3db0433d07af2b4e7a197834f39681476bfac7b064be6d7a5e5dff599e9f85dc77acf69e63b5f71ca78553d543791ba321b8879fdb9f25d2563365576debe673a5f6a99adf9c2a7f4f61de3af5296ed89acbfa6f7395be0ae4f5d3349dd36ad0599bc2c679cc5b379fc3bc69e474e6ad9f9c2e356519db42b5e754ddfc0cafaf293d711eea6df2ea6da3fa3d54fdf21ae6adef156a76a9eb1f69d773c07be1751507d7326ffdf25af97b1df2be71da75fd7daa7e59a05d2ff2de17bb9e79eb97ead84fddfc4ce6ad9b9fe9b26ba9fa873076c535b053d7c362a7f43076ea3ac66ebef7be5ab1537539e5cfaa0e06c2c340dd4ba52db69025d27ddf26f29caa979d95bc5ffccdafa9baced9d2a65fc0b11337ad54ff95c946593f4ad44b555a398779f3f173e4f572c3fb61fd46d54b978073aa5e7a2e38a7de735e32acbdaf96d716cb6be783779d0bee57d7607c2d95bff534fd0bb4705c906638543d088643d54bd71ac271618a705c04deb516dcafaec170a87a5a7d4dff622d1c17070887aa97ae3384e39214e1b814bc6b1db85f5d83e150f941034dff322d1c97050887aa975e6e08c71529c2712578d7e5e07e750d86a3aea67b15f396ef57c9ebaa7cbf9a79cb77fd79755dd5239679af335867561c5624c3d226557e934e3d40d9a3ea9937487b7e05c7ce3d6dc7a5d05275019597dfc8bce5f38d52e328d7e6b6f77bdf1dbb8979cbe795e03cd4dbe4d56b77b3bc5f9531b7336f9e7f20380f756f93f7fda61d2b965bc9f337cbf3bf8363fedeb5defb98ac9b3355f7ff43bb7e88f61efdbaaa73ff9982b15eee2adb7ef1dad65e950faa5eafe26675d2673adc2d7fd76adaca676fd1b46f91daaa3d77b8a67d44527ba72188b62a776fd5b46f95da1be47d476ada4725b53bfda56963f17eb4f7dd68fcff5543fcdfa1c5ff1daead1d3647fcabf4aac5953836b55356cb77dec93cf953c27fee62c97ce52e702fffbd9b79d3efddae6ea7f552234b7bc7bdcc9b87dfabe9dea75dbf4ffede036cb847fedeaf31bfdf7d77c7f5ee7bb753751715f70f6a717f0c380f6d7c9879d3bc3afe4afad6b95adc3fa0d9f180643044dea7da71795a3c7c54837d7afbef41ed39755de5b7abbdd715d3c4f30f69f1af9e1faf5dd7f577d3fc43e9ab7858cfbcf5eaf51a373d3cc769d7d5fb54fd4bc5c3239a2f3ca2f9caa3ccd3ae4fe81faf5d57fa2778ef8b6d609e7ab9ef34ba01b9aea7513d5c8f69e17a4c0bd7e3de7025383feed5ad16bf7781f875fcb4a3cadfb17c40d533c2c8438e92363cc1cc79c8932c997e9f04f7f2dfa798370f79cad5dd49696769ef7846e3f78ca6fbac76fd59f9fb34b0e169f9fb1cf3a6dde7dc77ef50d77def0eaaaf46a5d117349f3e069c8736beccbc79883a96794817355ea9f290e7353b9e77ede822f5981a2ba8290fd1edd3c7185ed09e53d7551ea28d4329a689e75fd4e25f3d3f5ebbaeebab3ce4094d5fc5c34bcc9b87bca471d3c3739c765dcf43543cbca2f9c22b9aafbccabc7988d23f5ebbaee7216a5ce835162c0f790db98ee5212a5caf6be17a5d0bd71bde702538bfe1d5ad16bf4f82f875fcb4b31a67cc441e22fb75636f32731ef2164ba6dfb7c0bdfcf76de6cd43de7675bbaa71a32ced1def6afcded574dfd3aecbf940b177800d6a6ed2fbcc9b76df77dfbdb3ecffdc791df3a6d18d9a4f1f03ce431b3f66de3c441dcb3ca46b27afcfc43ed0ecf8c0b5235bc5f11a2f4f340fd1ed53cfe568d73fd2aeab3ce408ef75c534f1fc875afcabe7c76bd7757d9587bca9e9ab78f88879f310755d71d3c3739c765dcf43543c7ca2f9c2279aaf7ccabc7988d23f5ebbaee7216a6cfb33162c0ff90cb98ee5212a5c9f6be152e32b2a5c9bbce14a70dee4d5ad16bf6f81f8e5ed3c35b72f481ea2f73d7cc1bc7d0f5fb8f7747d3285969c2390c84fbe64de3ce34b57834f55e376ef3ac0fbeed8ff98b7efe124701eea6dd2f4ae67def4f595e68f0782f350f76be64dffea389d3e772caf5561ff86559ff3a1defb2df3e4bfb16fc079fefb9dc6ed3b57a3979a1f9ba5e9fda0f9d90f9aee8fda75e90fb1ef59b57ec784e6cfda333f6b9a3f797d37e1375f2535633f79b9c77e91cffc0d8e9d70ed96edbd5f8d7da3f7cf00f6c3e74e66de745a4f0bd3af5a987ed5c2f4b5374c4a9f9d228f7fd3fc538ecf25f2b9dfbdbe10fb1d3cc77fffd0fcf70f373cddabbcf725fa67fe94f7ff038ef9ef5ff2fc079a7d7f6976feeb3d2fee6be87d4685418415e6a12a6c39e018fab9fefc4f019fff35e0f35f077cfe1b7fcf27def7670df7ff58c3fbbeade5f35f077cfed780cfff14f0f9efbdcfab349828e3141f59c6edba515e0f52c6a9bcf91f964c07f9f2dcbf52e75370eca4cdde5db4fbfe619e3c20f68fd79e38d3fc6c1a38cfefffdbbd5e8769ba7f6bfaffbae1ee9de7d549f0d174d4f36caa57a74e4cbb3e0584ddef5cf50a2fc7b8cc635539258e39b38daeed7d54ffa09ca7158f7bd9293d711eea6df2eaf599e4d561602e99d15ef5bebade3815c7ce7f39576bf7d5f3da1557e5868a53354f5ef9d812709effd6d1e254d99907ae8363116e7e7f5ce3a0f4d43cfb8de098dbbd4e8b07659f9a7fff895727a1db50b3bf1c3c07edd3ee17f6395a39aaceb7c4102e10ee844e4df193cac7e478791c7e6ba3de07bfed50752a391732de8479ea54f1c6e03cff55f9c44670ec68f47b51ea64697a5b334ffe248ea16e33ed7a33f9db1cd878803cd722794e5c57e7f8ef5652e73b70cced526d937a9a5ddb68efdd46b3ab25f3d461e2ea1ba685dafb7ed0de77b5a6a3f8672519a96b09bf6bcc3c7974dfbee0597e1f9cebead70fe49c25d60c689ceebe678c1ab796738612f34456266d6edb208d77a8b9496706b0536ac45b81386ee532e59f68897bba32af1fb792dcbe06c7fcfa5901ec50e5d4d9b5d050cf9e039e3d175c6ba8bdeb1cc33539f723d147e1372ed4dc8f8bdc67e6a836ad9c4b116fed32ab53071cf3eb606e4791aae7ca31c1f8b6c0be75886e5b4db7ad16576d9837df68e3c6ed800daede00d5cfdc41bbff33effd0365fec0e4dc983a2aff3231690bec87cf64a5782615db4be5ef650883f61a83f669b06d97642bfe86cc3a68cc3a4806bfb95a83148b0edafd9f79ef1fa4cacb4bd260d64eb3453d535b6632df8c7704e1ec28ed5a2fc321c3572d7d7794e1f9c5fbdceeaa3e24e7b3303837c664cb95487c6def8dafc4fb55bedc8979ca7b71bf3acf7fb7d3e2673b69dfb9eefb76577342ae728f17cb7938ec6a707f43f0773a6149877567a0dbd9b569f06eae0d8355bea2b3eeacb156cfa9711dc5fa9a1aecbb1661bda397b53886efdf8179f3f21de4fb6599b887cafbae4358ee00c2bc439ab6a6627983665f17e6ad537771eddb63ad767f57edfe8de0985fbf3e804d37b9612f53658a9c1fb36703f7fc9ebdb4b8bab18677297fd98979f38d9da4aefa16ed16244e77f6c66922bfdd8579db01bb306fbaca66de74b533380fedd9e8b5672f35c679ab66cf6d5ebbd81df2b9aed2be7ae098ffee2acfd707c7fcb9db59229f9ef3a6fb3b44f99d62d54d63d54ddaa6da427722fed90df8a77a46b56dd5f8f8dd69d821c7d8d9bdc8bdfc9c9a9ba2cad4fb91f8dbcd1b7f71d52faa7cbe3bf3fa7c77d7ee21729c9a3d207f1fd2f41fd4ded343bea70138e6d7f56fef7938d53719ebe5efc3c8bdfcdc23eef15cc56683fc7d54f3839e9a1ff494bfbd343f50e9e7b1e4bbe6aafcf27184616f8da15acf4095b9da3c3fdf69fe49664cf343e5bcb1612a5f5169fe09965e9aefc3bc7edcc7d51da6c2f71412de1c2dbcaaff284fd3dde4d51daecaeca735dd67bcfa893893eb1bd469088ef96f3f2dcefa3134cde4a9369b0a73ae16e65c695b91bcef59664ebbb949a68967949f3ec7bc795f7fe6cdfbfa336fde378079f33e3976131fa8854bad41912a5ccfb39af3821790781ca4c5e3202d1e77d7e2717737dc79aa0f43b5f75fd6f45fd2de23d7b548a4fdc10c4dfb796abc48ce7d60af22f7f273af316fda97f30aaaa5fd3d9837edcbf534e27b6abcd5fa1aa6b4afe622a8fcf44d84e95e1a53b55687ca0bd49c92dae605ef30635e305296ff23f5f21fcc4330eaaab555545fd110e62d778748fd0552ff38edb9aeda739bb4e7d6fbb447adcfd101dca798cb77c6876af13694e1beff9ee623ef233e324cf39161f277b8f6aee1297ce403c427f2349f50bea0d2d9088ddd0897dd681597322ed8479afe87da7b46326f3a1bc9d074365aad85f331ab399da939052a1e3e45c2394a0ba7fa9e5b85578db5d7d6f73f73df9b58b727d5bd9f6bf7aa77aa716c533855bfe36869e7efe0d8898f316f7aef4bdc3f86257d558dabffa9dd2bc7dde36325a346e098ffee9dd4107fabf736f4dab0f7e5dabb27c8f77d098ef9ef3879fe1d70cc9f97eb31edade2c4c4508efdc7276a1a13a586f4a1bd55ffc52419a6c6e058e9f0f34de4fd9b347dccc657b5fbd3cd27e45ca399aacdadda802a8d8f67de343e1edc07d23893edcf84df9afadfbe718f67ad96c76a1e824a23a97c33db0de7585927e7c116e7557d428d959b7c54f6353335fe20c70eeb344de3bd3f8367307d153793b5b899ecda3c4e7dbfa0e613a4135e95067e65a9f3fe541a322d26d61933adc725afc5a730ef58d514d7f6f12aedfca169c9feb8783ef3a64d399e1887eb06fc09cef1df69cc9be7aab145439e3b5ed59bd4f8e13fc8bdfc9c9c6f90d20753f08ac598b19e3041a6ff09a9d2bfaa0b4c07e1967dc4f17d34b6fbb8ba13eb7aef4bdc3f23a9115363967f7aef89a9f2623f8dbf9cbb1297ebabd5d90a1c0336099bbef6da34e94cedbe59d5c3139376c7676bef9e2d7ff74f3e23fee6bf6a7da9cf81ae3acf7fd537bd1bc131b4477ff75ceddd73e56f01787781f62eb5f6d4b7e098ff1602de4c9e2b023a85e01cff2d66de31b362696b99f63ee50b59c970a86b89768d5a874cf6d74dcc06cff2fb7604fc653f6a226f964c1379f34c701fc89b6359ae76b99ab7a4c6f452b47f62f599a75c88a9f493226dc5e4b1cadf638d58daf95d4c96777ada9b2cd7ff9abc3e85864a376abd9c4fc131ff9dcfbcedd7f9aef61459ff9fb2c6ab93d003e38735a6c303347f5463afa5cc9b0e4bbd1c13b6fda2d9a6be6754df6f83b1e758634d43adafb3111c738d4d6ef8f25723e12babae195fc4d20f73b9166635aebf580bf322701edabbc96b6fbe2a6b528539557a50f31aea8163537a68cabce941cda74d951eb666def4a0cae754e9a139f3a687162cfdf4a0d6ba94fd0bf125cc5bbf5ee2329bd6c67b5f4c8ee5c6976a7123bf818f5726f9c5d5f7e4abbcefa8b3b5f68e8391772cd3de21bf578e83ef94c5dffcb78a25f37f87c934355f2b0f5c5771dd129ce3bf72bd9e447d61857cd6540750fd316d809f28866a1d9f4fc131ff55eb057d068e9d704fcf76b5a7af61e6f01fa8855fcef38d1f04c22fd7fc891facbdfbe01adeadfa74947fa97162ddefda21e7e598aa580fd209c3be6548180ed1c27008789fc62f26c783e3876acf1c0a6c6908fee6d7566be1966921aed61efa0c1c3be1de67ad6bef3e5f693a8703ff51f6f1f3dada41e23e751ebca74e73ef7b66cc45781ca985ed48f97b14885339b6173f5a7bf7d1489ca877a87cf718ed1dc780386b08fee6d78ed3f8c9bea4b85a4be83370ccc325d7c1dd77374de77884df095a188e07e7c17b12fce47b12fea4744ed4744e04ef577e08ee675d357b543eb006705e03ee853eb3d11b9733d769b6c8e7e22749dbb3c031e6938ece7e6d5c76fb8d96e7e57ceec4b8bfaeafaeabb58adb69d74fd1de7f8a16779f320fd3fde4f8f77eb2cd133f557bbfae7faaf6fef6da75b50ed3f7e018f329ce51867fe64a8dbfaaabaa3428c7df626dc079fe2bd74e52f974357bd4da4a3f21fa6b803ef76155174cd5c6edecda3e4bf527aa38d2d6798aabb95a9da48db27c8db575df75808cf36afd1f724da3449de24c709faa53f0325e8d85e499df93b2ac97f11a6bef6af5571a67cb77827959e26f1e5ed5f7d8129c87f981bc8f37c93ce94bcdcf72de335b8d879469d7d4dffcf71c104e75cc9f31f51bcb7967b3d5f7b81d98a71f39d651dea7f7239fab3196f11e3f4f7bb79ae3a5f723731b541f8beae3536b00fd0e8e1ddbf67fd17b5f4cce1f89af65de3c59f5d35dc8bc7559b9368f9a6716576b08fd028ef97b8a5cbbf6bf1f79df45dafb2e92bf176bef53e37b3929dea7c2d79079c23a47ce3d8da97a3256bf05fc629db438eb8cc4d93a2dced6c9df4bb438bb0489b39ad2b5f2958b93e1f2ddff753bd04aa5a1ee5773891e0df0cec78096aacfaa3c458df9d6729e680cb67dd2b54b3ddb05d8b313b8d6d0fbae5897ead7623b338fcffbb65ffa506c975ad8af9ecd06f67405d774fbb3ab5f8ba9792ab5b55fceb98a81b9287efd2226e76ec4541f7c8ab98de29e86dafd2aff566b696d04c74e5a9fa7d641567353eaa6b0a9ad573bf14c562dc326e76ec4d4d85baab0f5026153f7abb05da685ed32376c85aa3c51f3515285ad9d573bf14c6dc326e74fc454da4d15b61c10367d7ec7e55ad82e77c356a4be1d55df1cf6a9c1c7da7bf5636adec8f7299e49e5dbaa3c53765ea1d979856b67715f37ccc553b5e7ba6acf6dd29e53753cd55e80ebe399ecea247f55dbfc4aa9fb2b38e6ba1ba43d7f799f8bab35d83e07c7307c4aef17afde7cb56ef8853eed94f7c7af967ed6121c2b1d7ebe550aad54fe97cb8cfda2f365f8e7bf896bc4e41c9a981ccf8dc9393ff16b98b73fe51aa961e84f890df43e9b28479c7b0a54fd42ce8949ab5f4b8e95a97c3daed6ecfc0c1cf3fb0627df53b2210ddd3dcc9c4ae4f826efca4539c9392cb1bdc0bbb92dd7699cae4bc16988f6ec0d80d35c708edf23e775c6e53aa17564bf4a6ca8572351e6710d3577b0b31bae051be53dc398b7fdd21d6837047f3bcf94aaf24f6fe3c8b97689badc8de03ed86faae671a4eaf3ccf3e10b23cd7156bace3d5f7a3bae11537b04c870c74648db6fd2e2eca6147136c6fb6ce2fb13de0693fdefb1bd7d8447ed73310e7f6722bf546bf6a9b9352a7fba0dc4db6dda336a2dbe8de0d8e1b5b019d004cfc5d51a733f6b7a39da75d9de3ee05caf6d75d4784127f9bb4ab3e357cd8e19aecec253bdcfc5d53a7f9f836343b8127d4c4aef6eef7d420fb6a9d361a6d603dc088e1ded32d5ffaa3353ebfc7d038ef9af5c1bad4e1be60ddb6ddaf5b62c2dd60b557a4e630e405cadc1f73b3876c2b0a8aff7bec4fd602dbd1ae7d6c839cf8976a85c8f2f7e2f607a2f786f43f037ff056b078abfb95d2f2276dd9fbc3736de6c574ccdc57950b34bce8d8e3f00def700782f2c43a41d8b55ddfe0a96cc5f5295e96a1e875a27ef1d70ccf506b871b778ae3cbf5edad8181c2b1d7e5eadcfd63dcdf7a7e30b0f6bbef0b06b5b794bef7d31b96f4cfc118da35c634fccd14d65cb1569de972a3f94739a626a7f13d98e8a3fcabc79b4ea5b30e5972acfd900ec50fde88f6b2c1e972c7ef3be2f914fa8fb378163fefb58525bfced6854dcee7d57e29d709eb80acf93c973358e993eadc5875cb72bfe14f3f6fb3c09ce2bbb603e26ed5cd2467b8f9a1ff18cf61e395f3cfe2c08ebb35a3836c877a83511a680f3fc3ed3fca1543e2b7d28fe1c60a6be0593ebe125be81917d0cf117bce7e3cf83f3fc57ae3f97282b5e74392cadebd5177a2a4ea632cf786fa28e04ed9275a2f84b9a5daaaef6b266d74be03cff7d45b3eb1569d71aaf3e837d20063be2727dc2a5eba5ed6a6e54aa394daa4ff155cd76d9cf137f4db3fd55709effbeaed9feba6b43e50cafbed0534ca76bd77cf6efc5d45e41b28d129773c5ebb4d38ed5b7a0ca36b536d8a7e0d8b1b56a80a607e74ccb67d57a5bb11952e30fedfa2140c374ddcfdabc9e6b5931912e47b36256c02a584fb1f002afa1a4bb5dab7ab2e68d5a45fe2356fbe0ce265e5be564a2158e8061b7d469622fd62aa796d2c7b85b6a5b312f47bd7db8f87f817347a910ed50a7da2beea9f60a6e5c99f36f31d8eab5d2393f4aec14cb377b2d75aef460e39c5ffed45cd69bcd74fef5aa4c775e5bc6963947539dff5708bdb98ed9d5efac29487c5b58fd99298ea6bb6bed22e78c025ae11c97090bf3c5ff970b4b8b85f5639c7355620fddc5ac840d737e578ab7550ffb52e76fd33ba74a64661bcd9bd762e7dd2d725534e539a1e1d6f7143ef95f8c6c8e18e1e8ebf1f4c1ffa9db53944e27548b89ff18ba990cef9c1d23357a0b6431cfb93eaca7e8bf9d528da0ff30560fa1d9bf5ddeb9ac6fcab098c9f0e86e2f42908ce19d724ffef0c8b71e9b91e50d5a0eeb29ba5d3ad410b45460b95eb6989de327085959757b714375fc31137ed105949f41fcee7da5e23eff11504f147ede0810d3fca63a7fac74fe2b736e9ee4fcbfc079bc4ce673d562a61797a92fe0562f3a6b3210c31b37e11535b9a99bc5bbb18dd253036e90084512704f51df6a93c20db177898a521d595b5209a573fe9b638e3d75fd2f6f8eefdb7ff75e032fc932c74f23113fb5792b1643754c31d428d309a0e61c3f55fc344e842b193ffc1f33c326888fd7640346b0ae8960e3cde3e3dcf6daf9389f26dc5d6368e6b7554a1f4c65014630cb4450f4274dcb20c1898e8507c87a62ed186e9d36c3668261db6aa14bc7068c623d03c55e4d648bae9a590d35b3b84588707d4cb84540e10698f03601851b9a1caa69a69324bf562e540a9c7bfdbb13efe5eca6676b667f6a85a4c99a4dc0bca991296e38c26d8d56e991d30a8f9cc69872eba0ca4d30e53641959b9a1c4af45e66be965ebb3292e735add32e23dbb154956cbf25e456267ae2bb8b59a4f4aa771ea9bf8639cf2e70382c173d02cb9ce74d9d4da989b64f3bb7ef20687662a62e307f166184b736793ec7de118b76ddf9dbe1cedfcc24cedfb85d3ad974075cb83926bc7d40e1165846d0296846b00da6dcd9a01cf3a3dc1253de21a8cdad30e51d832a6f8b297709aadc1a738d9d02ba461b4c78e780c26d4d995cb3cc6572f92c8f8d75ae1538f7178bee367e7e9ac89c5555d23de7bd337526b74bda995c76b54caeb61661995c3b53d471c25dd389ba6c3ceada9ba24e644e996c7fc03e96dab53f764d3bb2ba3173fb231d1bb0e8e9806506bb05cd0c3a9ae247e4f199af7df566b9b588193ef8b98d86e0df7fcd71d383a5aa7b61efc762653b53ac70763d0d2619a2a5071e2ddb63d2bd024b7732c5b8287b33d92b35cc39e27fd72e35f64e842149a117ef6fe6b39879d357743e231d7d39ccdc49559349981b74c61267dfa0897307cc0bfa05f6821d4dd2bc56cbe709ebb5da7f9d7ffcd46abb6044fa1b88f8aac9ed8411191098c8ce98f4c0c0d2bb60d283024b6763a8770fea7c5d310f196cf01066323b8587ec8a89ef118278379338ef74d93371730dbedd0417df0db37c2f83e5757d5ade1d8bcd2141134e0f8cc9500393d526b35330e989890f33889fea53bc17263edc20becea7786f83784fd15c3c9c65b6fbc43c5f67941332fe36d879adde5b2e2659708bd4848d29ceef7c61053fcfada8799e4fea82368f552f687b8a46ef0896feac23fa50706b1a8916a4b9cce75f08645b6633569fe86372783e50c03f55a83618cddb5273640596bf7fb1b834c979038f4d7ebed4f9ad9626eae3692207cbe1461b72b898cf1caeaf29c189be8ec59b35c18d70febf4c54f9f8dfcb65f44e15ef4e8ecd07494afc23918e86924d946e46a7dd5b386d9f349c360ceb3177ec87e5bf630df96f9798bffc3717131f67101fed53bc3f9690f8370335766aa448210330e109a614da4a945549d09d4494940ac72e106d8b039d5f3581ce8f1d03317a130df4ca7cd21b6412e7bd7993d2a197a2376f7793302f73271b0a9b5e9c1eef8a888b24912f9204afcc4c930c5709e72f114c792661cab7b9f363f7abe439def92d725ec9b396acac6ae11989876730169ea95878a6254b2b1fefd9037bcf74ec3dfbd4ea3d7b62de3dc3e4dddcdde624ca99e16c8160bed0971fef652a1444377566678ab95965194b3dedd09cbdf37531b7af96bdaf1b62cedaf763d864b0d4366099f4102c279869c809f2e2fe7282a12671de2ae1bdef81da98c330e5d94195876340f63701a9e30f489e497c2b911082b75e476096cf3558be5b963fcb476296178460f9285332168342a5a4c93855d6eeadaefb2d08522779beec6b7a63028522b9776778b115dc562c6b188d65e74526f37de4da634cc2bc39529c8e70375c786f2c05cc37a48066f5fca580b126717e7f09ab5e8af614238fb59b4bc6570aa85797b9fff470fea95fbd144e31cf6a1c96524b0d2935ee33a58ec7c40f3088d7f1293e017338be3c6bb5fa030fa7a9ced6891dc47ab1439c5f77d8acd8f157fe77b9f37feefa2572b235cf263a89691d55acbbf33bdff9ff523125abc4b9d6c9f94f3587b8626fa1385f64248bc4735cdb4d58fc7a1fe7fa20e737c7f9edec2b354cc4fcaacce057bdb84b2d0ae6209330cc8b4d98e78682b9f6303bb1154e8a7073f74e6236ce62e74d6552977fb352241a41c5b279d4c939c3754b841595cebffea263b2890ecf43ca0d7948cbc6fef29029a6824e0ca16772d074a873d752f1e181ffda6a45da45d712661e324dfd76ac30ca37450b27b7349d3263091e25534d5122261f64b209a1373afd454a65da9152c5cccd879ade8f45cb34133d31e9607206e9a5f3cd9799dcb2b4c92d17e45a550b55cacfa2106ad30dd47a716a7c5de9869a3985a6527439eed0fb6019d84a4306f6aecf0c6c0666f92a83e5f57d5abe2f66f98106cb2f6fe2cff2fdb052ef2053a9c74ca6a728356662a61f6c30bdaca93fd36761e28718c49f6ce64f7cb6499cd7e8f8b7e6411b76fb63e28785203e07135f1d82f85c93386f921e6eca3174e1425cb800f3c323d2114ee182f3302f39d2e025d737f7e7258526717eff510ca9a41ecd0255528b304cc798922b6f39f8ada4f2c2c8c6f6403186fa580cf571c150cfc7501f6f423d2f34d4d16913949808f1a475822169ad6fe92f692dc0b2b11343c8c64a31f13521881f80e5912705cc2317621e7972c03cb20cc3718a0187dfc96b8b302f39d59401b7f2e7258b4de2dc98d3d24192a2fd538e099f1e50b802637d4608aeb7c424ceeba167a663758a3ae8522c12cf324462d5b6fe22b112133fdb203eb8b53ff12a4cfc1c8378dd36fec49761e2e71ac45ff429be1cf394f342f0941598f8f92188afc4c42f08417c95499cf74cac4dc7c7ab70e1034dc23cd7e44b09572bf0f96408bf057e952cbc4b6a51abf257341f8485e5225358f8854e9eb7fa79d7c1d8bb2e36bd8b0fb0cf71feede5fc57586d90865fe12b592d1564fd58710866c53a93152d80158b64e5a740b0afbd058762165c62b2a011b0600edb47784695cf72fb302cfbb9d494b7b5f797fdacc612f1652124e2c331cb2f37583ed7a7e54760965f1182e54762965f69b0fc7e9f961f85597e5508961f8df9e7d526ffe4337967cabc6cb69337cc94f9d020d9e870cfcd10bfddd99eceff47803cab500895397f1531de3b5ee5d4e779feb2527462168bb3453ef3b46330fbaf31d9cf6745252d52dfeb754a8469900ccf6cc3c08c9b67eb0da845e28e4a39a3c46d8ab9e1ab646e87ec2af1a49f301d6b0a1377906b1317b456ad58fbbc3e73ffe9e1fee3af617b1ce664d71b9c2ccba7931d8f89df6010afe753fc04cc036e34794097b43cd86d3af7747efbca73ae371fc4fac97b739d5f3f717a2216a73761717a73e0385d83bdf316ec9db7067ee7495854df16426675b2499cd7f2f8fabf416a79a760a4eec0488915c4b320297f9c4ec538dd1502a7d34ce27c56e9dde9704a31abf47493302fe7ee61d5cbb901b9fecab93330f17b0de2b37c8a9f6912e793e0f812ea8126c19d8529df1f54f96c4cf981a0cae760ca0f06553e17537e28a8f279987bac37b8c7a6fefedce37c83784ff1d9361f0bdbbc8b1fd46ee183874d49dd385acb1799cf165bdd05b1061bbfbd008bb6470dd1366980bf685b8be5a21b42c8452fc4c41f0b41fc220ccbe3062c1d7c62b9d824ce5bb77c3dfc609fc2aec3ec7ed26077954fbb2f3189f354f894c99975e14770e14b31ab9f36587dfd407f565f86893f63105fe953fc722c3f7d36687e7a05a6fc5c50e52b3120cf1b8064efee0fc85598f80b06f1ab7d8a5f8d31793128936b30e597822a5f8b0179d900e4ccc1fe805c8789bf6210ffc9a7f8f51893578332b9c1a4ccb36ebe8942d0acfb46ccecd7839a7d934999d37ec340fbbb3dfcd1be1933fbcda066df8299fd96c1ec057bfa33fb564cfc6d83f86f3ec56fc3c4df31884fddcb9ff8ed26715e0af3ddc98295c27760d2ef19a463bea4efc490bc6fca4e7c22b90b13ffc020feae4ff1bb31281b03f3be07b3fb4383dd0d86f8b3fb5eccee8f0c761b86d953d87d9f499a0fb67c9cb8a07dcdf809abcdd78cf7637c3e35f0c9f6c9e7014cfc3383f8069fe20f9ac4790f18dffeae5aef215fc1897f0ec47b903b89f1a995ac4a8ee115882f32d5489f9fbec187b0006e3204f0389f015c8f897f6110ffcea7f8c318bd2f4df4b84febcbf8774a8cf7f1c633d7f0d757fe0816bcff1982c73fb2f413bc47b194f955e01c650366f7d706bb67f9b4fb31ccee6f02dbfd3866f7b706bbcb7cdafd84499c5751f87ed981aa284f62667f6f30fb139f663f8589ff608acb61fec49fc6c47f3488dfee53fc194cfc278378b3e1fec49fc5c47f36884ff229fe1c26fe8b417c934ff1e731f15f0de22df3fc89bf8089ff6610efe253fc454cfc7783f87a9fe22f99c479deccb75eab96dbf30f6792656585e894548b4357062e335fc602faa721a047f90ce82b98f85f06f1af7c8abf8a51fcdb4491375aab9799eed45c5e5efa61f61a16ac7f0cc1facb67b05ec7c4ff3588cf18e14ffc0d9338afc78a1d024df5d858ac36f5d837b140c46386ae3c9f8178cb24ce4bb73ab180a5dbdb2665ee397563c1bb3bdec1986419987ce793c9bb98783d8378b351fec4dfc3c4eb1bc43bf9147f1f136f60103fd8a7f80798784383f81a9fe21b31f14606f1ecd1fec43fc472b7c631645db56419014b04776ea4ff72e1232c704d0c81fbca27b98f31f1a606f1a93ec97d82e5715b6179dcd6b5cae33ec502d1cc10882a9f81f80c136f6ec2ef53fc734cbc8541bccd187fe29b30f16d0ce2837d8a7f81a58a96a654d14aa48a02f0f94f586b997d89d9d10ab3a344d432e6b07cc63f15aa1083cb558e6513d90ae66e3f5a293e2faaf065c7ff303bb635d9c187a6d5acd8f4ede14f2cf55d47fa0a7383d606376832d69f1b7c8d89b731882ff029fe0d26ded65477f129fe2d9639b5c332a7f6b5ca9cbec302d1c110888d3e03f13de6751d4d5ec7d7cec993f5eca520e5b93d7fe5897a389fe4512a4ab0a2c42774fc3c4fbfe562a5d079ac4c966fee94113ffef803067e3b0cfcf6b502ffa3e13d3dc5dafbfc0b88cdb7646872cdd5f9a26ee0ea4d10e97a8548fd0b3d8b71f239fa6e1e117429d14eb1ea4b898a6fdd3944e3449ace313e91664fc6366ba8b089383f61debf83c9fbf9d445bedeee1271c8e9247358ce8bafbfebc78f7fc612f68e86843d649cbf84fd0b9648ba608964a75a25925f4def117befc482cdabfc0d13de25a0f0ef18f66c03f6bf7c62ff0313ef6a105f3bde9ff89f98bbee6a72573e25779ce3fe054e925053f12baa759bb85f3a17d4aa61f117664f37933d3c60fafb27b002dfd9ffdf18e2dd0c889ff489f81f2c48dd4d416a6f405c2cf27dbe745e2adc7e02fc2f16e01ea60684cf00277b8bb464d63360328b9984b9d5bd4c2d9309feac8e9bc439c2de58935a5592f58ec3e1a2f3d5efa77c75b0f7f731bd9ff724e99575dc8eda55d2eb6216e5982c6a68488b95bede9785456f5f5317d8247fd15b0f13ef67106f39d99f787d4c3cd720dec5a778034cbcbf417cb44ff18698f80083f80c9fe28d4ce2bcc23010ab300caa5585a1b1e93dbc6376f7103a669b6084061b089de99350534c7c0f83385f18ce8ff85698f89e26aff429be3526be9741bcaf4ff16698f8109357fa146f8e890f35750ff8146f81b9fc30cce587d7cae5b7c102916708c4b3d3fc05a22596f18fc08a225563c99375117ebcc2d3d75c98288cf6a845b5b01566d14893450d0c45919fb76d8bbd6d94e96d7c6c29d97ed30b613fef6d8dbd77b4e9bd3cb6937c55b5d75f91db067be318ac889f1a683cb92de6b67b9bfafd66f973db7698f858534139db9f787b4c7c9c41fc5c9f9677c0c4c79bb2249f9677c4c42718c437f814df0e73a08926076a0c12a6dbc551c5dc55b1fc38d1f6588026190254778ebf0075c2c4271bc43bf814ef8c894f31751efb14df0113cf37881f35d79ff88e26719ef34d8d051c55ef82294f0baabc13a63c3da8f2ce18ea7d0ca8f30afca1de05337b4650b3b331e57d832a77c594f70baabc2b867aa629b1cff387ba1bd670981542c361379338ffcc6e763add20293eb3eb8e59bd7f0856f7c078cf31f03ece27ef9e1892b90191f4c290148480a43786649e014951a13f247db002b4301d24a9b6bec390148580a42f86a4d834ce50e40f493f2c33991f3433c9c5cc2e31987dfd7c7f66f7c7c417986a0e25fec407606e526aaa67f1152ff9f06095b1c3b8180c9716d5aa1a3f100bea01a6e8f719d44158137a21d6842eab55137a772c108b0c81b8da672006633ebc38a80fef81995d6e30fb559f66ef898957982a360bfc89ef85f9f012930fb7043ecc279b2c63f39d7fdd21fe4562afa0e25af9ee102c884b4d6d2d9f411c8a89579a32189fe2c330f12a539f8f4ff1e198f83283f8b8527fe27958925e8e25e915b54ad223b054b73268aa1b89e15965aa16f9c4330a133fd020fe9b4ff1d158aa3ba8a65457c0f81299e5e2af22b69c15c8ed806b93eac660413cd854381ee02f887b63ee7508e65e87d6cabdc6628138cc1088329f811887c5d36a3c9e92b9a21a2a86937b6bd305391eb3e27093153c3873c4c49985cee1703131c69d8254e6ebad13b0b71e617a6b2b0697ef34bfbd76239e13313b8e34d9c12bd3ee0644c5a2172b48d7ef24ccb58e32b8d6da727fae35190bd6d1a660f1f698eacfe745ef2a99ecf951a1ecdf2f134bd7bbf3f07841bcb25699c2142cd0c718023d7889bf40e71bc47b6eef1cc696b2cd39d5ce34d93139cd788ab8ca77410c3eb5eed818ffe8c54bb167274e2097d53c792e4c3bb71743325c8dbbcb54c999ffb3bde813f64ef084d7bb89e1159e9e46ca7d18f24599c473b91251889b27091e17e393af321d4e6c52e054ccd18f3738fa773e1d7d1a267e82417cfd527fe2d331f1130de2332afd89ef83e54b6bb0228f27af5291e3943b6e32c3c9a70655cb76f93aa27e72a11998152799ace08e1c24a3df17aba29e1cb48aba1fd6e1734a081d3e3331f15343109f8531392d2893d9a642a033cf0217921602e96f8dabb65c0d6f2bdfd34d1d87c64cf20c9149f6647eb6f2ad8dbd58b6b8bf29def9ccba33d3e9fb4cb1ebee1c4cf8ac80c27331e1b3030a176049e09ca049601ea67c6e50e5424cf9bca0ca4598f2f941958bb17cec8210f2b1f998d96b839a5d6252e6f9d885e9f81d4fe788f00293302fb22f4a4738c5cacba518e88b43007d0086635d401c0bb1f47d49c0f45d8671be3420e74518e7cb42e0bc18c37179401ce598f01501852b30ce5706e4bc04e37c55089c976238ae0e88a31213be26a07015c6f9da809c97619caf0b81f3720cc7f50171acc072fe1b82e6fc2b311e3786c06315c6e3a6803c0ec4846f0e287c1086e39610701c8c89df1a82f8212671de50bc2d1d24a9f63ec27ceff6a0be7718c6e38e1078acc65ce4ce802e7238267c5740e123301c778780e3484cfc9e10c48fc27cefde80be773466f57d21587d0c267e7f08e2c762e20f84207e1c26fe6008e2c79bfa3476700e6307b0cdd1a761da892fdc1e8d87d2f1d27c9cd80998fbaf0fe8fe2762f1fc7008f1bcc624ce67f63c928ed529f6b23dc9e4403b72079abf591c88ce711e4dbb2b6c83e80adb95e15d6141acc43ac04e3645318f89c7d289e20d783bf614ac4ef078d03ac1a998f21341954fc3949f0caa7c3aa6fc5450e533b00ce0e91032803331b39f096af65998d9cf8660f6d998d9cf0535fb1cacdbe7f980dd3ee762add91702b666cfc340bf1802e8f3311c2f05c4710156837e39600d7a2dc6f995809c2fc438bf1a02e78b301caf05c4713126fc7a40e17518e7370272be04e3fc66089c2fc570bc1510c76598f0db01852fc738bf1390f31518e77743e07c2586e3bd8038aec2ac7e3f04abafc6c43f0841fc1aac85b031600be15a93306fac7d18b04d731d66f147012dbe1e13fe38a0f00d58bde093a0f5821b31e54f832adf8439dd672138ddcd98d99f0735fb164c795350e55b31e52f822adf86f9dd9701fdee764cf87f0185efc0587c1594c59d98db7d1d82dbdd85897f1382f8dd18936f8332b9c7a4cc5795fa2e9d684cb1aad4bd5835fafb80d5e8fbb00e9c1f0276e0dc8f41fe3128e40730e59f822a3f88a5c29f03a6c2873077fe2504775e8f15dfbf062cbe1fc670fc1610c72358e5eef78095bb47318bff0868f1064cf8cf80c28f6128fe0a88e271cce2bf035afc04e6cbff84e0cb4f62e2ff8620fe149671b078c08ce3692cdf8fc583e5fbcf60f97e3c1de114f9feb358be5f271de114f9fe7318e4ba41213f8f296705557e014b2bf5d2819122adbc88b973fd7870777e09cbf71ba463758a7cff650c47c380385ec132bb46e908a7c8ec5ec52c6e1cd0e2d730e12601855fc750340d88e20dcce2ad025afc26e6cb5b87e0cb6f61e2cd42107f1bcb389a07cd38dec1f2fd1601f3fd77b17c7f9b80f9fe7b58bedf3260beff3e06b95550c81f60cadb0655de88a595d601d3ca87983bb709c19d3fc2f2fdb601f3fd8f311ced02e2f804cbecda07ccec3ec52cee10d0e2cf30e18e01853fc7506c1710c526cce2ed035afc0596fc3a054d7e5f62ca9d832aff0f4b7f3b8490febec248ef1890f4d798709780c2df6038760a01c7b798f8ce21887f87b9c82e415de47bace8ce0e5874ff8015dd5d0316dd3f6245f7ae018bee9f30bfeb16d0ef7ec632bbdd026676bf606ed13da85bfc8a99dc23a0c9bf61c9a46708c9e4774cbc5708e27f60b07b0785fd2766769f10ccfecb24cec7bd73d289c914e3de7f9b84b9217dd3115e820bff83e1e817028e7fb158cc0d1a8bbcf7cc6876ff10cc8e99c4b9d903829a1dc7cc1e1882d9754ce2fcfe41017da42ec663f7a03cb2301e8343e0510f13df2304f1fa18933d8332698099bd57086637c4c4878420de08131f1a8278634c7c5808e24d30f1e1218837c55c252fa8ab6c85298f08aabcb5499957284706ac50363309f30ae5a88015cae626613e657c743ac229a68cb7c084c70414dec624ccab7d7b07acf6b53409f32af3d88075eb5698bf8d0bea6fdb6209707c0809b035263e2104f1361893894199b4c5cc9e1482d9ed30f1c92188b7c7c4a78420de01039e1f1478474c796a50e5ed30e5694195b7c7504f0f0175274c7c9f10c43b634c660465b203a6bc6f50e51d3120fb8500a40b66f6cca066ef8429cf0aaabc33066476084076c1c4f70f413c1b139f138278574c7c6e08e2bb9ac45b38870571be5dbc2e5e4dba072edd0d739479411d65378c48610844ba6366170535bb0756952a0e5895ea89f1981f028f5e98879404f690de98dd0b42b0bb0f168fa541e3310733fb8010ccee8b892f0c41bc1f16976581e33217c3bd2828eefe1891c521101980899787203e10c35d1118f720ccee2521d8bd3b16974b83c6e5602c0bac0c9805ee81f1a80a81c79e583c2e0b1c8f7b61762f0fc1ee21583cae081a8f4331222b031319861159150291e198dd0706b63b0fb3fba010ec1e81c5e4c14163722496220f09982247613c0e0d81c7688cc76141798c3129f361f5d5e9f04831acbe3766f2e1414d1e6b52e65bdc1f918ec955b8f038cce423839a3c1e738ea342708e0926f11d9cc3a3d3e191627ed9448cc73141794c3228f7ece21cc6e6b24caca39fcff2d858e75a8158a5bd873caf96e0e67a43c51b92abb37b9fa8618d7c13f79846c75d513ece5788e922ee0cc7326c5598c9585c1e1f342ea760ca270455cec712fa890113fa54ac105813b0109886099f1450783a96819c1c4206b20f1683a7048dc11958e9726ac0d2655f8cc76921f0d80ff3bbd303fadd4cccea3342b07a16267e6608e2b33124670544b2bf49980f969e9d8e708ac1d23998539f13d4a9e7622cce0dc8a20063715e4016f3b064787ec064586812e6e3bb17a4239c627cb708135e1b50b818738b0b83bac57c4cf9a2a0ca2598f2c5419517608eb12ea063946299d125216446076009f0d28009702106fab2a0a0cb30d0970704bd08037d4508a01763e25786205e8ec5e2550163b102b3faea10ac5e82b9c835415d6429c6e3da803c2a4dc27cbeec75e90867e3c25518e8eb4300bd0cc37143401ccb311c3706c4b102abfcdf14b0f2bf12f3b99b83fadc2a4cf996a0ca0762d1776bc0e83b088bbedb0246dfc1188bdb83b2380463714740168762c27706143e0c6371575016ab31e5bb832a1f8ee546f784901b1d8189df1b82f8915834de17301a8fc2d2cafd01d3cad1188e0742c0710c86e3c180388ec57cefa1a0be771ca6bc3ea8f2f118e98743207d0226fe4808e22762e28f8620be0613df1082f8492671be83ed63e938e023b8f0c998f0e301854fc1849f08287c2a26fc6440e1d3b0cad253012b4ba763c24f07143e0373b9674270b93331f16743103f0bcb9d9e0b9a3b9d8d99fd7c08669f6312e783d72fc4830e5e9f8bd9fd6208769f87d9fd5260bbcfc762f2e5a0317901a6fc4a50e5b55871fe6ac0e2fc422c125f0b21122fc2ac7e3da0d5176356bf1182d5eb30f1374310bf04f3ebb702fbf5a598f7bd1dd4fb2ec394df09aa7c39a6fc6e50e52b30e5f7822a5f8929bf1f54f92accf33e08c1f3ae3688f7dcc9398c4d6694d305bccac39c23fe371f7a5fe49c2f14c3fd7cbfee79354c08d8e8d8dfbc1a5de38c800fe37c4640ab6ac14af5726cccff1aac2af451c0aad0b5981b7d1cd48daec34cfe24a0c9d763267f1ad4e41b30e5cf822adf88a5a9cf4348533761a43705247db349b8b173f8453ac25be1c2b760a0bf0c0afa560cf4ff42007d1b26fe5508e2b7634cbe0ecae40eccec6f4230fb4e9338cfd0bf35e694ba32cf2411e5bb3020df05057237a6fc7d50e57b4cca7c70f08774524caa55c831937f0c6af27d58f5f8a780d5e3fb31163f0764f100c6e297a02c1ec458fc1a90c54398c9bf053579bd49994f43fc3d1d938fc393dfc398c97f0435f9118cf29f01293f8a15847f052c083760aefc7740577e0c83fc4f50c88f63caff06557e0283c1ea0483f124564ec5ea84b00239261e0f41fc69cca3eba4832485473f8309d70d28fcac49984f50cb4a4738c504b5e730bfab5727e822e4580cd60f21065fc0c41b8420fe22c6a46150262f6166370ac1ec9731f1c62188bf8231691294c9ab98d94d4330fb354c7cab10c45fc7986c1d94c91b58c9d82c9de49e6a6972cce4e6414d7e0b33b9454093dfc684b7718477d184636bc421ff3a631a2b125d4b6e37d422f1f718d141c5bba1e63b8fb8dd506312778e60cb9d33fc8e29ac585c2d156796b21e6c8ef36fbeb85ae4282e13fd435c37f94c9ef3abbe152962239da7dc8db42be5b3c93e25b7dbab54747b79afb8f6e538219c9322147c87e2658cf74525df3e5574bb294dafea74e7a95247c70ff57730ea2d4dd4f312d4bddfc44c70feab622b448fd942699dcb728c737da27365b1e0cbcf987760366d47ae878f771d968b4ec602e7193fa17c170b652b5328c711fa163fbb44bc8687caed2a2d15af2e65073abfbc5b95eb8411b7ef61a1ded614ea932d4951f942a15cdcef274de5cbb3dc3f3677aa7a1f23dfda443e9731247718ea8475a920e3722c14ec9656b311e627d895a4969f907c8085a48d292403b490c0d41c3c2c66353fa1d98885a6ad293443d178714350ce2a9cff8f1369a1d2f1a105225f4a159ef4c259fb7cee432c7ced4ce11bed1c9a736335a4532e8e16d73af6fcabfb09ed475868db9b42bb870fdfcc17e559ba3199aaccaa4deef13116ae0ee9a4399843064f7366353fa1f9040b4d475368f64a2bcd0d75881609cf329796fed35cf28a9fb07d8a856d3b53d80621b5a769221c65323cee90a9aa3b4d977583a294b9617839c8675888b63785684f2db6bcef8531c6738202c77b5689ba62498a9a8e5723bc907d8e85ac9329643b6921d3535289cc21c6891cacc4f97b41483eb509b3b3b3c9ceb169a597516290bc40d6e0544935d1f97b84a88d72b9cd596e7d8185790753987745cb2d9826bcf1b458b62f52e56f7e2cfe12b3784793c5837d94b45ebb4b907651faad283fa1fa1f16aa2ea6500d4f51f2b8a118294a9b45c2f3d2afc99b4be6b062ee2b2c8c3b99c2d80f8d39de6a99e7dca4c23ace096b8973c75231d5a57a191b762de16b2c1c3b632df7dae6139b3367f8060be52ea650f64abb2535aac61a5e1879f9b798f5d926ebfbf8a8a1fab5bfb639c2775808ba9a4290ef2367763d2e59feb8cfe0799b37fda4734f583ef83dc660d7746231557ddc6f2cd636cffb010b41b774f28aeaf93a1e77e9f6d5c02b61c5d38f582877338572585a3962be73f33c616d81f0aacddbdef8090b61f7745abca93cd15f8b3755fcd5a62cfb190b570f53b8764f3b97f7172a3cb66a13a65fb030f5ac7d5f534d292e9325f3af58f87aa593a7f8290ff05a147d7bf8372c94bdd3698d51d488d30f756d4b8bdfb130f7c13cd75f993f46b478cac404f15296aa3d4313a77f60e1cb3185af98d18e8b54b149a2c550224712a78b7e123e26344f8e65d4ce4b82e7607f629cfa9a384d23e6848f1fa526149cc35f18877e260e3336731e409d3bfc8dd1c835d11899665d728c48ef76d527ffc142dadf14d2116995e0e39d9bcb443d52e580784f68a66a95ff62e11c904eaf8f5ee71a2e425a3df6604f4e3ae7c3ad8df14990c6300e4ca736563d8cc97e126e27bf8f7b57a121bf9eeafc5d21cea717bada8db2c4b0f00dc2fa235385cf2d97920fa45f0b0b37d6e258a87637856a66c89e89a53fbff787cba40ec664b089496f8dc97091d3b865abaa954d75ced594a7f466b921e5367531fbf730d9df2351abf08e99a99a06ff42cfdb633e42d42e55f951d3b37e2ccfc22cdfd3cf681f7c7b6dfa83c20c513d2c447ba53f36cb3dc3ffd8aceb4f947e561f0bdb90e0e924b5957888fdd8df00b37f683a23b134b5ce706a900db1900d4bbf9f4ef73a3ffd74f4bed7080be1705308f7236c39b9394a90166638e3088d3122799837fb9b679a1c8f2f1775ea32cf8aeea9f3cdea6bbffb0959132c64234c21dbd777c8dcba98770ead9fb00499715b9bfa49538cc748138f63087ddfd46be0e5eced43f06707a63455a42ee58f94fd125b61a447a5332ee5bf2698ca536a974f6e8d8560743a7d0978ff62cd7d0999ee476e8685748c29a4436a51774c6f6e5ffaaa7e42d71c0bdddee9f420987b4ad289c54c8e77b4c0c23816eb0df21b83358f56d5a41846aeb20d16ce71a670f665fa0c40771595e0334fab2bf909454b2c14e3b156663aa1f03b5eaf74fc58de0ab37c423a335efce7eacac67072f46d31eb279aac1f538d3b367f349ddc409f399aea5a58b9426b2cbc93fce4ebd80ce07cb6c07970bef36f99c71bf1b8c2efa94d5ed0060bdd6453e87aa6e98b357b5c18e9a82d66fb1493ed03d3cc01fccd28c0425a9bb868878527bf767333d3ebada9dd984b6d7b06da63619c8ae57d7ee666faa9cfa68ea1facebfb1185f72698488793eaf7d9278821f55b29e3b3b97847d6ad731d5aae8e1695724cff3772f72ece1b9d0d444cb3cb90719a630cd01532fcedc7f768971a85572c021365ff301f7c932a19cec23e1790d2fd7dcd6251f91eae1f02a154fe9bbba61a130b58f7a80961a0c5dcd61524bbde9abb0c562f565889496437a174e7a4b0be9741eab3d65acc67bf275c263dd6ae94d355bb14f1d771908930fb5ae4616a66d93edaec004d9bb10139bd68b6cbf447e9ce92dd46a7c1f4ca5a6f77517026a94ad46b96920b336c9b5154ee6668b4b99fb695f510963f5b3e2bd783ccca084c5976b513d07d345fe53ecdc0cfb74a2806bcdb824ae7d29713517be954c928b65c75fb9901c238b862820db2d9e44b61f25b2c602d91cd64bfc7fbc7323af9ff1e419054c6f8e48629a4989691b901055f22b9345c508e1676e015d14096ce7ce4d629b4589ad83c7bbf48439cd794b919c35315ab4b48a98bb646ca5139828801cb05312e46c4a90ed3c2079f5b5402e36522e1a561c2247ca4bd565a2c2eb9e89024427940988fb53426c22200e179ea672ba49c28ce59100f5dbee495073e8eb68cadbbcc0a25234e4ed9184359712560b5034544f886344ae56cc5646025a9b7949680594d0da080fe38d0d77f079b8fcb490839ce33cba8af1c973d12b59df0525eb3cfa24eaf63ff3f1cca5c2046eaedbf31f05587ff54fc22aa484d550c05239d804911ca3d10e7813e46245f4ed80f1a2ffd9ada345a9b9e43c92c0549ce92a4494fc69cda024a8f976d6fc7b4702e4cd1d92204ba8bb80922079f73637a144b63da3d205f45bb324ae0594b85a7970b9e5e354e6ce025cc8262756da9bc6a638cda828a01b509844579ab952324a0da3678726111d90b9c4e88efd45affbfa7ed07dbd3073bd66de5ed8e4229751a9dbdf0cfa64cb28b1f1fd62bdeb8226677be6cba6511480b504fdfe8b2881d513c9923fcedb92d1a889bd3a3a096771a6fa27bc7955f49ad7330a92d0ca29a16d0b32faca2d04de0600af827e180eab83a9dba280ac655112d912ea92d2dc9d03abac51e9d8993130896da99dadcc9c4880fca953126425bdff79f3bba18ee7f149badca4e54c7dce1c056c57838ec5aa4cb707a257309c393f896b1975c5162f18a2d3249f05864996676afe4f741b4e65a0e1b42253b8a29b7b0d06b9d74afad2b3a641b8e8825c0d40aea21e3c492653b848771430dd9e9bc4742025a6f6ccdf2496688d9d1f3c3989f1a0cd3f761ebd6ec9b5a07d7a3025c0a6463f8cd294a91741cfda21d435b6e4e416d82e8d56e25c332709ec50fa7174de06a814b88a23358ecebf5051980ea3ee9474f3b03cf16a6cdbab28409bb424096d75a61ae9aab519ddda59456912dbe199cbeef9c04ad446cf676525511d4189aa1163a0a5c92b16c5a2691e05486bc726211d49ed4fb0b61fbd0e9f0a50e33f2ad3395674bf636a02b01d4d89ad35abde1b1bfdaf4eea8afa7dfd2c4d5c5fc5a5f6df6afa638e7f55cabb91463815db0a71b68ab9bb507abe32edeadc629de5c7c0af44b3535445b3d3fc522e3b8d0ec86c1fb33cb26b288bb3d398ed961d686a6190a773023ddd47924a2f3bccaea194c94ed1e7949d463f6876a0cebf6c1fe345d9354e55cff631fa999d7206aef9aa9ac9a62cc1bf6bc946668aebe7938af8e793d9d566a564a798649d8d56bdb2d39a0e949dc6a7c27aead33b3eb26bfd95597680aebdecb4fa18f45c265559985dabaf4bb26b51ea66a73db9265d9bbc1ad9bee7a1782daa997b4da371d93e27d466a739f943cfe94d43a72abde26b059855f47bd26f3667a7dd2f915cf003560c920b75f4e20b7e1cfbff7c2d8e5e7c2d8ee33884b72505b7ee7c7c2686e47b3bff1549ffe7c71522d5f19bb43776a8f6c6298e732c1671b04864e6ee8da67737f4d49a3ba4139c5a7dde124b363c4ea01f5a98231ea872fe2b63a957cd1a507d1e4d78385b51e1bc028c479f6813ce8191c4f910c0b9c6269cbd2389f34c90d84fb209679f48e27c00e03cd9269c3991c4f90bc0798a4d38fb4612670790779e6a13ce7e91c4990b709e6613cedc48e2dc07e03cdd269cfd2389f33080f30cea591b6aeb8b855a2f00efa3e23d00d1c3d79225f19d99096f2c41fd119acfabedb974389b50e16c064af2b36cc2392092386300e7d936e1ec17499ccf81c47e8e4d38fb4612e74300e7b936e1ec1f499c9b00cef36cc2991b499cef029ce7db84b377247196009c17d88433279238af0338d7da84b34f24719e01705e98895954184cef72ff7d582f3a985554309f014dca8b32b1200206d39b6bf6a343d98ecc2f4105fe625b50e644126543e095eb6c41d92792283f045e79892d28fb4512e51ec02b2fb50565df48a2cc06282fb30565ff48a23c13a0bcdc1694b99144b918a0bcc21694032289f24980f24a4a94db1b50a6bf4fe69ceafb448407379b0aee4100ee5536c3251c6423837b14807bb5cd70099b9b64702b01dc6b6c865b6d11e908c05d0ee05e4bbd3e5f05733f61f04e96e693a3d5846732803da800f2e9c60ae0759400d59cf8fece7fc5898dde9373eb3334df98acf43f0280bc3e13ebf7e13d9eb0932e4309bc1915d68900eb0d995a968e7b6189980d9f119f24ebe93c19c0bb31538bd4956e3149ba02e0bb6973b68da01c6932ae4f85f228d0257733254af5b9626f998c9766ca0b9750a12b075e780b25ba4e125d99735399f8753f9af27e75976a8a21a16792cd907b0ed4206fa5ae415632d3278bd1ae41ee00fcf3364a802da57ff25b160b19af37aa9092fae1722a8c3300c6db339143f6da6272c87c80ee8e4c8c8e631ee82da74967bd9195d4fb8092fa4e9b60f68f20cc1900e65d36c1ec1b41981301ccbb6d824938584106733280798f4d30090727c8608e0730efb50926e1600419cc0900e67d36c1241c7c2083391ac0bcdf269851ecc41807603eb039fb83bcb330a33807732c68753f488992bfba32d5b2de11e8a2e00bec28580f65a285dddb3346a32e67a89948967c0b00c6f599e80de718b988bbb85d86f09179e16090fb3d9c89dc2fbda2248aa5721fe0898f50a2e48b6db99db76a51c5a162688bb0924d3612d800407b7473408be2f0697d006dc3e64db4ae5499c8090913ed7e5428f702281fcbc4007f3aa381de697d841d11dda8b0fe0c8a95c76dc44afa650e19d68b01d6276c5a868474a502b2cacf0da0bdf2a44d3849d7d120c3f938c0f9944d38493f5e26c3792348ec4fdb8493f46b5b329ccf039ccfd88493f45b70329c3190d89fb50927e9002d19cece00e77336e1245d34870ce70880f3799b70922e4b4286733ec0f9824d384917cd21c3791cc0f922f5f4e70ae65db8dfbb081e193cb225c0b98a82f712253cb893433a3b1bf07b978afba2e791bb80cad1cbf62c45d29b727e10d930d8832079bf62134cc2bc920ce67d00e6ab36c124ec3f2283791180f99a4d300967ae91c15c0b60be6e134cc2f94164308f0130dfb00926e1a01a19cc2301cc376d824938d84606f35000f32d9b60467186d02100e6db36c11c1841984f0398efd804734004613e0260be4b09733b0637614b773bb90c342e1fa142db13342edfb3653522d2929dece3e56300caf76d41991349947190e03fb005659f48a2bc0978e5465b50f68b24cafec02b3fb40525e9f73b64287704283fb20565ff48a23c01a0fcd81694b991443913a0fcc41694032389f23580f2535b500e8824ca1b01cacf3281120eaa8d711ed97286d2ce6449949fdbb96418616f3bd99cf76301d64df62cdb44d86f44f6a1caa3a0bafe05254abe7386f79b8be1cecd2e0d326c5b5161ab0b3cf0cb4cf4105539f0f89c8d3989c53ddd7de8d5ef30e7668e77b97317c7ba94ba5b836c4e471ef0c8ff65a22733fd0d0dc960926d2bb337f0d3af6c8249d82d4c06730480f9b54d3009a71f90c11c08607e63134cc20a1119cc5c00f35b9b60124ed92283391cc0fcce269851dcd76c0880f9bd4d3009a71f90c1ec0960fe60134cc2e90764307b00983fda049370ca1619cc7e00e64f36c1246c0191c1ec0560febc399774d2bfb0204ce6645d70dd01cc5f6c8219c5a594af00307fcdc4023bbc6b78b9f840854f8189fa023be7007cbf51e26b01f02d626a71a492cc2124ebafec0f10fe9e89afcfbc83138b9d5b398d02f1d0812cea03144301ce3f28717666dea5e78be497677efa33098b1fb2decc0d6030edcf4cfbeb74e746be5147399bc4dc0fff8ad9d24cf82b19ce5f81bffe4589b3ade6afa52cb9e7093e35267a83bdd3817ffe6d1b50c22a1219d04600e83fb60125cc41c9809e05c683feb50d28615b9d0c683be0a17c20d32aa0519c30b32d001aa304ca1748f48ea1574670f6461628c3e394b8d4d839ec294abfb649387441563d7a0278629d4ca0f57eb8325226f1d11e1f1dc3e07671c4354fb244be00786d5d4ab4fe16c78de2ce14fb0194599428abcf39aa4cb4e1a3d7566f02b0d5cb74be394d625b256667babdefc5620ad722e7ade5e268b1f055c22a512115daf7401db33e255ab75fb354c2cc13af4f6e0de7f62845cf33b3816736a0c4a73a39d29fb215c5c1b4a6c01b1bda8473402471fe01bcb3914d38fb4512e7d30067639b70926e864486f31e80b3894d38fb4712e7a70067539b70e64612e7eb00e75636e1245dd9880ce74c80736b9b70e64412e7950067339b70f68924cec301cee69438d56a9a353730bdabc91076766c8811412d025d722d6c844a386a4906b51040ddc646a884c99f0c6a0b00b5a58d5009c786c8a03607505bd90895708c9d0ceac9a083645b1ba1128eb393413d09406d4d09b59d01aa3b2c97cff2d85836ccb991f78aaaa1baa5e20e423f255becec6490f8db5022cd61d5c78cbc239d6e4ffd22f1b71b10deed3c5fac30c78d9dc0f8b0dc0af18a858e67abad41a78ab9a26a4219a15f77a6f2eb1f593212da5246422b4324549fe6c057de26f5e61e54de7c3700d9ce1690841e4906f20e00b2bd2d20092b576420ef05203b5082e4136ff81486790e8112368e4573b78ce60057474a5cfe964d21fcac956c0ac3eda0b2b41d254af5214c5f6dfe5c46bee2209b4cd31de0db9e125f4d1f65793d9174570c325f7c1024eb4e36c1249c414706f36100b3b34d3009bbe9c8601e0360ee6013cc28ce9a3b01c0dcd1269884354732988702985d6c8249d8714c06f3680073279b6012360ec9601e0c60ee6c134cc22e0b3298870098bbd8049370f93332982f0198d936c18ce2ba9baf02985d33d107c4fb788a13ddba63b698a6e45100e4ae94201b0935b5270bef4f275ebc940c595780ac1b25b2ad59f22b21a59a217f5b4e056f1a80b75b26126ebf2d34e1ae0620bb5382549fa1fa995a18c505cda6814eb51eb6018de2727bd301d09e9440d5eaedea43693ea160052862b6ac0ffab3c0a8782f4aac9d989f8906708994a18e05a5b478f9beef24782701bcbd29f1c245a6e6b0f1ce8dbc909a240c59cea2bc2ad213a068ea4389b0a944c85f3c5ff8a7d2e60bf79081cba202c700b81c4a70358d307aa7634571e3f8a52019f7cd443dd34dc6c3c5e7d22a314f1035cdaa4827e6cb814ff6a304196cb989286ed5300ff8682e255a350a9eb3458d823706f5cbfe94f8b64a59cc10ae21d3880a5d1c24ea0199a89aa73395056eab44ba7967372aacaf038f1c682356d2d14632ac8703ac8332512dc27acea3bf6a7b3790f077cf4491c3275e6d392b1067034f1c9ce9ca50fa6bc8107a26d91a326b00da3d28d1b631a08582fa42e30322b9d4f865a06eb9a74d38074612e7bd00e75e36e1249d584086f33490d887d884b34f2471de0d700eb50927e9c00519ce2f01ce6136e1ec1b499cad40de39dc269cfd2289b33bc0996713cedc48e29c0c708eb00967ff48e25c05708ecc04cef4d7328ce2ce945b81a268944d38074412e7df2c8973b44d38fb4512e73300e7189b70f68d24cefb01cebd6dc2d93f92383f0338c7da8433379238df0438c7d98493f4e33e329cb300cef136e1cc8924ceab00ce0936e1ec13499c47029c133331e486c1f42674c2994864d3142e0455f849b6a0cc8924cad6a07139d916947d2289f25be095536c41d92f92288701afccb70565df48a2dc0da09c6a0bcafe9144792e4039cd1694b991445905504eb705e58048a27c1ea0dc8712651703ca7427d07867cc11f6c29f1123c25c0030cfa0c40c3f514dee499d91495e64d3b27f634978fb66a229e9dd05702a531f4973d3a3bff3df5a80733f4a9c6a522cde32879fb5c0444eb86a0cd936a0c500eb4c4aac7cf1c60ae67edcc76fa8a4f4c26c2a5c6d01ae5999f042b891fc24e7762e3846164070bbbaa24c246eb2e1de6100ebeccd59358272a4099a6c49936b408b7c7f4a946a7d98dece7fdeed3dbd054e94bf0d5a01fc720e25cc9602269fb7c11372a523b5d8b97da8c3a3ca39cb8d5a2e10f365c2a397bccf0518e766c227bd5521efd794539ddf28e795d70398059b33afccd8b620645ff7ee07da37f32851aacf587a89c45d255a38d1ff8ca51f286a0aedf144c285c8c83cf140e089459428837d1e4dd88941d60e9f01d016537b690573d7dd182e80f1bf1733b85c543e4bee334d86926ca5ff9d40d1339f1265aad510b684a54dae01204b32917316b27416718ce21ac27b02940b3255b7542df2e40e3dc3597299a8e876b2ed0a609652c2548b97a9b5b60a59cdab6c117a2719d0374115e900db8012766f9001fd07005d681bd028ae037727005a661b50c2fa2619d02700d04594404ddb22a6334c41988f920d535400a88b6d841ac5b19f2a00b5dc46a884f92919d405006a858d5009f35432a86500ea121ba112ee584506751d80bad446a8843393c8a05e0ea056da0895f0330232a8e702a855364225dcc98a0cea5a0075998d500977672183fa1780ba9c12aaffe5a7088745c8fa49ef027df72b6cc2393092385f073857da849374f720329cb782c4beca269c7d2289f30380f3409b70e64412675390d80fb20967df48e2dc09e03cd8269cfd2289731cc079884d387323897309c079a84d38fb4712e70500e7619438d5f83c1f54e6136df82c9172cf263851ff0ce6349644b99a12a51a9f4f6f6a779f486efe3915f8e5e136c18ce2e69fd300cc236c8249d8994c0673308079a44d30093b91c9608e04308fb2092661e73119cc9600e6d136c124ec342683d903c03cc62698519cbaf815e8f038d6269851fceeed6b00f3389b60124e622083f9198079bc4d3009272f90c1dc04609e4009b3f6bb64115692c8b673da06144527da8895749d3932ac97016f5d4389757b0356f3d22aa3e423decfbc080ba97c2ab82f01b827d90c97b03a4506773d807bb2cd70090b3132b8d702b8a7d80c97b0ba4506f77800f7549be1123659c9e04e00f584d36c864bd8b94206f723e0b9a753c20db69321a1df92ed64d80cf8ed1994689b3a07c5890f19f39cdf790e8b1236ce79a42482234e7c9f6505ee4c4a70fee7e0112671b2b1d02b811f9e65134ed2ad78c8703e0c709e6d134ed2fd0fc8709e0d0aa0736cc2493a584286f32980f35c9b70926e274186f30f80f33c9b7092ee6c4486b323c83bcfb70927e9be5b64387707382fb00927e9ce466438e7009c6b6dc249baef1619ced500e78594387734e0accd1adf8473a0c856f8de1a40be280a900967ed9141fe01d4022e8e02e428ae555f0220af8b0264c28e6a32c8b301e44ba200997090900cf23900f2a551804c38584806f90000f9b2284026ecc226837c2f807c79142013d693c9209f0f205f1105c884b362c820bf0b205f1905c884df1090417e0640be8a12b25a8acebb4cfc28c617ed4cee9b33cd21348e656039cf47d20962adf6c10340afa604ea6ffb55c25c966c55bfe300ca6b6c4149da294e86b201e873b8d61694a4c33564285f045e799d2d28493bc3c9500e025e79bd2d28498769c850ee0250de600b4ad24e70329467009437da82927478860ce52280f2265b50924e0922437907407933254a77df1c7d5bac7cb6c02132dff9978f71456f64ab2b28b56fa1c457fbad2ca3b89ee91a96c47a6b26dae86a25737e337fbc82f1b9a6e9efa643d8394d36b9f27be0bbb745013261e73419e47700e4dba300398afb423d0d20df1105c88403866490ef0190efb4a5d245bada2459a5eb0a80f22e5b50922e8d4886b23da8bfde6d0b4ad24594c850fe0ebcf21e5b50922e8948867214f0ca7b6d4149ba582719cade00e57db6a0245d0a910ce5c500e5fdb6a0245da4930ce51100e503b6a0245d189e0ce54b00e583994059c8cc1b6866ece373b2ad8757b124ca872851b69028b9d72d1053d38b44075ec6d63825fb54f7008070fde64cd8508ed41bc9164b3a04d4271fa644d9b20694c39cbff95fa49d1b1fc68930de09f2c74728317662dece0d7e13171b2e93788940e805ebfd3a85d04bc97af0af07781fa5c4db51c3ebca54a0e5798626986f4505f666007643260aa3de5b5c61341714468f51226cec1ca821393e31b1c0b985232c8a6082ee00a03d9e896207ab4faa909226dfe55418a7038c4f5062e4021c609e7871b178b440dc7aa0f35b257acd173b7cf8d565ce79c2d99bc7514d87cd0755a1273767ad3263ab9791b571f241b1f214254a35e20e67140f17e337dc146ef664e7a858bc609a1089f2fce24b40727f9a126b2b89b5aff35f72a9a231a2d42e662b335566937567ac04209fd99cdd19de066414d7ce9f0f503e4b5d04a9a4eead416e397eb93f80f91c25cc06ce01bf997fe692c7dc4f5aa2578b6c04703d4f89ab99f4bdfeb2d4de32bced4280ef054a7c6a3141d5aa4e1629c3c56c8bc5d5f245d8634e58312743bb1fa84bbe98890a503a3d94de6f880927c2922d96fd39c0fa928d58493fb622c37a11c0fa322556b5920e3e41769a27e90fa46cfd34a1c2d910e07cc5269c032289f367504cbd6a13ce7e91c4f924c0f99a4d38fb4612e79d00e7eb36e1ec1f499c1f019c6fd884333792385f0138dfb40967ef48e2dc07e07ccb269c3991c47929c0f9b64d384937be22c3b90ce07c2713dd21398cefa2ccc781781f7b86ba43c87a93ba806afbbb99f0467c2a8cbe8e3d61c73019ce5bc018d07b36e11c18499c2f029cefdb849374db35329c3783c4fe814d3849370724c3f936c0b9d1269c3991c4591724f60f6dc2d93792387700383fb20967bf48e21c0d707e6c13cedc48e22c01383fb10967ff48e23c0be0fc9412e72eacfadc0eefd7e57c747391f32fff9bcfd85c26244724463fa70a6a19f87c606f2ad87d5912f66794b0fd7d6f4ed87a271b323e1a54a13eb7052569bf12194a06b2804db6a024ed5322437935f0ca2f6c41493af04686b22ff0ca2f6d41493ae84686b21340f93f5b50920eb891a13c1ea0fcca1694a4836d6428f70528bfb60525e9141a3294af0294dfd8829274fa0c19caab00ca6f2951d67ef543c2bd36c8563f3c9125b17eb7393d14ca91eed745f609c1c3a08ef93d25caad59f2138262d1d1b12853a396649f5a4d057ef803253c3589bb8a2d60fc9b737feb154671c5c241c02f7fa444ab3e6d49ef2ba11ccad562c912791b00f3279b6046f1a3abed00cc9f6d824938fb9d0ce6b600e62f36c124ac1691c16c0d60fe6a134cc27589c960b604307fb30926e14ada64305b0198bfdb04338acb46d50130ffb00926613d930c665d00f34f9b6046b1313900c0fccb269884cb3e92c1dc0bc0fc9b12a6da21d0cfe70384de4936457b4f00f41fdb80127a2819d02100e8bfb601256c0d9101ed0f80b22ccb8012b688c8800e044063b60125ec492203ba3b001ab70d28616f1219d03d00d03ab601256c1d9101ed0180d6b50d6814bf6ceb0d8066d90694b067890c685f00b49e6d40097b97c880e602a0f52981f2314cf7a5cbc489a16cbe905acac6390f15b028ae06bb2d4bc26b40094fad6be82e1739d539bdd0393d5cb4e0b95039cbc80291745fb501900d2941aab91e6a452f3e7e5e92b8bca52d92ff1348dc8d28b1aa31769857a63fca4ed8dc241b632f03b3931a53a2ed6c40eb26730e6f31db5be4a7fa4aefdec2298a75d13a204b68420998aff05e215ebb9c4d726ee153bbf88d5c309f25978c2643d8830ae1ce0061534a84fe568b8de258fb2480722b4a94fe579a8b62ef675b50306d6d134ed25daec870d607389bd98493748345329c2f82c4dedc269ca49b2c92e1dc0070b6b00927e9468b6438bf0138b7b10927e9668b64383f00385bda84339ae39a9500672b9b70924e6420c3792bc0b9ad4d384977a126c37911c0d93a13fd4cbd04d262d122d21b97debdb0a2dc7db723a87fb6c9743fd334e66e07b14a0075fdb7582e6151c1dc2d22168b08201cf020dba5ed5980b66d263c164bfe50cebb723c614640b672fc23006bbb4cf4dcf32527b7c41d8996831cb5bd4d05d4c0488e6f36017ed9c1269c032289f377e09d1d6dc2d92f92389f0238b7b30967df48e2bc0be0dcde269cfd2389f36380b3934d38732389f33580b3b34d38a33973695f8073079b70927e624886f3328073479b70f68924cec300ce2e9438db337d4b3dde947445b6b4e937b781cafc4e9968642aa8a51a4a6fbb287a8dccdbc0649b9d6d0149f8191719c83500e42eb6808ce2e2542782a49d6d0bc8286e383a1380ec6a0b48c289dc64209f042077b505246155880ce45d0064375b40127e404806f21b0072375b40124e3e2403f91600d9dd1690841f0c92819c05aa3f3d6c0149f8292b19c8c600644f4a90ed18f661413ecb6363d930e7c64ae746f5b1c152710761b1f30815d25300d25e9998ac9dce402f69c143d6eebe1ee497bd33e19dee6759ea7714e3b338a68a21dd42b6107c5d443ec3830c691f80b44f26fa87fc4e4388e2248455006a8e8d5009bb38c8a02e0750fbda0895b0714906752180dacf46a884253e19d4b9006aae8d50093be6c8a0ce0150fbdb0895b0938e0ceafe00ea001ba1123646c9a05602a8036d844ad8302583ba14401d642354c2f61419d4720075771ba11276ea91415d0ca00ea684aa36bdef23c16e19f38edf66497c7b50af5be334d59cdb0b1d1396390f970b53968bcd460b9d5bc8e0917dafd105c0db33137d4df8e499a88f5f9e0a50ee65d782547d22b9d2ec14902f0eb10d6814bf799b0a800eb50d6814579a1d05800eb30d6814579a1d03800eb70d6814579a1d0b80e6d906348a2bcd4e024047d806348aab7b0d054047da06348a2bcd0e034047d906348a33e28703a0a36d031ac595664702a06336e70407b89b2b69df11d9de9973c15c91bd33318f2975eb9d2fc74fdab349b642e2500072ac2d20093d920ce49e00e4385b4012d634c9409e03408eb70524611b880ce4700072822d20096b9664207b0190136d0149d8e62103b92b0039c9169084354932900301c8c9b680246ce39081ec07404eb10524611f3b19c84b00c87c5b40128efe90813c0f809c4abdeafb0231845bc4f8027c4b1d732b9cbf0b84e038e6aed545b8ea3bd98864539644382d13b3dfd5472e7ca1bd15725e86d72b3334a9700915d23ac02ba7dbbb8f0661594eb68fc60280769f4c74b36139e730e7d1729115f04c618ed8c18db0964936b7e34d00740625d046424dffc8a5328253b1da831c735f7bf6c988e2c6cb070194fbd9b85c29e9e80e9987be02face67da8895747b4632acab01d659d4b54d358970b8a863f21d85ca9d87973997c730352b337ab5cd1d41829f9d8975b8d22dbf49172c252bbd2f07a5f7fe36e1245d4e970ce70300e71c9b7092ae614886f374905fceb50927e91403329cf7039c0536e1245d12920ce77700e73c9b7092ae4e4c86b30dc83b0b6dc249ba763619ce3e0067914d3849572726c33905e02cb60927e9dad964380f0638e7dbb49ceec048ce176e0e8aa2129b700e8824ce2c8073814d38fb4512e7f32c89b3d4269c7d2389733dc079804d38fb4712e75700e7429b70e64612e77b0067994d387b4712e7228073914d38732289f3268073b14d38a3f99dda790067f9e6fcc6c29bd0a3b8c4e979a0ce59610bca9c48a26c021a974b6c4149fa652f19caff01af5c6a0bca7e9144b917f0ca4a5b50f68d24caae0065952d28fb4712e5d900e5325b50e64612650540b9dc1694032289f22980720525ca2e0694e96ef0ed9d8f443877f38c18d53a9b00f34a4acc2d9969e1f2f1ce03cb05897216e5ede8df62498cab3235ad6b92730bf73d7e2317cc67c5428a4ff4224348f61dc6f600e181d4cbeb295f9b2f92bbd25e2c6f21834736093606e01d9489d99a78a7065ceb2043ab1037a3c23a16603d98ba3c4fced65c26b0b9454c72a666b493f77600e5219bff7bb5e8ee03580adae387da02328aeb6816039087d902328afb002e012057db02328afb002e02200fb7056414f7015c09401e610bc828ee03b80c803cd2169051dc07f06000f2285b4046b15fe82000f2685b40467187f32300c8636c0119c51dce0f03208fb5671b45c20a105937c60900e57199989be1ed8d748d19c1ca84a8dbfece40af24d92212535812e7f199d8f0a337db9236fcb801e03bc19ee543099b8864cb87ce06c30c27666a98a14484688e636e259b2ebacd4a1d93a23ccc7016f0c83594185b7bf247777b596fbfa4daf8981c26d9f6c7e7039827d9b30607619f2459b93d00a03c39137e995e15a837657d920ce6c7a012748a4d30a3b83acca700e6a936c1246c7b93c17c03c03ccd2698843d426430370298a7db0493b09f920ce6ab00e61936c124ec3d2783f91a8079a64d30a3d8a5f1028079964d30099b9164305f0630cfb60926e1f83719cc0d00e63936c18c620be87100f35c1b97cb23fdf8846cb9bc5f01d6f36cc44a5a9127c37a29c07a3e25d6c62c39af2d9f2d7038cc17732ea3b885716796847641a697644e77463ae93483422ab43f027f5c6bd3d23a03282bf0649e7a2de86dbfd0269c032389f33180f3229b7092362fc970de0012fbc536e124ddca980ce77300e73a9b70e64412e7bf00e72536e1ec1b499cdb81bcf3529b70f68b24ce2100e76536e1cc8d24ce6280f3729b70f68f24ce6301ce2b2871b667d56779a45ae43e03d314c86621750305d2959998c4c5e7612e172039c40c4de222fbeeec3196c477952d9fe493f6be9379e2b1c013afb605654e2451d60339e535b6a024dde49d0ce543c02bafb50565bf48a21c00bcf23a5b50f68d24ca9d01caeb6d41d93f92284f04286fb005656e245196029437da8272402451de0a50de448992afdc59c1bc2bbde4c9b60e1936b2cd3779435861bb997aa11cd544f4eeba9ba1160dd960d92880f0163bd77a219c8f49b6d6cb2900ebadb6e48da433d8c9f2c64b4095fc365b50e64412655b50ccdc6e0bca3e9144f91bf0ca3b6c41d92f9228f38057de690bcabe9144d913a0bccb1694fd2389f24280f26e5b50e64612e5e100e53db6a01c1049942f0094f766629d0d8eaa58acaaca4df50e8245f973fc392c09f2be4c80ecbd85829c0d40de9f8989ac554e0bbc54c4e07487c670c7e822316555fd0e736ee66df4e5ce5de5e22b73e22132b2ee8dbd411df3814cac73804f285825fe225d9af1c33811c6ab419ef960a67a8992ab514f10c93c236bbf90cdc5b81124f28732915b0edc4273cb5200723df5b712054ee8ab9c5bb809cb45af65218be2b712db00680f6762d24a2edb92561eca01c5c82399fed424fd329af0d327b212fa7e50b43c6acfaa2f515c0ea20824f20d94289b3a074bc46c342ea16f7b40062e9b0a5c3b00ee319bb6201c48595b24db82b001c82d1fb709e78048e2fc0e78e71336e1ec17499c8f039c4fda84b36f2471de06703e6513cefe91c4b911e07cda269cb991c4f932c0f98c4d3849972821c33919e07cd6269c3991c4b90ee07cce269c7d2289b30ae07c9e7e0a60b910e066f28520f298bbe843f4fa861a036c2f50626bcb4c5f899937d7ca40572fd9274e1703a02fda32584b5ae09075bc1d099a922fd98292b4b02143f92740f9b22d28490b1a3294570194afd88292b4354ed7b30eba7f5fb50525694b9c0ce5f600e56bb6a0246d8593a13c1aa07cdd1694a42d703294e301ca376c4149daaf4e86f26580f24d5b5092f6a993a15c0750be4589b29d01a53ba09bef3419c7b261ce8d95ce8d6a9077a9b8831029d9f61d2701a46f534f31a864ee1a9653199f5250c81632fe25d944e7bf22f11719be1c2a7c9d5812df3bf6ec5a16c595fc1f04d5f377e927bbf07582f83646ca27f982a005cecdfcebc6a208f607ed04f0bd4789af398393fda638a7b82eff92b632d253fdae0649f97d4a805bb3e40cf322f9097286a65a91cd071a04e07d90a99dc992f324d5e50c6124cb0347038c1b333ba7dcbc34f228f98077ef3cc28a4e3e15dadd01da0fed9dae4f88962cf1b70045cf4799da2073cb595bed76e0991f67620789f4e652926e75409683fe09607e6213cc2856c9ff02303fb509661437d7fa1ec0fccc269851dc5ceb2700f3739b60467173ad2f01cc4d36c18ce2e65aff0330bfb009661437d7fa10c0fcd2269851dc5ceb0b00f37f36c18ce2f6c2ff00985fd904338adb0bc74103f2eb4ccc65f333df97d03bc9e654ee0c807e631b50420f2503ba2b00faad6d40095b436440b70740bfb30d28618b880c682700f47bdb8012f6249101ed0c80fe601b50c2de2432a03b00a03fda06348a5f4eb403407fb20d28610b890c687b00f467db8012f62c9101ed0080fe621b50c2de2532a01d01d05f298176627e66c0a9c524f824aea18e05a5023119dee3a856cc5a0f66c3fd96a9adb7bc9369163177f5ac11622612bf99072203136b9650f9ec629684fafbe69c23e79dc4405827ada242590efcf38f4ccc51e27ec947d64b5865a6c6d9c9b66b1f03fcf04f7b9783226c7c92cd00b907f8e55f999801d28f6d490b95f502a5fadff4c5ce88c4bcb9e1c2ebdc0266a1c0384c4ecc7625473abfc562a26cf4a06e0d92fb3f99d8e0239da9d9707b0fd2f14db25cf413e0abffda889574c95b32ac1700acac1ef1fa98bcb8e13967b9a7e21ebd62a71948e2314a68fe57808be2a8d136c007e336e1245db29e0c673d80b38e4d3849774b21c3f90248ec756dc249ba630a19ce4700ce2c9b7092ee9a4286f36b80b39e4d3849774e21c3f93ec059df269ca45bc991e15c0a7036b00927e9767264386f01381bda8493742e1d19ce0b00ce469438d5c783debd7db6948f0717028c8d29319afa37cd9f0ff2fea545ac82b98becb9fd4c84e342649bc5de07aaf24d3291e0b1e43ecc79b45c8c0cf15d2d88d7f120fbd4fa52d05ddcd4269ca42bcc90e1bc1be0dcca269ca49fb392e13c1524f6ad6dc249fa0d0719ce3b00ce6636e1245d10920ce7170067739b70922ebf4786732b9077b6b00927e9c2906438bb019cdbd8849374193e329c1301ce9636e1245d20920ce74a80b31525ceed59fa6b66e7b362215d20a04777fdec475912eeb694706b3f304cd8394236307c2528ef5bdbd4d73430929fc96c0d70b6b109e78048e2fc1724fab636e1ec17499ccf029ced6cc2d93792381f0038dbdb84b37f24717e0e7076b009676e2471be037076b40967ef48e29c07706e6713ce9c48e2bc16e0dcde269ca40b5691e13c1de0ec4489b30babfde09cb7b544f8c1e11931aa0a1468e177a6c4dcd039e0a1e60745a2f5ce85a2d725d20af8e50e94c05ab1d4ebd8780b203290745be200903bda02328a9b3cec064076b10524e127056420c701903bd90292b0502103990740ee6c0b48c24a1019c8320072175b4012ae9e44b73d1300996d0b48c23569c8401e0f4076b50524e197e964208f032077cdc4e80fde5c849ff97bbfb724c3da8c0a6b21c0da8d126bed76bc22ac1691ed78752a6822ee4689b4b50169eab99cd16b3e1e0a86d3badb04937091493298a700983d6c8219c5b91efb02983d6d8249d8b94106731680d9cb269884653a19cc0200b3b74d30094b733298f300cc3e36c1246c5692c12c0430736c8249d8d94106b308c0ec6b134cc2e62519ccf900663f9b6012767a90c15c0160e652c254ab75f14e0d2ee20e9265e83b4b327c2300befe94f8fcedf91bc53db1ae03280750a254eb19f29d03956a86fc7039153cbe60a7823730133334e06cf6a10e8d2ae7116ed2729117164aa451ddfff76c80735026ba82bd5bd8263f0888fa6a862301c8dd3767fee85def95b00e49b6deeb01a0af727026ba7fcb9c9b38463e236885ec3df742853dea84fd4264ab11ff0d8a9c3da82b3f95ccdd5c1efbf6870c1fd9573e1d41e2ded39ec44dd8774e96b89781c4bd57a6d7eb487f3de228ee483d06a01d9289b27cc0165a969f0492fbd04c24776c7cdcdbd689e2c6a01300ca6194283bb2da6f404f386c4696d81b81127db8ad60090b2832b0bf008fcdb3152c61564006f63e007684ad600987d6c8c0ee01c08eb4152ce1003019d8c100ec285bc146b1a6da1b801d6d2b58c2410e32b03f00b0636c054b38144706f65b00766f5bc14671139d4f00d8b1b682251c652203fb06003bce9e466c14b7bd3f10a01c4f89b2a973b0408c2b1589d1f6a560d7a24a3a706413b9eb0170136c5ac98b746f0db2c1badb4107df449b7092eefc4286f3158073924d3849d7ec22c3790be8919a6c134ed2f5e1c970be0f704eb10927e9ee056438eb83c49e6f134ed28d74c870760138a7da8493749b27329c7b039cd36cc249ba910e19ce8500e7749b70926ef34486f37c80731f4a9cfc80dfcc97ed891e26be3a8ec23463734ed7d6878da3d8e67e0bf8dcbe36c124ecbd2483f92880b99f4d3009fbd8c960be0160ceb4096624e7c20398b36c8249d8974e06f3260073b64d300947d5c9609e0e60ee6f13cc284e03bb06c09c63134cc2d17332982b00ccb936c1249ce34106f33400b3c0c60d1c48f7bf22dbc0e131d07b39cf46aca4bbb491613d5060ad9fa5898fac263e5c743bf08e874261bf3b34db838d627c34d1dd7ba5d0391ec74ac553731d20339d7ffdc5c56ce75fd3f998f8f470045bc92ac459ae5724b4173957b96595ac5757e79642ee1a0da46b64c7f85f7c0af93c877b89635bb9f3ff6c81a1922d70cecd77fee561ca8e35e6c9d5f8355eb6f806a54a4474215be890e01fe0f27d66b8da78e7ff45e22ef35ab6d9c27217f732716da8f3ce2a418cdb53e0dcebde53e12872572a9304bdefc98e3531dc9327efe151188b3597b1c6ed1ecf8ac5952279c754e7bf7922ac3d77756e8be53aff73e72bf448cc54e82117335e248fd4f99a35799ca5562be2111333a7d9b2d0bcada610b909843f3f5fc466b1501d5363486b0e1feeb94d52c44a4f9eb0b7e8f017f3786f28e33dde932f4b1beb1d82efd56cd17cfee6385129d198253f4be3ab81ab845064bf6f4f72ee2817c62d156606f1ed464ee8bc7aa5e2bd3dbbdbe9d7e185bd04e667f19e3d6aebd7fe2d5a40e9d7ae9a3ba14dd31e9546e8ccf1a08739795785f08782842fb8a97c8128536b26d1514c15c3d5863a472522aca542751153fff0f292d7267976544ac9b3169faf6ec9a906cf317af11ce3004fa2eac513d5c2ffbc3d546f2fa3e4b96d1ade0e376afccff395e72faaeef98bfff3fc503dbf9c92670be0f993b446da7f1e6ff2f88aea1ebfe43f8f0fd5e39766aa663335d139c28d9de8fc5724fefacfdb95b75756f7f6aaffbc3d546f5f96a9f67ebea7ebf03f1f573ebebcba8faff8cfc743f5f195943c9ba33efe5f0dc6e4efabaafbfb81fff97ba8fe7e50a6eaecdec19665cee5fffa67aa7bfcc1d53dfe90ff3c3e548f3f9492e7d6c0e3cd4b8ffee7ebcad70fabeeebabfff3f5907c9dffdb5a54aaa739cf16c9b1f264c391ff93f57fbc64beb239020600 serializedProgramBytesString: - serializedSignature: d5dd686bd7267ca3f67cf340d6e0b0363f8d8ba32cbd8bd925141dbefc7c452d44d10387595ffce4f2d1c6facb9397ad7861511906a91834faac682df1cd1c01 + serializedSignature: 6da2fcb11e40156054e3e33c363b92ea47e573777c589bfa672947cb4a83138e6bf7e566f8dd963230de459314ba6e8fced5b6ea89e28a198cc21a5134e44704 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset index 1bcdce4..106c661 100644 --- a/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset +++ b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d07781b47768007a4208aa4aa2d8a94ac5e2c5812098a542f96d844518d129b6cd9b20491a0088bcd2cb2ecb4bb94cbdd25b9f47ee9bdf7e42ebdd7bbf45e2fbd2797de2ef1cd7b3b4b3c2ce62d16e03e40eb9cf809836d6fe6fdf3e6cd9bd9d9455552e97fb143fa63440da82ed5a286d5989a51d3fa5b974ea7f49fb3e5eebfaee6747a5f7fa6f4b1436a67812be1dffe5893feecd35bf36a415fb9a846759ac1e3832aadbff7e96bd37a0bf68eebff697d566c85be685875ab7e754d35c61a0a8818c18be6cdbe18e8155ba53f3bd56bfa681a0b059924f150a3fe18d447e6f1d8942eb47bde0bea36aa35a58f8dea6be6d4a496790f25ae5a58a9f08b7292ab26857c6ac97748579affb7cc765c2d5dba74ae22e7c6c8f717c8b6a68024687ed54486ad0c2a7bedd2be6ab20fd22a93d78b9eeddb1e1935641b8ebf6474396ff65f33e94692d746933698f40973ed1db3bdc1a4b5e49a5a722ea4751e16754ed9abee7af25d47aeb595c54dd793efebc83e48d798bc5cd99b4cba965cb386ec83b4de5c9332db8d265d4daea927fbe0dc7b9e323d49b609dbd815b3bfdfa44de49a2673eea8d9de6cd22172ce16933e45f28dbff1c61b1f32fbaf9b742bb966bb49b7996bc6c839747fdac37a0791b1c3a43b4d7ad3c3f5a649f7926bf69a748f39779c6c43bacbecbf6fb69f37e93e22639f49777bcedd45f6bb8ce0f884d97edaa4fb194e6e790f92bc0e9af480a7bc074c9a60ca7b88c83864d2673ce726c87e486f78ca7b83e801e961733c63b65bc97e4893e6f8cb66bbd9a42d9ee30fccf611b33d69b6874dfa9c498f9ae353645bb7c9f809b3eda6274d7aca9c0fdd80b6ebb86b07a74d7ac6a423267dd69c3fe3a98701939e230ccf99f4bcb966d673cda0493bc8355e7d3a3dfc3a3cfb5ff1c8bc60d25e65b7974b26ed2379f699f4a2b9668e6c6b762b5dd6974d7a85ca36c7318f780cfb818bba05a6b4b64970d8b16754f0aedbbdb270a78d7d017cc0bffd98ed82ee1e67b5004bcf398cfdf2826a576dd69e73736c352977177ea6f41919140a9979b2786f5e1650b849fd9726ddfebcdedf8b510374fc197da445c3cbe0557775137841ffe54a19d1d94eead021ad1bd0a2ce0ae4ddd5c5ce3fb3904a102278af19d0329d08664aef7181ceeaed492ce1207e3ec492a6b1f47d7adf02c653d3da0574eaf411e696affb9cfe6ecb73c820b397d11ec870fb9d70c9ada66ead0d943e8971c3476aa4123502e857ce9b66b8228991db3bf36ae2230c1d27134767ebc8388cc86239fbda541263f0813c82c5eb98afa1ddbe0bf1beed4306aabb1135c8d630fc8be7aad5ae92387cd85a402d3fa8202f11db9427c1bff8f1f88a5628a4177dcc861e87114365440fc766504a4a9f5b3c7e807ad08b3f8f7d2b9c5683f89af2942b5c040e61950d218e2cc74511ba61c1a0f6ff97b57a596933e8d5219f79f439705ebfd6e065d3034099a6f5b76c70e1caf0c70c4a357b30db29d722e50324e009b3945c4d54db6a0263bb89c7bc26dc898c626aa32e706dd4636d1c0aa536ec25e56a6485a5465a617335e7306b3d0ac016233cce095f1382f0959cf0b52108afe184afb3088f15297c954d38b482f53683f10aaee705d772a5de1002923a9b70e0f484d5b77b25d7f092eb6d5e01b37b6b59bc42a1a15e2fcecea6735a5b7eab7463fd019d8e6329d2d81ed3018688fe7ee4c9253e59c04984d6a3820f58e5b58089c22af4670de8cf765a4be77eebd43227745e0f71bcb3a873b2e5108fdb3de626cce1f1d29ff3b1ab6df68d3b0745ed3b57b2735e06cf2b3e806b0cdc973561cde44f6c14ca9fa3b7c6460f774e89d21bd6fb9c49951e3c9a411b69511dba1c2dea1a5aee559432a1f7dd37f6039af95d79156f9c2c6279fc896f0e4c7c0b1287519a7c99b95a5a6bab25dc79a38c361e64ac6ba7fd5460da5b9176439e56be434286da3a1b35dc39f318dab61b598663dfdb0213df8ec4db4bb6ef62cbcdd5d67a2ebcda114278b58113be3304e14f70c2778520fc494ef86e8bf06263e58d36e1d042f6d8ccc72b783b2fb8812bf5de10906cb209076fb84fffaff5086fb009dfca0b6fb4098770026ec0edf7f286cd016c12705f3f2f9f263e9f269b73c236305f26e794dbb033facc9472a7c7bdcd7d1043c871bc1792f634773f39fe4e6a7f6027954027753cc74995a3fc9cb3da6cab3d7432e50d3a9d806fb2a44e19eec7ed0832698b3570407181a77f1938825b6ced0c86a50755fe78ac15c66330815387cd39af9d6de2dbd9535c7b6eb6b5e73ae5acdcc9607da55087d76dbecfa7656fb5d906f611a932b5ecdc0e7818adbb53e7b4a0ff66ccf4aedfd9fe76d312b8d526d166f6293eb428be6c9c3d6db3d5334c8bc04283654da06ce72cf53067a96dca1daab72381161f02b681b31f03b7167243aa625ac40eaed33fb2cc4e7f27d7e91f0da1d3df656b55181cddaf48ab1a317505b5d15e748df9b7b0635aa36aef9414c66a077d2c69792582ca231fccc4d071b467b95270ad7bb7cdb4a0f64f5850b56ecc51c5e8e3b5b5e3bcadede15afc49aec59f5a6af1a79150b30fa1215c900a4b10c691c094707bdf6bd306a678ce0469ef5b78c1fb384c67394cb068aaeeb4b53a7c14789acbe71c97cf79554aa8b0df960f840ab0d62a2f5400825d3ab404737f40d61a8343992f2a604870c6dd2961dccf70b97549e47680abbb6eaeee7a4ab29183b67ca08a2e2cd3c80f710af4720a5c2c4981662e9f3e2e9f4b2519790b67e4976d460e37d3669761da494b6e499c1c28e738c91b5b15374eba62b3206bef08ebdb6d63a442f973bd5eabadae6094090b9af3876e6f3997573507f8aa39cc09efb70ab7446b3ec2db38e1d74310dece09bf1182f0235c3b1ce0dae16049edf0a82d1f1885c0c2a3658d578e71788643c0739c133e1282f0131cfb9b1cfbe74a627fd2924f1267155f17f54a856ea63a6bd8d264a66a1ee7a5606ef155f4170f74f7f8503913ef43fa9c399c865f58f64d7058f9bfcd527b5883565f770b7dddb3aaf02d6249ad38cf79ca6649d0cbc1233a79bd5c359a1844dcc5f46da7396b7d91b3d6db2559eb194e97976cba8417969eb5e50b4dfd4e084dfd595b13c4b9f7e98a3641187c2d6207dd9263949077f6eefa729adadda29b5a0a9b5a5b80a61646e9b92675ce56637817e391688d7103e3ebe82816500648a525f01b50fb5d177c8a061e790916148e62ed9d51fc8480b4265c8d9eb73570d884e7e9bcf3759b6d0d3cce37f00e9bb9e06d93bb15311767a6b94fcb4d61efb2bc39f074e0ea1fc7eadfeb53fdc5968cabce4ece5fdf0fc15f7771c2274210decd09cf8420bc87eb3e5fb6759f5051ed7a735c0789c7f4d5f774daac1bc4097df084fe76447fc2cab5663cd2a63f9bf5306d4c1b669b3e724287f56318dcb7eaab8be96c2fd84a09c1c403c50413f0b05df1c1442f4763ca46238cdb61176d39c2f0053afa650d74fa2c92935be45d4cee2af24e5df879e54c7dc3feeb5a624ae70df23a3007ef7a71f70a7f173313d8c5cc2eb998b04ac6b9984bb6ba04e2afd80aebadca59be2a2f73e63fc799ff7c49e67f8533ff0529f3bf6acb1196922f0641e6b31cfd9a4d30dcc67b1844b0cf6dbc7e9b605899f26a10c1095ef0759b60b831fe2888e0242ff8864d30f41fafa9e5f71f0336e150e1af0729f5282f78d0261822a48f0a22789c173cc4e1f8e810700c73c23f2604e1239cf08fb50b2f6ac2f3a64d380c973f2e086f9f5b04cf71a57e8ba5d4ef7fdf95a24afdbc4d3838a6b72ac6337ebc2ae5fec32d5b3ee0193f41593ce359a554ee2350b607a9f8c7a83ab4639fc3cea845ddd17fce7ccf1ded9fd3d8e12ee8b812f6d3ae31fb846731fef7054eaf4fb4e905a3167b9e4e3967b4864e29613665081fb198f62929bf3ff748eee397c5e8f722a7df27d9f41b09b9de7a4dbdf9e9b99cfc8a21719b23f1361b8923cb24e1e8efacfd847744bc6ab183112d2ba30704c568f112a7c527dbb43817c85e3b7419c64c1433138abd96d616ef70babddda61b8c0aede36058afc92d47b75b6830bf128e9677392ddf61d3f24a885afa6b567c2ec5689de2b47ea74deb4b25694d75cd6fad5eeddd474678ddf36514a3f13d4ee34fb1693cbce46fdc69573ae96abb47d2b77466762a7700bd505a97ff219edd62b486a3635ae2226a0f72b3d778b9d047c5c2f058a31c874fb571389553f3d9dace5d77edb77adbd119d68cc2e07dcc736e181a8d711a7d1ae7a76c83e8dc3b5c0e6fa7ec7dfa783ff6185087bc7ddad686861739a4392ddf65d3929fc0863949ba82d7d171de7824b0c1942e3f9470ac40e9c3a8bb714eab4fe7facf52fd901bb32ee4ade7e36b347fed5f31badde774fb0c9b6ec759ddf24b91ab1178c4794fbc609794bbdab3185d26385d3ed3a6cb00ab4b6e091c3dba95f322a794721e2e0e5afea06779fd69f6098862086438029f6523d0e589f468ae34d6ebc6be21a3e6953dd6a3d7f91d0947c797391d3fdba6e385803a427f70cfb4bb51c545b5e5d5f401a7e9e7d8344d0b47030b9e97df8ee0adc2cc9227f68f09e811bfbea714ff3cc971fa5c2e3a96e2047b5fc16c401fe70640769637c5da55295a4f715a7f9e4deb6b01db412fde28481906ee6c44bffede839a81c0705a45e951c634a7f9e7db347f5b99a3646e155276de22683982ac67928dc36738d25f6023fdae3293ce5ed3ad53f746d4189e3b8a52c7f4b9c1fd52aeb5f29a6497c4d817c484417e9623ff8536f227d958c66f418743b607cb5d68a4bf5c7d5ee1f4f9229b3e677d4706d9750db9e382711cbd4deaa81aea699119a9f21ea914bde638bdbed8a657bbb28febb89ba9b93134446057741947ad5e38883fadd17fb198f348c434b683d774ae33c804e62693f8686beb52290bbfa4074a30a5fb73c87968291628bc24ecdd8a7fc76efe4bfe4a7ddd6a69eb48fbacda055fa497ff6ad91aa3912b4b93c6477adf6c9a7e09d46a8da9d5aa243e407bb0446b2a5c8a2f85dcaaed3654fceb8c1c01d7ccfc087ba3be603e859ecc684601ee4c6208af9706dece74bcbb24f73dba61d5c4ab5a81ff974942727ed5c01917432f1305381f8c67e17cb9249c46843383e1b33b3107933e192d9f4e97a471e21d029728e05bbf328bef2b24f1f9af3a8f02aa0f5467517da524aa86254b7306e55d66d8761f831cefc3765140f76ed248bf4a125df6398d2860992058be5a120bc48ed9971045010dfc83f0d623dc3bff17d6abfb0bf1e46341584fd7a31ee18cf81cca1bf3c686f87a90c7ade45fa3486c97f05848828d9712051c798234c144919e2c911780244ae875b38322fb60a61506455fabfe7f8f575a61bcf27500e19681e078a1af97f442355897509be05eeea8566f0ecb79eb7f6d8e4f6a0f52fc52fcd2769575d9df2009abcec0ca9de1382687ec8014b2e304d9374a225b6d9065d4b4cabdb9d72687ad5e0a5b35c1f64d92d8c0497b5d71d6c1677dd443ec06a2677f2304e43757c6fe8ecb614b48616b22d8bea532d83ae5b09d96c2b68760fbd6f27710ed116ca06d04d9b755c6d28ec8616b90c2564fb07d7bf92d4d109998a5b51364df21892c6e90dd930d738f4b81da4d407d67b9401d8e20a86708a8ef2a07a85444412508a8ef2e17a82836bd5d04d4f748825a87d2b26b4ff2d77c462ffa7a9ec0fb5e4978ab8c954d9b1da2b6d62485ab87e0fa3e495c7ce4d51d412bdb47b0bd4712db1a161bbc3e257a21eb6502eebd950277520edcac14b83e02eefb2b05ee44042dee0201f7039502773482e04e13703f582970511c969f20e07ea852e004271cc7a5c07510703f5c297082375846a5c09d23e07ea452e004c7a46271dc2102ee472b054e70dcb0450adc4102eec72a054e70aa5bac733842c0fd78a5c009de0d1503d74cc0fd8424387ea42ae8e16aa5b055116c3f2989adde60f33eae2de8dd6aa4a01d25d07eaa12d0042d4d0cda4502eda725a1b9336f8e8059591b8b4be1aa21b87e46ba2380e7eb1670f586f7b9f7e8ddc21b22e07e56121c54bd6b6379abac23b07ee82a01f57392a0ecb787057d98986db512643f2f898c0f320427279352d8b6126cbf50196c82c3f6ed52d8d6116cef93c4062c8a59414d1f5c8dde54f92582f5fd9258eb55eefdd3ecdb7fa237a0bf49a0fda22434775c3a667407db735fa211c538ae8180fba5caf83ec11b8162be6f07c1f6cb92d8ecc189e00c885870729820fb957234d1f4d2db30dc43a2e0c41639ec27e07eb552e004272bc5c09d22e07ead52e0a2b8ac663501f7eb95022738001303f71401f71b95022738961003778580fbcd4a8113bc5b2f06ee0c01f75b950227b83e440c5c2f01f7db92e0e0dec8ace7b55782f3716277e90708b0df9104c68f142e44f01efd0182ed7725b1d9470a820b69c4460a5d04d9ef55c6d204c35db131e94682edf7a5bb02ef03b7d997e0456fe1d62001f707d25d01d81b9ce2be0f308a9346e709b03f2cbf4f135cc72be6d3ba09b23faa8c4f13b434b19b80ab08b60f94a369c205637ac723d911a858d3ac25c0feb8dcc0a2e8cb1401f62792c0a08d3899c2cd16fa7312d1bb637a9d40fb53496890f57cce6fa388c1127b11453f81f567d2b09c213a34c968faaf2708ac3f2f27ac28faae9504d65f48c2ca5fb31645db7a92e0fa4b495cd9b095bedb3d8a77021a09b2bf9244e64e2f8e2ae745f9f4a779a2b89cb48e80fbeb4a818be2e2e51801f73792e0d62abab0740085a4f0724744f4c6983708babf9544c78f31bb22b876682fc1f67792d8dc2153b688d1ec47d713607f5f6e60518cd3561060ff506e60824b5ec480ed24c0fe5112987d8251d0c6c49cff6682ec839571fe517cbfc21682ed9f2a834df0eeb9589fb98660fb67496ceb95bbded6fd492defcf6945b1b19e25f8fe45121f6c4c6b59a34a70c981d81dcd6b04d3bf4a62824719609a7154b90f694d98424c2878b031efb750226063cf1178ff56fe3e54d0ab89213b4690fdbb24b2b5ca9d4fcbbed43eda4b465b08baff9044075391057e42260296364c70fd67391a277dd047d4c26e49213b4990fd97b48539c81c89a2b8b64ae15a4b70fd7739700d451ad72682eb7f2471b94374e7d7081695f052f7ab52c09204d887ca0d2c8a13dbdb08b0ff2d37b0283e30d64980fd5f3980cd2bf7779ba239cd1827c0de2837b0284e646f20c0e0c65305267f7a223867f634c11693c4b64e799f39c9fd5d73c1469a9282f7ac7ad3fc30602b4cfc548101ac320690f0bc752691330195b02ce74af8ac8b4b30cfce240aac404f14f993508900af92777e956f83a92568bd57f1cc94a692c234fb0b7d49783a3c069309c5fcd0b4bf4ca8237f69d55011317b4b9c0ccdbac2f849409ba685f5e32d75b54fad2477425dbc99f55f41ebbd2ab90bf43d1c82ed152e513cc6ff086539e6791ebf5a757e4d7416cf84622ec7aa61e626575e06f34dee7e3c2d3a3cdd57e65af49e522dbaf812d5485ab4236d02f17b64f706d0ce5e0f5e9db367cda23da4966cc169df703f632c00896d319811e1a575e8adfba86b06a54e29f71ff494ce5f23f6edc3fa5ac7a7a455bf3e7f0ce5c1bff88701ab33782bf2e20000 serializedProgramBytesString: - serializedSignature: 02a74ce010eaaac380844338d6d6de557350c8577d0008b5480148003ba96183bf7f3c297591485afd0e333e27aee9d09970908dce85c5475339ef2edeb49003 + serializedSignature: bb68fa5a08b41c044b6389af5deebb0b58ffc636bbada5c8a46031e0d8922cc68211e5e9da8134e6d46805949b79ce1eabffc999193e541b42a38611217f380e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset b/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset index ecf47fb..bd12c4d 100644 --- a/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset +++ b/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c5545f6f82740484215a40b1814350a921010bb94501504216043219010a2692601c15eb0f78e5dec057befbd63efaebbabbbeeaeaeeeba7ddd5d77fdcf993bf7bdf3e6cdb9efdedc775eeef5ff231f32b9edcc39df6967ca9ddba954c87f79a3e5af4562bea81063c442512d9a44a3fcab42860df2c73972cfcf132d32ac95bfabe4b5d1a238c393f06fbbbc41f2f72c79d42adae493abc47219d6a9eb0b448dfc7b967cb6461ec1d915f27f8dbc2baf8b7c68a1982ae68a7dc5c0bcfe19442c520fb5ea737960575ea1fc3d45ac95576b94521049a9ba3450fe5a20afb4aa6b0d5269f7be83c521caac06796db97ca645d44b99cb94c4c2f55b09f58770822d7438548787c9ff5de5ff8fd0318487ebf31fa363b06e2971df27c67da71bf7f5d7f77daa8f0b74b8993eff337d5c489c2f22ce7723ce7727ce77d2b20af5df9849671dd61bb6d73b36e5cd9661be0c977ac81aa8c3c148e72e3a1ca4e57ea68f87e970b80eb7d461b1beefe73e7476653718b21bf5f12f8cfbdcf3bf447a42d884f46d72eeef34dbb0a9493ffbb9715fb3879e2ed311869e5f18d7b7d2e77fa58fb746711779c837d3ce0d9bd173230dd9ee3ddbe8b0455fff353a86f00824e308c7d6cef39c3cd079bd3ebfad0eb777ce8f70f3ef0e3adc0ec918a5c3127d4ededf635000db5a456abe6cd53a7da975fade43969bfe6d22359fb4e970953eff253a8670b53eff1b740ce1681d1ea9afff161dcbb8babc6fc4bbc688d73dbf16f171eddcd178c6cc2b638cf4f4c3ee2883dd518e0ef9c50ebbfcf11eb2ccbc7534d2b9b41dba1c63e8728cd665a3d6e59900ba1c2bfce7f3e3456a3e3f5e87c72119c739ba74ad26e23b01dd5b86e2937a77dda8cf8fd561b9e02f13271a2c4fd4fa7fefc82ae81180e5490158ae3358aed3e1c948c6c98e2e05f710f19d82ee1d97cab2c02dcb6ebedc29072c4f35589eeae85f38d5915578400096a705607986c1f20c1d9e8e649cae7579dbd1a5c8ad7f26e87067063eae9ebbe8f04c43cf337578963eff3b740ce1ae3a3c5b5fff0a1d4b5b8adc7c61b67560df2be89c1be2b6d72b3d77d3e11064bbd7fd5b07bc7f88a37fb7c58eaeddfcb4ffbbebf05c83e1b93a3c4f9fff1a1d43788e3eff7b740c717fecc4ddbd8c88e77c239ef375788111cf053adcc388ef9bd4f8ba5706b0f12223ee8b7478b111b75b375da2cf7f8bee73cf4378a1befe0723be3d8deb5f18d7f712fedba6ed74d80fe581893a9c2492e506c262e1df3f9d6c911bc48fbb4cf8af472e37b85faec3f54886ebb75d8aceb972a6e8f02a43ce553abc1a3d73b50eaf14a9e5128e657ee909be8bcc9f3dcf46f1b9d78bd0df105e61d1c5ad73ae3574b95687d789d43ae73a1d56e8f01a915ae75ce3e8d5ab58a4d62bee7d9fa7ded7ef117decfa69bbe9fbfea88ff345b2ee80f3dfe963b75f771bb2e90a1db7abe3663abc5524eabb5e0fe8737d8c6bae2cf79cadef77477a5cbd7b1871dd9e8cab77b111d7ede8f93bd0393ffd4937bda6ea7083915e1b74783d8ae37acd78b148a94ffb341b32ddfae40643e60d3abc53a4d62777eaf02e7dfe4fe818c2bbf5f93fa36308a7e970a3befe17428f9b0d3d6ed6e1bdc25eafdd2752ebb57bd17908ef17a9f5dafd3a7cc0d0dfcd1b0f1afa3f68e87f8fa1ff74741ec2993a7c48dff75774ecda0fe1c3c6f58775384324f2d0f0627daeab482d1fdf39d7fbb9ed45d4d27256c0b474d32c5b69b27707a5892d2d1e3118b8759e9b6fbf46c710ba3ec28d22d54770f3fba32259c6e11e59a637bfd878f6fea4befddc7366da3c66e8f5980e1f37f432ed79c278ee091d3e693cf7383a0fe153fafadfd0312e9f7f47f6e1f3ffd076b86dea3e3a74c78dbcd2c66c375c8657e8f3ff749e1b7a23badfad2b5dc66e5bd347d8db05f33c15b7db9651f9c56d8b37187c37e8f06991da163fadc3393abc5ea4b6c5bafe1fe0d68b1e6d667f771cc5d266f677e565a9cd1c30c9880bb599032a8db8c2b499fbea709e0ee726e3199ec9efd84f87f3853d8fe13c63a61f55f73e63a4df333a74fb6f6e79ff0a1d4bfd06bbe52b533ef43b366d1bf3746d5820bcebede7d133cfebf059c3ae6775e8f69d6fd2d7bf47c760d778e37e37ed6fd1f7ff0b1de3fb171acfbda0efffb7707cfd17f4f9453adc9f487f190e5eaaafb9630e07fab8f7201d1eece35ed7f73ac4c7bd87ea70898f7b5d3fff4591ea577731cebbf9d97dae3df999ca0b7ed3fd2b742cf51b32da896fc83a223eaabd7cce88ef391d5678c747da45b57f2f19f1bc64d8758b118fce9f5bb863dcb6f2e59ec3f33541db95ee96f392e31666fd40cd5df525e499f707cd5b976ace6e7b5ca5c36582ae77970bfff9b1dab8d726af46872b847d7ccee62398fdf10d467ed8a043dca72a44e7e0deff10b2a836e04691eabbe17ceb722e32ce537150e5f2162443e7cde16edab9fa631f40a7df30773cd6e2030c737d88cd8d6bae2cf71cce477ec66b5e4672faa17310bea2e5fd808ec116b7dee8899e83fbfeabd3f72ae3fa0c74ddaf5eaf5af47a5587af197abde6e8b5a53bd7dd5b24f32bd26bcbf1c6f5b901f47a5ddffb3f740ce1267dfe47748ccec39f29e7dfd0e7f3446a9df626b2f74d742f846fe9673aa163696ff1b7866cf7b9b7f5fd9dd13184ef685d3f46c720670f874fb11eff2f7ec178ee5d2daf0b3a86e7d619f70dd0f23f35cebfa79fcf47c75d2cf1986b075c7be6a06390d355a7a75bef7aa55b7fa41b84ef6b1905e858ea3262922373c452e3fef9199e73fbadb5467c3be8fbddf26eea0871b9edd74a42575786d778aa97ed6e79f84073fd081d43f8a1911f3e746cda6a3171df27c67deb8cfbccf44bd12d3f4fe59f99b2a5a812cda254290bb3e97e97f7b84f665ed803a2bbc22ff8b79d8ab64dac958fd6d856d72c546b77dac438516e5d5d3338af07d2bb42fdae9277d429a1ddf2d2a278342d0a50ae5efed4a0a541adf2fc0cb5b2081607d5c92b636487ba4e3db5548c95ceedc186944532da7ab14a1e55cadfcd4ade52a976fa9d994c826544e633f3a54c679553833ce3026d96c7f54ac305eaf76aa5698dd27e963cd7a6d65c35caec3f45866b546ce9b6b7c8bf6d71566a64761ded8b9da8f3ce922a3799a64a6b40fb525507fe5f8a74448a00faaeddf29c62d8a554b51e67a6a5c4ff31742a19681c6769196315b2bc9473e5a254b59ff3d30806b731dd427bfe76784f10e33d6db19381e4de4259904ce1354b5ebafdbabd8f7e393fd5b471a2540dd90dcd609a175890579237204d82b709f9f95dca4051137f9e0dbf6afa17e410bf735f9dba2f780274558d5f6a02e441f7b7125242feaf574b4babd4c2d4e5629e3cae928240d90aa59ca364bdbc9e965e6520bc40214f6f5033a94d41ef64835e986be8996b192fe88509bb92d0e19f9d60114130930e14c1ce3682ca7b5ccc4a30dd1d73ff9a229f5d2949ac566dec2af9bccd7df3660ac3273b1a4ced3cbb2b9ec556a732984614e12e36c26a7ca72e27841748cf661f696e525a93f257209e56d59ac27d0b554e813cd42c756813d3d5baf57a695bd256579237fb1ebed9f754ec7744ecb3af2b952af9b65451a36b87b1a6ca4279cee9064c5357eb947de0455629e97365593d4cfb98600d75bf4b7b8e7a116095d2c43b5d7af94e97de2a5d60292da7b654ca74b5a44c19a4cc6636038a0c0340774270812dc9d5e4e2d20e4972a8b2c1db6890d6d46a1fc5eb5eefe4ede33b79fbaae41de991bc4135a392b2d09694407c733f49d9974eca224a70bf9082bb5182fb8714dc9d123c20a4e01eb65cad8651ab3a30572f506e47b592172e5f0ff49daf07a97cbd4dc67c1d44372a67f7b451871a366f49075277dc74efaa3833f1c1be890f51c4b7ce48dcaf5e14ed5eb6c20327b7f0537886d085a73725786848c19bd9f2878aada643f2873378d59421c707772ae03db5ce06a75265fcf61eb9a2fdda140b71c244f4eb8d4db327e6db33e770953979d4a0326a1f5b7e8264dfd2c2a90c384933c444f4eb8d4d9bf6ca4fcb69c3e99cd6978ab2d8234a4d0e6e11c5e3c68d9b1828cacda928479051ae58b142c7e6fe0a16653f5b94e0d06de5a7a016d082fb5382a1564b1b0b01e583481f40491f990de9036d958cca8295ac958cf9aa71932a47308aded88ef10f68b04799e31ff622bdad2ad283d28ccbac02556007d910aa2275102bc2d40eaf33a456637470cdceac7b9737ceed6c05c24ab344d11c2eccee77306d28b2836d591f32e7f6d6f436b3fdb674b61f4249de21ace42d6c92a113334aa48fd1fd28ffa5092fa2850fb5653555959e9893ac9669b2d4d6a74f1f857167cbe6cb7085d202ce8316992759bd33eee8041fe44aa87a7f1acaa21d6f058c577553c30cf662354615ab68e94c15d261b60c0f79b2d49218659018f0525db7eeca7a33ef8fa1f3fe70aa1d1c6b6b07219e25d25ea8ccab558e3747fca68a1a3df710a4bddcd25602950390db291a679ea35e78cff7d94b09bc38bd65fa6cc1447b5e1c27a8f9166f1da8fc526c23a89c9cc60eadc3c0635fa5ac80bf57eb1253a9e24ece2a85a99d6021d830cb2c8df2d9acec7752eccb7dd403d9d09e4ab11154c99b602b79bd54c95b224bf91235cf51af8e60f18ab3434e90d2b61515f3ce99625e222d5ba94a7f6da2ec0789796bca41d825ac833092b269579b4dbd954d15ca924af9fb705163cc9306b16a1b2aeedd6c710f3278d23ac075c8e16d81b4d9d6a60db84abb8b7457697d670b660f57693bca54587618a6b75762130c2dc09ef66a355df8385af8f61492bd2c48560644b2038564624824a3282493ac48264d0a8264b44578a9eab6e67e4d4afb66e7274b3d07da3286b5ce9f22bc9694049d9bdf914af30aaf1ab43c0b75f7182ae6a9b698374fa96b26cbf6a93ab136042c040ec16bf1524a8769361d0a940ef355ce58abfce220719551714db7c5d543c555a956acd4aa36aa45e5c526493b48ac63a90a6386a5c2d8d8355885514e099f69117e4c40e1e3285eb3fcf29a2d692d97ad51105ee32993f6b698f47d41309376a284ef6311fe4a40e11328e1b32dc207150513be33257c8e45f85785c184ef42a5f4beb69486b1de7a95b2700aaf0f83f251a5240449f15d6db143fb31d7522dc352a634e15368e1bbd984839b082f9f9a6e625e103771770ada7e36683097d8a62a6928105355e55d25dc25c64170ed618b17da72686dc3ba377b52462db019e5f8be4e9be0b6e9ed6f8ff6a2e2aeb4c5dd57e0f6c8d950b352c55babff76f409a2c1449b06d0f02d4c5c30464ae055d6e0232593284bf7b759ea8c9454e8a1ef64295b255bc1b9aa27d9a26addea80d64eb66851aac6ca73395262ae2e0ae6b9c1ebc1fe06c2e10562db2849a6f829bf6d0a958607d9d2b06ba2ce84be5975a074aaa0eac7832df563a780f5e354ca8cc53633c0fd84f9801a694695840389bf4038cb259707cc7ed3a8980fb1c50c6b7656ca9fc5b24687e110085b6109728018a7db628436f45091de86ceeb13ac0d9d4199b3c4964503683d9312bcd4c609e6174b03c99f45c9afb2c94f6dc7e6c9b46f5513eac1dbb1bda9d45866498d2ffb064b8d7d28e1cb2dc24fe8174cf86c8a58b58d580f55e5b4a9ea0a9a4467b06f8cfa09c26b0e550dd458aa81bc80d5c0be14af15165eb70e08c66b2ec5ab3664d19847095e495521d023a992e9d4de44d88fe25467cbb40139cda7cc39cc668eb025b187ea0b28e987dba4837b9574f267ab79e0365967b7a846bd25b13779100d2aa91c5c6fc9c15d02e6e08516e1a56a7e7aa1e898b744a86dd9bd3d9a0691ee6a96aad9f0c16976f8890de66c0a411c401b2f657c265dbc4219de23c37583c8194ed8dcbba49d71523ed322aaf434db6a9941c14acffe54fe3ec296bf8b0574989cce6ab152bb41b56335fa058323e535382ed61394c52a03ac55c7b5ea5ab0d6ee00caf4168be9ef0734fd40caf456aa682fd2fd8526695033eac1178b9a44110f62de4194796d16f360d94810f30ea6cc5b65336f98baaf5116df2ae1ac0186657ff3651d56accc2a9654921e2b9c5b217feaf552c020462fa68c5e6d317a7440a30fa18c3ed266f448234d97a5f43646ab746d4cb8ecc5bafe6b517d4827d3bb9082b9d4875208d658101c1010c1120ac15a1b02e8264f5725b35e1bd4a650d4eb26bf5855e80ea020262ea54c3cca62e203014daca2841f6d115e3c3498f06514bf63a86a619aca164e4580b393933582bb4bcb29f38eb5983735a079d594f0e32cc29b030aafa1841f6f117e6340e12b28e12758849f1e50782d95ea2752b5a5f95a6f714ae5e196a306ed033ab9e36851261331485e5849e975924daf51a1f44ab6da4db2be6c4c5c1b1b50e73a8bcea56a0121d40a1db572140fb94f5631b46f15297c9fc0dfe019ece852a21b99ec6846b98887d97209103fc5a6ac9994ebe8a43cdc261826024e1521d78bd453924f0b2bb9c12619eae9d3fdc028a105375282cf0829b8896271665816cd36c9500d9ee547e5eeb4e0232895cf0eab728b4d320cb09fe347e50369c1ad94cae78655b98dca18e785cc18aba8daff7c3f823daae8d536c130a8005f76b02eea0830a8702405fac2b0a0d750a02f0a097aad4d300c7d5dec47704f5af051148b4bc2b2389a2ada97862cdac7502a5f1656e5632995d78754f9384ae5cbc3aa7c3c551b5d11b2363a81627165481627522cae0acbe2244ae5ab43aa7c32a5f23561555e4725dfb52193ef148ac57521599c4ab1d81096c56994cad78754f9744ae51bc2aa7c06957c37864cbe3329c13785147c964d3034acb09d6dd886f56c0af42d61419f4349be35ace47329d2b785247d9e4d30ace8810df5c3aee8399fd2fa8e905a5f4069bd310b5a5f4809bf330bc22fa290dc1512c9c594d6776741eb4b28e1f76441f8a554a9b9376ca9b9cc2619eaeafbfcc0f6a8abd7532adf1f56e5cba9fcf140c8fc7105a5f2836155be9292fc5058c95751301e0e09e36a4ae547c2aa7c0d25f9d1b092afa5603c1612c67536c1d0d8c2b77ac236b61b28ad9f08a9f5f514e827c382be8152f9a9902adf48a9fc7458956fa2243f1356f2cd148c6743c2b88552f9b9b02adf6a930ccb85e1db34e41e29e6af40bb87dc668b12165fbde08792c7e65bb753b6bcc866cb1d942d2f85b465a34d308caebdec47b0c730dc9d36c1e09dc0c721c27a2777598497aaad1672b95279aa5a36e0cca0075fd7031fa91861e1a05858275de0f315b615cb99f4a0a656eeb651549b03e4728594bb2e7f817a4ba03d7bc9bc6e2976a56af381f4d54a7e621b9a48067b3a6c12f695507e645369710f550edf08590eefa5cae19b592887f751c2dfca82f0fb29e16f6741f80336e190f0ef78154b3382d7e8081eb4450085eb5d4b6e2d83dc8ab29d19cf263a9e87a88cf35ec88cf33025f8fd90821fb10906efe5033f823dbc97476d826102e3433f8207d1821fa334fe28a4c68f5359fce32c64f12728ad3f09a9f59394d69f6641eba728e13fcb82f0a76dc2a141fd4c84ef553d4309ff7916843f4b09ff4516843f4709ff6516843f6f115eaa36e589ca4ee8eeb236fc7772617bd09dd03f1741f78cf94204df113da8ce94dff1822de961e5d9af123767487a8f95672fda844377123e8417aa3bf9129563bfcc428e7dd9261c1ab4df88702ddf2b148fdf86e5f12aa5f2ef42aafc1aa5f25761557e9d4ac2afb390849b6c954e319c5c96c34a27f36a38f78589e06bf57e6f4b586bf5f28daa5eb64dab5ec2694755286f50c9fa6d1692f54d4af81fb220fc2d2aabff316c567fdb2619d6307ee7a7747aac617c8752f94f61557e9792fce7b092dfa324ff25ace4f729c97f0d2bf9032a01ff1632013fa454fe7b58953fb249868afe1fc2b2ba7adf44ed905acaf715b075c291aace393cf192246cb030435d999b584d0de7ec9b69db36ba84bb6df15135519026eb63caf27fda2cdf8db07ca16a11eaf5bbcc4ebd0f5acf927f398f83dbe56c3591ac9f4d1bf1b5d4fd8a8358f40965d1f7368b4a098b28b67eec6abfee9f52baffcba6fb8476e9ee6cf0b144bdc6db9a787d6d5f9def4c5bf067c78258f233ca927fdb2c81cd4bece5015e989ca1de986f162b85f3f948d0b1555bb15cb81bd4d365aa22e51e6cdd2279b62ee086129f5196fdc766d91e461a8db37652327db409d7220b131b97d1691f7c2bb19f5356fd60b3eadc8455ee569b78a3cd5989f7a056882aed07ce4adc99dcbe73be2afb35d24a671b963189cd68e0ed930ae1bc5e077293cf24b7b585b7581628094deafe56cfbc6b5e496eeebac4c392e4b6a3f64d47b3919f7e4191ffaf8dfc18cf32efa47b6a399fa6721b94896ce7995f529affcfa6f9cc2c968405014b4236d2e973cada1fa91a8d6e131c2b60333ca7ceaa526f4783ff006f47bbfb8178b72bd96b75bea02c836d12d22cab612efb6db2e582fe62adde046b91a25327dcd76ffd97722fffa23d39e05714a73c1ba7851d56477a130acfe1d714874e360e07317298113abfd0392608912f29229d6d4446faaec367e83a3c3b3ed96f282dbbd8b4dcd6a8c170aca92dcc6c9546b5f2ef9569ba26b7bb08a2e96f294df36d9a4e35344dc689ebd9197a0f2127b755eaedb3697de9f3d9aa777f4759d9d56665b961a5f37eaf531adab4a595f21cada9577dd8be74fa8ab2a0c066c1645fe9344d1c216fafd2bdc9b51d9a425f53f615daec1bef338552bd4fff69849f0b62c5ef292b8a6c564c482bf7c95893bd5fa0bd425db1a792978ded4f8f6f284bbad92cd927a3254e8e9bad5a9dd6449d3057a65732177a5bc66ff3b794cddd6d36c3c418dd93c6df754cadc3572744642bd7fd81d2bb874def593ed36a8e80cfcb8187dcac6c59eee12fb72fa5da6bef1f297b7b5279335bbd21772cc469dfaa65fe6d9457d3cba477ffa13d9ee07794cdbd6c36ef41e64ddba827ee114c56671cdf8fdfaa3f5156f50e53ebe38587416a4bfc5c102bfe4c59b199cd8add0c2bcce5798e1dd395a7dd9061dcc5cb52536e108bfe4259d4c766d14ebe2c72da63ba47e0f75a103bfe4ad9d1d7664745463fdca9199d8f0ad479d486f46858f66dfc1b65e3e6fe6cb4d7fe53551d00e3d651a8f1ff4ed9d88ff2abecb5df1cd586ad94fe94636b851ae184b6a04c8c0d5457b4d7927f5096f4b759b26b401fc36d9ffcf918d9a8c1ff49d933c066cfb40cf6d428bda00572c71452edaa4b8c6154a5dcc5df527d4fd939d08f3f1ca49feced13e7b24ff62fcae641369b67fab239580f2097d6fe9bb276b09f3102bcdde864b5e00d664ebcc696681bb0ac2016fc87b26088cd82dd3dcbe22c01fb95d5a69540bc3d63a6f9d86c94bb1f289bb6b0d934dd670b3e4bd9e93dfad1be56bcfdf9efbf94a54383b571907a95c2f9c67d6adab5e9b3dca3d6ffa32c194679f5c1e7d6ddf1e8e4d50ae50bdb46e5db579a7ea4ac186eb36276402bcc3a025a33dbbc796a2dd1be1882580d135156abb7b4597d4896d2ae358475b9e192477129b671d9c6a887ccd4e61bcfef44e939a2fde3c4669bdd91ad7467cabeada8f6204ca9f4d37273ad17eb4259ba35d59ab77f85529d1e676e553eb5f321e7d43574d949bd7ccaa691d96b19b04d734472cfd5ec59d195b2621b9b15137d95b14c630ac1cb58fbea8f02cab66dfdcc0752fe56a699a65cfb5a859495dbd9ac345798a45b395db5dd0daa2f979d5513ed1d0d2aa22c2bf1376fc36159f66c2e903f7979b0d98eb30338ace599a73c546714bf7404386d65897a23f3e7ee21fe06a913e4a3ca44cf26f327aeb79738bbc247ac84ca35901490b19b81ea0a61becbe1ac8b74c7369c120e2b7767a8f6bf46590deb2d670be703a57e3f356e5bd301676dd6f9ffe8b8f972789efaa029962549ab2f6affd42cdd0152b5b74ed54ea5eadbdda3da999b326b310a62eb6ccf43e9db29e0d261d3dd11e0ae2e5685648998299c0dc69d0fa039dfa2cd1853a64fcdeda804546a0119c5e1e10c9bb8c12a7b390d608b7635bf92320bf23b95410a8ce6c434340d53728d93a30a1e65c59f82af8e05c83dba2541eec8097250469053448d1ea498aa9cecda5800fcac2809700c27c09e0a20d40bd8b385bed70a29280ea87e189144559adbbacdfd82731c303dd33589a98c13535785c9e9d3b5c4240fc13f17ce584e38fdd2f290b9f8a3422f7b8947ae7abb53125c3927b802056e959456ade7aee280677d8f249e71b9f6bbda5437380e98daf29398c67362eaefa3f8257dad38a0dbd839896e27fe9acbdf77b6e3006e252a9a1338c10d48cb73a68b3a4d5d89937bda03f9f73b776c7b997c61300ee05ec94b82db85135cef8ce0e280ab1fc2b56bee7dfbaa9874b77b1402a6827c43b8b92ea1fde364c1d8d2237a902ba789356a15748b92576d8ef0c1cb5391d37c373c425792d6c529f151dc4a02d5657eee4ef6144a023a36251ee374f66b8e2f69bbe6f681a96b50864ada354e5312b8e92c0935b05612c8c729b174494a320ca7242712ec1300653091b0fbffe763fc6530c6bf0740f8484370eaff3df9c711dda59ef07a85f712b3b1b27e3674189aa643ea5e5a6e0b60d3a628a58dd8d68f81ed6927e0bb326e73ba57947096c712e78b08e7c45ce0ac258162f521774ee0c359c4857331c23989bf4746e7ced419e6b17c280bb8503e84504eee589478e17f191fca715c28cf4328a77424cad4350c8c280fe442d982505670a2846f41ac5208931fc49ea55f6863c3d6970b5b11c23695135b2f79d0ece12eb3a11bc485ae0742378d135db12ebcf5f2a67ab5b01a1c9bd44fb47bbb408c059acd01ba14e19d9e8bba71b9eedf98ebbb525b6c46946c2df670847246c7a28c7b8bbd254239334abd1c56b79cad905f8970ce8a12cef258e27c0be1dc9b7f8d592a4e3f6fdeb1167a3627e93684751f4eac0333e4d254379db5c8b339ea4f2098b3a30473a718c27c0cc19c132598e36308f3110473df28c1641cbf648379338239374a30cb6308f30604735e9460328e5fb2c1dc8060ee172598711c76bb16c19cdf913053bb96ac30d93a974f21980b3861769307f57afe1c6f8f16bf1ecf4084ac92131944bd4a5dac14ce9e136cb08670c1ea85602dcc45f7d0df9c22def880b1d83671615d88b02e8ace84d82e31ac011f4728f7cf4573e277d67bd718ce79ef8d601e1025988c39930de67404f3c028c1641cb66083b9138279509460320e5bb0c11c8f601e1c25983bc710e6ce08e6e228c18ce3a2ab0908e6215182c9386cc106737b04f3d028c16474d9d9606e8b602e89124cc6a15e3698e508e6d228c1641cea65833916c1acca054c6aadc64f610dd1d608e6b228c1646c80d860ee86602ee784395ca40f73a47e04cc0de1bd1e78cb06b6756f52c373ac5e67772eb49721b4d5d159ebc6d8b5645bebb6234259938b1545fe7dce38b6ed8b10ce1551c2c9fa560f1bce1508672d27ce21641deaf5a153c666a9840be91a84742527d231227519b6fbf56be725cc3a5d9bb677c76746f7ea1b2ef49b10faba5c540e54d5607e9e8715e7262e9c77239c8771e28417ca9ddcbb5c3950e0993a6f61c4776eb33782777847bafaa92e14eb1a4d36276a2a82591f25988cce3d1bcc690866439460324e76b0c19c8460364609661cfb4a5310cca628c1641cb86383b92782d91c25988cfd2436987b2198474409661c5fffdb05c16c8912cc38ee7eb03b82d91a25988c8b6ad860ce4430dba2049371b9171bcc5908e6aae82c436474d9d99621de8f50aee644d953a38488572890ae6cd817810d5c3e173881c01dd9917930f5dd0ac63cc8f666c54508e59ae84eb731baea6cd36dc722b46bb98b77b51a1a4e7e60b4420db7c1236ce0867381eb83c01dd591f394f15f81b405427974478e9da72f4d88e3e2845311ce63a284b33c96386f42388f8d12ce71b1c4f921c2791c27cebe1a6799f2241dfb9bd416bd4bd48c65959a6f6c88a14b5e82101e1fa58508ace3e86ccdcf0108e7091ddb59c43def388e55be8c509e189d7e37a363ce56c82f46284f8a4ef7318e5b46ac43284fe65e4ce0bc180d4abafbc1e3bd09d9e0f5e682978fe0ade3843752a4ae296a425fa80eb2928875e9d63a2ecc1f20cca77062862f18786d3e1af7fcda15813c353af526e3283a5bbd791542795a7487dd188b3bdbb0dbd108ede99c680be5013c0c9f1589efd6cc0508d7191d39d896eaa2c7716dc65608e5991d8b32ee2efa1e08e5591dd9d44c5575e132e16ef8c486f2352e940f20946773a2b4bd0c60dfad353939c13aaace3641712b427a4e94c62d599714b08d5b5e8f709e1b259ce5b1c4f91ec2791e274e77ff2db75be9f4cffdbc01c458e8d9de006a4058cf8f522e651d1a66cba5e7209c17440967792c71be82705ec8ddeb7137758c6fafa71bc2751127ae61be9d2230038f16b1d6926c9fab791481bdb823fb40f1ffd6d46484f292e84c9ec5716dfa2a84f2524e94db182e117e7b37e8583b2368b6b1f6b711e8cb384143050e0fbbdfb6ad14717da5b42742b63e3a13bb8c431d6ca34617209497476782228edbd71f8f505e119d61e138be995b8a505e199d61e13816f05108e5559c287b699463e57fb8b536572bdbd872e10c84eeea68ad6c8be33e99fb229cd7440927eb4a60369cd508e7b5b928d8653f9982bd1d42775d9406d258f7d1601b48bb1ae1dc10259ce5b1c4f90ec2793d27ceed2cce4fea421798756c903ff0370cbcad5222a7a94fd28059cef64e3918e6d8890b7631827d432e6ad1f29f4c2d3a17a1bb91135db077c4c7c572b8ad16c1bc294a30e3b815c44a04f3e6e88c0f31ce8cb3751f9f44286fe144196ed525e3fc23dbaacb9310da5b39d18eb0a00525da14bc46b1b76ad79b3dfb48717c93b713027c5b7406e4e2b8bbdb3608e5ed9c286168bf4e4304271ef6c19c9b78f7227ee0062070774469d08375dd1b5b91ae42383772bbeb663e9ca3e61fdb629a13fb237477462b27c6f17320fb219c77450967792c71d6209c7777a4cb1e7fb7e70584f21eeeb61a2435aaad74e0a1056ae13f8c08312e2b605bae3a0881bb373add46467f91addb782742795f74961530a2645b56702642793f27ca6291ba10ab5a750fab140be8d738e27e6aebdc3622bc0f4477808371ff0db6018e1310da07a3d3ff8ee316a2e310ca8738516e29e8d598152a3736a6e1cd91c334850beeeb08eec3519abf64ed19b1cd5f9e8e703e12259cac3d23369cb7209c8f46a9a3c9ba5881ad777428c2f91827cede82da41b851df12bf66280fc17b9c13de60915c7304c36e870b3c0c3c47b8a381b5a2260199b1cbc906740704f4094ea0fd33d495a9053b7e6df85908e4935101194767683502f954544032f67ed8403e8d403e1d15908c0e101bc8eb10c867a20292f1ab526c209f45209f8d0a48c621393690cf2090cf450524a333ce06f22504f2f9a88064fc2e241bc8e710c817a2029271a08d0de49b08e48b5101c9f8052936906f20902f75ec645adc37c97b18a17c393af3928c4e39dbbce42508e52b9c28611b16988cc0bb14cc163012d496728e0de13a2e847508e1abd199da65cc8d6c53bb672094af71a21c29b2b59b751c77d8380c617e3d3af390717cb3620442b9a9230b7fea26a38cb9926d93d1bb10ca373851b66f9351c6dcc9b6c9e8ed08e99bb95c2ad32c6f6d55407fca4b65ee4178dfe2c4dbfe5d3219732ddbb2c33684f5ed28cd978fe51ce5649b2f5f8f70be13259ce5b1c4f91ac2f92e274e588656a59cf93af57e79b2318a5f43d417417b2f173565e6b61dcc98251f72e7cc196b4ab62d48ef4058dfe7c4ea7ca762ad80f77ee2bb636b7784eb036e5ce697a6d870f5e4c2d505e1fa901317080049c9f726a60bf8c05183982d9c5d82e7aa1ab0450985ad6de3d76c0c46303fe28409bb5a4233b15cad118af306cb8508d9c79cc87aa996b64d3dde98e8b3c4b9bddd1ca1fb84135db845fc8c338b6c8bf84f43683f8dcee019234ab6fef31884f267b9e899f85fc91bc7f71cf741383f8b12cef258e25c8e70fe9c13e728b20e754676c6e96dc79a5545e03451ad29e33c492f73ba945223cf54f30ea9b1f99c6b11f45fe47a10f8a7f9d1994684f497dc6efc121531f4a96bf583f304fd35d3f8b9f14310cccf3b7230ad523359209a13a3936c383771e17c10e1fc22177e6a9bf441ebe4add4a8d00cfd40ce3efdc1f6a5dda108edaff88bbdff8f72c6d1533d18c1fc759460c67133fb4310cc2fa304338e1b91ed8f60fe264a3019e776d8601e8860fe364a30e3b84a733e82f9bb28c1645c19c706730182f9559460c671ddc66c04f3eb28c18ce30ab87908e6efa30493f1250136984b10cc6fa204338e7bc42c4330bfe584b9b5485d9ee5ec68e0acc5ac5080dbd42048a605318c7529db80c81508f21f72311de2ef5d0cc64e26dbbb18f721947fec4894a9831f8c28d95e24381fa1fc8e13e50e16947ec6ee9d11d026f4d734d1a22a09e6aff67ec185fc7984fc4fd19d7266ec96b24d399f82d0fe997b21043cec7e113567cb6ed87c807e08dd5f38d141e2af4e14e69cbcd1c696df3a23687f8dd244f2584ea79e6d227929c2f9b78e9c334a5fcf1e478ff36484f3ef51c2c93a18c286f34684f31f51c2c9fadd2a369cef239cff8c56ddc9e8fab0d59d07219cdf73e274b79fa006445251b28164db7e625704f25f510119c7fde0462390ff8e0ac838ee07370781fc4f5440c6713fb80a04f287a8808ce336669508e47f7331faeed71562ecf5b03942c72198ff8b124cc6a90c36982722983f4609661c5df4c3114cf82662646032fa956c30eb11ccbc28c18ce3d6f64d0866a728c164f42fd9601e8160768e124c46d7880d662b82d9254a30e3b885c49108667e9460324ef5b2c13c0ac1ec1a25988c4bb3d9601e83601670c284b9ab46751976e0a88ff5cbd69b2168859cd082edec1ac7d5ecaf2294451d8b12af26626c64d85613dd8b5076eb4894a9ab891851b2ad263a17a1ec1e1d948ca3426c282f47287b70a20cb74a887158836dd5463342db3317b9d4dfdae138be6d3112a1ecc5897298305f4bf59f4719478bd8f2e84404b67754c1c6b1f00f436037e3046b7e0f15160bb6a82df4da12efa47bb9528c70d95ca90b11dc3ed1a959e3f8824b1942d9971365f0b570719c64bb06e1dc3c4a38595fbf62c3f9aec259906f089f9e26dc19aea8d7ae789d2eae63c40c014bfc6b14d9e5f278b66a7cdac45299bf0e963fc1d2e010f9633b9fa7bea53a4dac11cdea2cc8ab56b21be455d04c1634f061fa4196e8a9b34489c71ae512eb9695252a1ef36c85c06f3495a85501cd82dee4c5bcdfd94bb44d1e352736272c21b72d2cc9eba1746824ae16eae7aad2ceb68ad4fd4a4bd4f2762f4d1d2d5a4572017ca53cbf4691284890489eebade4d5ab5d7ac18d00fb1c49ee3d9099f2f2fae8fc03dacc512d25685ba5c2cac49b62a5dbc8dbf226c85f8eab3226e1a48cd12f9134e823f77c6699907bbca5f5872c9267af35eab396ef3359e41455787e85a6d9aace66b234b37d7419eae1912aa550c5fca4ed1f00e9ae935d65d381aa7a582853de110e7be0b4e8ec0cfff2ff1ff1ba3f0056f70100 serializedProgramBytesString: - serializedSignature: a9c38b9f881b0415f46246b35fcdab43f03dcdd221958f1d91a75c366d85214715396c858b869e0e21cc1d8c38ef60706fbf64fd36c3c9b317c4fee637480704 + serializedSignature: 5c7f4eb358ca6d7a9657659e6d70b2fb713da7e0251808b5d83d2aa989452957554431ee56046e648f4784b03d46a7a81100f1070a10c676b6048e2abbad1300 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset b/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset index 0c562fd..b1398ae 100644 --- a/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset +++ b/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d897f1cb775c64a5c91b4ee9bba0fcb126549dc25a95bb2245ea2288912cd43b62cd9d24a3c448914699292a5b449ecc6b95c37e9e11caddbdaad7ba6e9edd64d4f276d9236b17b26ad73b649fc0fe42f68f1de60b86f3178bb33bb83e50c6bf2c7050733f301ef7b0f0f0f180c764e4ac89fc46ef97141748b165127fa44bf1813b7e57f2d321d95bfce919bdf2526643a243f33f2dc6eb1b9c09df0b32351233f3be4d1a4989277de11d7653a8ce77bc480fcbf43de3b208f207750fe0dc8ab1215f2a63ed12ace8b736275626501880b78d3a4ca4b805c892af9d92ceecbb3035829282485a756cb8f1e796612cf8dca4abbd75d124fa258a3f2dc7579cf84189198d710b1ea79899840993099afd26af9374ffe75abe3052aad52e7e0ff852a5da4d2c52a5da2d2a52a7d4061f590634897a9fc5e26bf4fcb7f48e55f50c7cb555aa9f21f53c773541dabd4ff54aeb95a9d1ed7cad84ee473f376a86b2f92635a7ead3aff843a5ea1d29d046b3bb9d63d07e9c3eade4b3eeabe92c84bf9dea5302e936369698977d5f12af99774e00a96b147d3fb1e91b5074877abf34f927c7abd5eb7943aff143986b44ee55f51c715cedfdc17d5f16a721da46b481daa54ba56e549d992cfabbc1a95a6c9f569956e5069832afb2a398674a34a1bd5f98c3a5ea7d2f5e43ca47bd575d708376e3ea4f5eafc75adde75e4bc9b0fd7f53bb2cc7d55bb8eb63997d77d242fa9d2fd0a67805ce3e6437a409d1f24c792f38a7e0dc7bdefa0ba7e881c43ba49abf70dedbee5e418ce0f2bb95ecf23c3bcd26448ded0708a9541bfff9076ff21956e16b9beca270715f744e136b846a547d4bd3745d6de213daae51f21f9903ea2cedf22c7906e51e961916bff6e79c799f24e68f9c7493ea4c744ae4f70f19a55fe8886d7a2e537937c489b18bc36953faae19dd4f2db483ea4ad1ade56c203a4ed1a5fed442e484f697c9dd2ce7768e71f2472407a5a3b7f5a3b7f463bdf41f2213dabd56f9b56ff4e4dbe4e2237a4e734fc73daf9f3daf9b3241fd22eadfc2e953eaaf26f93635abf1a91ebff4c369f93974c6084744ab6fe8c181729bc087a4abfa19c7b67e1200ea0e7618f28209a8362a764b8342e010c91541fc66953d2f3371823a9358905a4de2df89991570c23e898b7882f788a80ca8dc8df0112064ecafc768c2221101c9667eaa47286f1aeabb2fbb8247f73512ec862476428392083aa3bb228c0bb2aabedbdb290481032eaf7744b4c27a21d95392ea1e3f278046bd8839f77b1a60358fb0e993785f1f56de9429b657a0f4bf3ca3e21ff3795d9ab2833d7d11cd872f94ef8ecaaa9554a03b54f614cf89e4666422340fdbc31d50c2b52d046122f7834f11e878e934962e7e060d42365899cbc0691c218aedbc3607019bd129aeddbe17bbf0c7af3c9626606d4bd0e25c86af8e5cf35bc51ffe3254793b9a2358a148666eb0b88968f58c0ab4dacf220e4172199ac48434575fa1326fa71f8d35346fa9deb86f1bae00a98873d53ae02129ba63b5cf06c4332b485a988313c3daaaa673ed32b8fda251d1edda5a1a04aa4dfdbb916128153c01c9302aacaad80c21e279f02aaa6e5ca2a007ecc0c56330c16aa03c7e05c138338221bb2ca609fcc7342a3363c3b8cfd2978c50179d5942c69423561ee4a97bf4e9c02bb8375c8cf344ce6ecd19836b33c1f598649143bf5e4b45161d206ce41f596d19ee1dc18a264e4b5c12d1a02e15dba4b3113bd1089aef10857b80a1c8549138538acbe352306ed628ee13194e6cec58667d88ba665ce129ec2e9da541e130ea7668bd5080f7f2a9366352f4135dbaf0c6714f30c469106a3586a602e0dcc2dd3c4aad6c4028998c22a4d168813e5c3336681234816740ee15bdf72df6e75059ac19e0266505a5d3913a83269051bcec00c6b255c6dc01382b9ba2fc0e9d69dbe780f5a9bcdd040b40fc60bac42f5dba906a7f66a93da97943f447762db11917fbc675629447b9b7c4788354c8458a80e1c830f981844bf393a230da71bfb877e44b2192daef1edd6d622e3f579ec3abc3a735a9a6feae1c0e7ad13dee1c5ffca1f4f8f56cdf7680b4ce0e03bd71b9c4d7ab1d721c88f678f7b3bd1557c910b4d56079df20ccc6c1437ae83478dab356e4eb0ad76a3c83731117454b7c8c05e1ad8db64a81468c8a39a8dbc6a1673e09b0de02220f81293def149da64c4bccd49d4c3a894742a64cf030fe9361878e47dfe56b49e034579a052e4e0ec6fa9498bb826e26ec4b4086732f2cc6338ff34157a2ff2a0419789bcbadc86ba3c5c942e4b9786d3e83253a387d00056e47807fb7a8b5fc8b7f8e59c3bd96e70278980ee6485c9107111cd73560dd1efd3ca765c703620ce4b677e53388f99bc4361f77115a877106b01f9d7957af39795df3c7708c3cc01f4428936e1ff99ab7d2960cdd41c6c1e3bb1796c36d6cefdaf5962de906581aec6b069984a4832c39487b18468c9cf35cb9526fbc685531365b1ef1ed12ace48e2729d9233d0a853573549acfb2869bbe892f2b94eea1a3e1fbf85c74fa3e54daa2ec8b9cfc5ce6fc13049eb2f4cdf8d7add4ff45a8eda739a5b65727b10b0ef11de80fddd84c1ede509d85773e07506f037e70403af318143dc06f37bc671aa0e5ec383af318143380b2bf87c0e35600222c050632d5764bdb522d771143618297cf658100ad773e08d06f0cf7f79c78120e01b38f0bdc69abf793c08f8460e7c9f01fcedb7de7a2408f8261338ccd58247f03c0185c3ec6c94a79c4abe9ccd5c39074ce52cc0eb26a5cbc8a0db19906e63589608d15a9052b770d41d3437ca407ad9ca811f32839f0802fe20077ed8dc1602816fe3c08f18c14f04027fc8040e3131acc2d46362af36f3c4c4db4dc8e092611da7a7b7d381e7f3c03b4cc0106cc342c652c7eeb51cf8f110c0771ac053d815bd4fcc6424ef4cd000de204604eef220f7fa36598e13ff75636438204bbd8bd7971abb9f30d98231f28155a6b58963a270446b531a2e127ad8643610c134fb31f6ddbcc9ece2da674ba9ed7337e7565acd0e315008b487036f0b01bcce040ec10eac94b613eca44c2d17e3bc99596292fb8c31dce99e76038b290c30f32d2629ad46cbd42f339c3d250aad6529ad78ae59a73933ee08c18ceb39f0d321803770e06742006fe4c0cf8600be9703ef0c017c9f091cba777899a0d4ee7d3f077e3e04f0032670e808e03586923a828326df86a3bbcb567d5ba9735ff9bd18bcc551b0e3ddc9b372c8c437b0d25d22f061cebe7b42b0ef231c786f08e04739f0be10c01fe1c02f84007e8c037f2c04f0e31cf8e321809fe0c02f8600dec4813f11027833077e2904f0160efc7208e0ad1cf8932180b771e04f85007e9203bf1202783b077e3504f0531c782604f00e0efc5a08e0a739f0eb21809fe1c0fb43003fcb810f8400dec9810f86007e8e031f0a01fc3c077e2304f02e0e7c3804f04739f09b2180779bc0613617d6a47be684611ecd3c02eb9d0e1eafc85f982d9e92a91b52421e0de8e88abf2073c93d5c6d474cb57d85ad2dbf4ec1a93f3c26858053af7776cd53f0fca035a1ab5f82dfed5d6f71a5089420bae9e574336ad24d4bd1ba9954b67507ffeb94778dcb4f787cad6b2bf7550dfd2cbc1b362ccb0922631f27e36d938ca74b96312373c112b36ff566b05c47eac932487c819378cc2471ba68895bf0ffccb4a5f25205a9fd635cedc74db56f656b9f3b0fd52453d0c4fd00de826b7b1c7210291fe7a47cda24659f7027db9d8500cdf214d89b93d78ee58fcb5e1106fb934ac2665cd53995478e5c9d06f73461d8ea458e8709130ffcaa68937dba3dda28b6bc51e16ca530a6264e78cd07a9ff135cfd274df5879198b94ca7c663e8117be4c5d7c4146a35bb534031fd5a18125ee2249c3249f89a66a98d86c530fe96c2388ce42e88f16fcb1c234ed9eec4157da0647a58e5e751d59569d45225ce9535888e2e733aba63d2d1add074945b634763bd12e33ef67e53121d7a874c11bed4af4d17dfcf3cc97176d7c4d949ade5d2683878dba577e73b134e04fe1427e93326498f15d9a3b62b6f5b6a7f1a44b22b9c64f7381dfaa901d5678718c5fd4186d5e63b7ea5f0735d1049af7292de3749dae1d35a3bf1a9db14f68f8e8c9988d86c8693f77d26798fb39aed44896e489feec8dd25657b668665bbc6c9f61326d93a7dcb7616fdb7774ce5573adb725fe7e4fe4993dc2d3e6db8157b62d831290a76dbcfc9f87e938c177d7824af6e0bdde1e78a7c3c84e9b706383e3e60e2e3214de77a1fe346f467315e1942eb0f27ca1de4eaf941533d9b7cc5f167312e9a9411d10de3d83e78045f7cb433c4c9f7ac49be064d3efa2a4231fd3e871544821b9c04cf992418988e71c38cf5eb94342071ee2ecf5034c4ce19299dd99f64f724e2f90863443dccf1f4535ccf59d8929b641dfad127ccec58f42627db874cb26df7ed5d5dbfe29d0f2ab61fb8c5d5f4f952faba427a286f5f37c2c9f8e170b431145a4d47b99a7e249c9a5e0bada6b7b99a7ed454d346dfb1618f1ca74f183c4c697651297f13095821de86ed1946fe5de8b3e06852a4f0ed91f4b42f2efcf21b943f2af9049e7ba7bd69e1e5c01f13fcf6ab83425f3c55ec4e9ca52e78a6d2f95fb0eddd75b45249e46249a6f1559ad926e9c741ab739556e7a4f08d9e5d455a53e15abc404b2bb8852fedd14d757700ce09e765ce84b3373ddc9ec18658109fc60526fc3d08e06e4f19c28ec360544e0733a10257f8a94cce4903ef3f6d939c4a24077662ed57cf93e240cf3b849e176dd2b30ee90113a513b2e392307d42d65d053a821d533c687c290134562635707dc635acfd930b71cf7bddc5d8cfddc3d7b02710af5ff7c2f85a60d46afe33d4366b3d9ea8d6d0fc6a4bb0b96c5060eeccd310147ce2ff797f9d86fefa934042b7dbbda11ff9599b7e6435eaf48a0acf6ecb8bf2058332f0d46b50ca66c9d5399ea4c68f78c5789373c429ff5c94c8ac8f2199e709993f1f25321b6248661721f317a24466630cc97c9490f9924d32570522338e1e730fa1f25336a95c84453bb29f54cf1b6f89ec9a036bd42db4455d05a1eed3e5b0c2eb2af499ca3bbd6cd10a2b6d51b98950f99999a532ee0d7a1da1f2b3d1e968ea6349660b21f317a344661ce3c93642e62f4589cc38c6932709992f4789cc38c693ed84cc5f8e12997b6348e62942e6af4489cc7d3124b38390f9ab5122737f0cc93c4dc87c254a641e882199670899af4689cc833124f32c21f3d7a244e6a11892d949c8fc759b642e5564a6d580d2591cd28479e3f87c052eb446e02a5b04ae2104be6693c060d36b716cd8270895bf518e863dc49249ab7fc5e600b2da1699ab0999bf1925322d4e6d5823731521f3b7ca412637e5a6bf026d914c6b53c1cb0899bf6d9bcc5eec5a9cd587d9f576dcb7ab5a2373892d32e711327fa71cdd8fbfc9e03806e9db0895bf6b93caf5869edcdf9b72169bfb295bb4a608ad9fb349eb32adb9cf9e469e2414fe5e391ab9bf18338e8dfc38a1f2f336a95ca8a88482079148171b5e53b1465cd216718210f7fb33d9d1c43f9a9c4fa8fc83725039222f1a512f5fccae07b8ad84ca3fb449653552e94ade8515b81b43c2aa09617f544edbd35fe68bbfed35112affd82695cea263d8b0f89e3c1cb119c2acb045562521eb4fca61777e97f4c5cfee1a09957f6a93cab55a13ee9fde0771b635e5dd84d2d76d52ea0efdd2f8e9a4d9411e6cd030a87d479d1b437ade838a01ad3584d63fb349eb4643a3cf7da79ddfa6ddeaf4ee4e5bd41e22d4fe79392cb6f06445afc8dd58cca223986f8bd6ed84d637cae15be928a7f05e241629b5f6806c01a1f42fcad1f3fb9ba18c63cfbf8150f9059b54aef1f4fc4ec734dbfafd3421f42fcb619b7e9712c48fca0642e55f45a799c791caf584cabfb649e572913b63ce6f601bbf9e7c2e21f16fa2d3b4e3b846a89950f9b736a9ac3534edd23696b7d8296db545f71242f7dfd9a47bafc1726dec766b550dbb6da9e161a286376daa618b410dce881f2cfab6388d4f2ec767dd63903984e02f46276288e36b045b08955fb249e562a412a6529e412a33c2ddcfa25ff9616be4adb545de0384bcbfb749de4a913baa1ad6ecb04c0d7aa32d22f71122ffc1b6c72c66bf95dc6e297e5dd24a42f0976d12fc80709e38394f39b33350f19b7daa22947da51c9d8cbf61401c3b992384caafdaa47297a1bf0ee31ba22cfad46db6485f4a48ff47fb3dbb69bdd26d758935f2aced949020e4fd934df2cc2fb7348bb8bfdcb29610f8359b04baa111e73dcbf43686b5d0a89610f9f5a81019c718730721f2ada81069f159923522f71322dfb64964b0c0288e3b22ec2554fe7339a8e42732e8de4616fda4b51e7b33a1f25f6696cab85be54642e5bfdaa4d25d7ce34e6b4c0ad8e4734c4ce1d72c7abfc621fe8f8deb09b5ff161d2b8de336130f122affbd1c54ba569affab7de26895c70895ff119d1e3d8e56f908a1f21b36a96c345069e38b372dda73932d25ec244af86674bc6c1c7746da4aa8fc4f9b54ae2c4065dcc7f18b0891ff151522e3388e5f48887c272a445a0cf3ad11b99c10f9ada81019c70991c584c86fdb24b2d0b652b3618f8f870899df891299163b1d6b64ee22647e374a645a6ce6d6c83c40c8fc9e4d32838d92e218551e25547edf2695fa0c53f611db6c7d69a68e50fbdfe5a0961f80e67b73ce22b5d6de9c3b48a8fd1f9bd46e50d43af3a093b39ed81584d81fd824567f2f7902b39d2e69764de91d16b3e60bdfd2f0b5153f04b3a85066511be0fd93da44a1af44a9f5bdff536d111bc339dfd4b654f10e2b0e3bf14e586294c134fbad6da9cdf2b2043c5f0df2e59bf93181f5fc683f026a13e61637129abd84f1357126490bcbc7dbde823c5a49c152d1592dffbba077a57634d3d5f885827d22fb1585e7e5c54ea3829fe4ff0145910e59a8d70000 serializedProgramBytesString: - serializedSignature: 2ed463ee70b7450e02e01a4482777ac27611448c7486654cd786a9eb2e0e63a1d92317d052869e82b8fec30ab8c8f2359af2101f9613510bf598bf2b9b02ad0b + serializedSignature: 9bf18fe7d7453401f8c1f3c865a2621cf9c07a6e9f4e3c62bfa32a147f7b48a83e0e051dc001464ad886473f00ffe4be6a8d20778a6e472b6c992cc6fa08ff0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset b/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset index 5cd30e7..3686961 100644 --- a/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset +++ b/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aecbd07941545f33edc73c312054410148405c969113080a86441499211949c94244b3422a88011c36b445c141504140594a492c18459415051413163c6fc4dcf74dd5b53db3577667b90df77ce5f0f0c9d9e7abababa3a4c4fdf588eb0ffb3ead97ff512dd446bd140f41443c53831d6fe576bfb39c6fedf0d417c5731c17e8eb0ff1e64a7d513d9194acaff6a5ae5edbf3bd8a15c31d12e39490cb19fa39cf4ee6298fdef0e76d9617648c60eb7ff0cb3735909bb504fd14674119d4539ab6c06885e4ea15c1567c97a5985edbf5b896976ea3087941492e32495b3ffea6ea7e43a69636cd290af9fb8c8a9d6183b6d885d6682186d630e76100bf7f95138ff10eee35af59ca19ed3ed3f45d4bfe3eadf85d5bf717e192f6bd7df27ef4c941730afb3ff24ed3f8755f87a375cfc6715bec10d5b6508465184314b3d67abe71cf5bcd1fe9365177f28007fbfb49bd4f316f5bc59e5b5797d3c5ac595729fb17395cc3c14b6f5628d74f3c7fe52f96f55cfdbd5f336549f3bd4736e5ace3ed0eb9dea79b7c21fa4e42d4061f91cace21f4661f91ca2e21f416189f7bfb4acefb7a8b8bb50dd8a086f3dcf27f53cdfad670ccade43f20f55f917a2b07c0e53f18faafcf7a278f91caed21f43615d1b60dddea79ef76b740bf6a3d3ed0425eb71157e403d47aaf845282c9ff3d4f34195be98a4cfc9903e03e5d3a5cfcf90fe5086f4bc0ce90b503e5dfac319d21fc990be90a93fe875948a7f4285950dc4daa3f61ae5d5b59326cb2c21e9a0eb13f4e9b10e08f34415775e3acef937e600f6bd14856dfb4e3647722846076fbb3a693a2e1d11970a2aae13c2e944b874265c3a2b2e3b08178cd1d16b434e9a8e4b17c4a5a28aeb8a70ba122e17102e17b85cb27a102e18a38bf0d8ab93a6e3d20d713949c5754738dd09971e844b0fc5651fe18231ba219b85341d979e884b2515d70be1f4225c7a132ebd5d2e85a6123bcd43e565fe65481eea93a974caab0fe25559c5f545bcfa125e17125e17babc0a976278f525bcfa088f2f48a5535efd10af6c15d71ff1ea4f785d44785da4782d6278f527bcfa098f0f4aa52f21722e16f97dc9429486cb805fba44c53f49b00620ac4b84d72f0d2058900e7ea906930e63404d261dc6805a4c3a8c01b59974a53f51874957f626ea32e93006d463d2610ca8cfa4c318d080a4cbf1dc1e7bc7830f7bdc0db78639c72237dcfd55155eec867bb757e127dc70ae50e156aefd141ba8c2d728794fa9f619a1c2cb5158e69ba9e29f266d3d12b5b5e21c1b85e2ae51cfd6283fe441f831b0a56754fed22a7ea08a5f81c292bfea0f62a937bf582652f3954ff6aab832aacc1b2a7cac7a96403cfde6b560dfe00b9e4acb68714680f2cbddbcc5be41ba94cf6201e51755cfa733e4f7c328a69ecf18601477f5784c799fbc33515e90b3c2adbf934f86a7abb6bc349dc7f9b7e5e2e339642a3ea9e25792f82c26be10135fd81b9ff24ba31197d1de32b131aacc2a14b679962c4330c6aa7ccf22ce180fd2979072e354fc73a84eb8dc38a6dc7852ae1029379e29771929579894bbcc5b0ee2c1473b6199bedaade331d0cf56bae1922d02d8925f9ad25f2c5778fb7eae7ac2fa630d0acbf658a8e4bfa37054fd621309cec40c38877d38ae11de75f72aa2db49c45626b998a55ab8e54ac13c27a1d227abfc6bbd784e3cc65be7c53b16fc3fac6f6f15def5e15ac20bd29790f439482e4e8736b85f78d7a36aad18fb1f236f0649a7f2609c7e8ea4aff3e68b3da0d2d793f0f33e6d730ca9f31455e60514b675571ac6014e77eb33e80ed2a3d21de071ba83744e77cf7bf315487750d77922edb713c4262f57382fa2bc102f9fb385d7f667bb1865c0e693046faaf0ce55a712dc0749fa83ea391f71045d3f948e8bcd4771f2799bc2d980c292573de1f1b7295e5712b957125e600f1b5118fb1b90b789c88335a246ff809df2b1f384c7c796deafd25f08a74bb121bfaec44614b7593d37a13818b7a6a1386c036aeed36ca04a037bb802b5c134621b57109b85fdaf80baf7d403c62d5c8fad9a7ac0387a95a61e57fbd4e31a548fab507e48c3f5d8a69e8508fe74528fe99a7a6c0f580f18d7afd5d463864f3d66a27a5c8bf2431aae07ac2f0a13fceb483dae33a807cc33aed7d4e3069f7acc42f5b81ee587345c8fd5c2eb8b56a0b0dd07cb1d26f960cf6f2d0ae37e0838ebbc38e53730ed0e7be9cb98f49b883ed59e79ec66c2e366c2e31695bed9cb3fdf18b511f18072387d8bb77cca57ad4061bb7e2764937c7309bfb92a7d06c15947700e3276753bd1134dbf83e849edf5c7ee243c609f1ff47417a3274887b17523e201e5703ae8898e81770bef187837c1bf47a4fdb6ae3ca4c31eef4b4cbe7b899c7b899cfb483d611efab248f715d8df7f45a4fad68930572fe8dcfc3585bd80d8cd02f5cc13de39759e5bb70a2d5cf915c62b9c9d2afd6182f370069cbb7c38be2ebc7373d813813ef288f0ce4f1e51987bdd7215613d0773f3855e5b03bcd84282b7ce8b775243951fe6976b8577bef706e105e94b48fa1c2417a7431bac13def925f058cfc89b41d2a93c985fee24e96f7af3c59e17def92584c3cccd1f15deb9f9a3aeee2ac15a93d3dd5b197407e951e90ef038dd413aa7bbb7bdf90aa43b58cf823dbf27d2e3a7aa8f781fc5a9be25768954bf3f1bfccbbb4aee63e9fccebf651accaf1f579cb6a2b05dbe32ec7fe938ee564f9897425f5924bc7e1cf6adf768e4ef457500bff6218a8379e9621407729e48d7f5cc3c95f6814a5b82642d46f9210db7d747ea9945f097927ac0be63a67ac03c08d703e6a5cb44fe7a3ce9538fa790ac65283fa4e17a7cac9e8508fe72528fe506f5807929de970439b0cfa8abc70a24eb69941fd2703df6a9676182bf92d403f6f30a520f9897aed2d4e3599f7a3c8764ad42f9210dd7234170570beff84ee7296b84777ca7e5211de6119f78d3c5a71a3d7c96ae4b55584f16741e007ce03dc00b8acf5214b6f39cdcc6070b38802f7f5178c7e71715c6952ee793577a65c73608eff8bc1fc563bc755ebc6ae083608cd92abc3eff008ac7b85b54be6d240cbebb848adfa8e2f35058cabdcb9b4f7ca19e9fabfcdb49fa412287a67fa9e261ed1664dc056e5bbddcaa437b7e45dae6ebb4cdd450ef316adc45b0c1663711ec4d0a7ba0caf70dc1fe368d9d7306830de3ee6682bd5961c3ded87704fbfb34769d9f0936d7ee87bcb2d9f67f2943fb6f23edbfcde55ae368b43ff457d2564e58b74ef95ac9dc2e3cfe29653f3b44daafec4079e5f325e1edbf2fb9b875404692c87845787df82b04f755920ebe0faf715e56cfd788ce5f7365d754fb67b560ee026dff3a69fb1f503ce6f896f0f679083faf6c0bd6c1d0f63b098f9d4a07f09ef047af3e53edb024033f283787a42f21e9f09efc6b6f3ae83455fe0dd2fe507e3e49a7f8b0a7ba9de0433bbc29bcf3ea3789de687df2483ac883f917b4c3dbc416de26b6f28ef0aceb53f80b483ae0ffe4cd177b5778e6e5a1fbe8bb4c3aeda3b45eef917abd47eaf5beb75e293dbfefc5cdd7be3b50fbda765a13fa37e707609e11850ff95e71d825f43e64b748f7dfdd28af7c7e20bc3ee40317b7019c594c12197b89fef612dc0f49fa87ea89e7897bd4f323e1edbb1fb9b2ebfee5caad0767b7a08fee137a1fb28f70fc4c787d0884950f6900eb3bf0211f131e1f2b1dc05e38ec6f64f221941f949b43d2979074f021df7bd341a7a9f29f90f687f2f3493ac5071fb28be0433b7c2abc3ee453a2375a9f3c924e7d08b4c37e620b30ae83ad1c105e1f02f80b483af5212a5f0c7c44417d0897cef910a8d717a45e5f907a1df4d62ba5e7835edc7cedbb1bb5af6da775e14cd17fe143be551ca0eed4877c25d2fdf72b94573e61ec5b85c2366ee316c2eb4340c6b7447fdf12dcef48ba9a6bc6be411cd4dc36067d260f856dd90d5bb8721bc23e2ef4d11f84de87fc4038fe2cbc3e04c2ca8734863339e0430e111e875c1e8d36a87cbf78f5c9fa10ca0fcacd21e94b483af8906fbde9a0d354f91f49fb43f9f9249de2830ff992e0433bfc24bc3ee427a2375a9f3c924e7d08b4c32fc4167e21b6f2abf0fa10c05f40d2a90f019cdf84990ff98d49e77c08d4eb30a9d76152afdfbdf54ae9f9772f6ebef6fd0ab5af5ce7c17b2d131f42f71efe10debd873fdc3c8d37f860fd2abcfee44fe1f5197f2a8cc32eef260dbdb29d6f2864feb55e3cf8b62285b7ce8bd704ce7942fffa9bd8e301148f71ff11defe0fe1207bee9caf85baff2bf29ff950722514f6bf4e5e88974fcbabb7b8c268564d787d2de0c5bd76168f13dc0449577ce231c4b110c1cc2265b208269c1d843e0976f3771a339e4471320ce7075f46619bcb69d9defcf0ee9bcddf15f1c7e5683f85fe087582738acb5018d529d5fe1bbdf8f07d58bc08b1cfdf85c7cfc58b7a6d215e149593cf625efb75c2767d4e1fedcd077e3e5e5ce57f0585e5136c6e25e1770ce1f9aa37dec957c45b06eae0d415fb50a8db1c14c6764ecb270dcb17362b9f6abb8296ff375cf994bc1d19f26fce206f5901cbff63569ef685d0e59386e563def2d00753631ce8478d714dd45ad6688c53be395e52a4fbc10615574ae1ac4061bb6f9e5991e42b293c3ec009233ef163899d6d42f1f25942a5bf46704b10fc57dd7a9fd9dc8b93924370a0bcd848707692f41751ddc39e5587730ea0c7d2c23b4e95563adbe5726f0efb836a6d143fceab3bc073e231de3a2f5ef3f65e1ce75d915f1d405e59d2a6655dbcb3f248be72a44dcb115d1f4f6cec43142f9f65489b02cf79281d8505ecafbc2ebc7a00bcf244afe515ef7bbdf953fce0bbc3d55e9c14ee8984ff1e540ef3a3f9d5d98fb33678ebeda917b641c0c9d43e7e36a6de97c72b200c905751e49f53a9bdbdf849c233a78a5744f1f25989e8b4928b710ef8ef24c1cb16deb94236c1ad42d2aba86755c4f17d1577723ace498738f9acac7036a0b0e4a5ced3a7e630c0ab1a915b8df0aa2ebc7398eaaafc2e226f139197477040ffc9b48e202d65771585c7479f5d0f9595f9de35b0833f549b04f916e84f9257f99d780da4f71aea09dfbae5a1b05dff96d037d55a235e3b7f59f10fb24734cf4ca5ff8bca6ad26516e7afbf9974d5de30a7b0607e5bc787cb2319b8d4f1e762c5837181f9bd40df17a5fc19face473c85da80c4c5e13bc23c14b675df5a7de769c1baa476feb256169289e7f8905e48affb543a9c75f89b4957f2ac24930e737b689b62f9db261fd7473270ade3cf95b64d3eaec50372957324bb5eb7ab7e619570c3b7823dfaf5ad768a2b7ca39987c2b2edb6b858ad77f1585649374ffbec10f2ea1179f55c796d9ab8586ddafb60a973adf1faa86d3aa8b806e938e7df1253c910e49bac387c37ba95e48773ac333572d4b7fcf11c2427c72dd7b630913303a5633990bf1e2fc7f9b79de75cc05467eae30d89de1a2a2c754f453bd873013d3752f9df4061c093f16f12fc5354bc3a7b679522e98d55fadb24be898a57ef65ac63517e4897cf5385674fc6094b1cddbd27e7134e79282c75230887d3503ba9b25669942631de25d8a7e7d7793b380f0476d238cdaddd3e91f653380db0a4cce3845757efb965db27085fa62dcf9d8af2c97435cf48f968f46d06dc5de3dcf753403d02aff8192a7d170a1750afa083943f57f39b40bea129e1d954f1ecaaf438d4070b7c4333c4b9ad8a3b93e09ee9e27610de7c16ccd3cf51f977a3b07c9eade23f40616c13cd44babfdb7c3bc0bc05ead75c78fa4a5cad01ad729af232bebc8bd306ec07daf32c529fb3dcfa9c3f95c86ba169bf13501a6e3f28d35278fab91396cf562a7e0fc9df9ad4a9b57ab6f1e677ca43bce451c1fb8cb755f9f712be27927458ab9cabe2dba9f88f483cdc99f4318987bb5ef691f80edef8783b8403e5209f7c9ec7f0ad48d23ff4a6c7d13d2d4e7bcb7683737fe077ce17a9be7c3edc95318fa401969479124a0bd8e72c75cf87a5ee2189c35d2e9fa0b07c764ecbb3d41ac7ca461c3aabb82a69ce0fa8ef16ac93ddf0431d03f0a9e6e6bd5ebd2bb1aabbe1d9b532974ddd9ba0fc64bc8baacba7286cebb9e34a945fa67fe62d27d0b76cbef2d41aceaa9121bf1f86fa66d9aa6980314561d432c0503ec3aa6d80a1be5f8cc31d3cfb515862d731c056df445a750d30c0e7d42b3886551f6105b0112b4785612e08771c6d4561db26bb40df50f34bab813f7e0a177c453782db4de1c2bbb30ec17061fccc98cfafce3007853a7727dcbabbdcbaaa39a1750aaabbf21d5da7122ca8670f82a5ee654ae507ac0e69fe5623e11d3ffdb8c37c14fc6c4fe1dd57eaa9e4a9ef9f2e803db1a62a1dee565aebc58bf72278ebbc781740fb83fed1bc52dbfe4d885ee08ea8ad282c71e15b85165e3e16cc4d0f049001edd887c8e8e3cae8063a68195e46d0fafab6d9e9a4cde01ea955282c79ce75dbac1bec79409bc13d566bbd784e3cc65b47f0bee1b959a791f6e94774d7cfc5e80efbff2dbcb22d988b7f4ef0a02dfa13bcfe0a0fce0ab4cc80d794a4c37cd9d6cf942067a3d59a559443ed56457181bbaf56a0b07cc2bd5c6b50d8e6dca3962bb7c7408203f75ead4561dcce80b795e0c13efa1d1a8eba3a81bc81441ef019a4e29f20f20769ea3e98600c42f1f23984d8e6109773ef7a0407ca0d15defd60b5f6890f43b261be333c1de7a4439c7cc21d551b50d896db13f63aaa7ae57aee55b4dba677429f2f3e5278f6e5f3f1bf84f0577777c547a9f82f100ed6eda5444f97ba7c7bf570f9f4ba19e1c827dcafb3d68b171f4df0d611bc90f54fc903fc31defa89415e9c54fa12823f078565bada63ef11e45b63e87be8bd8350f38138dc7bb40285a57dad27f9e09ea3b5288cf50f382fa0b07c8e4532d5581b9f4064aa3b81fa3424f97289cc5c2273029139413d2f4332c1674f2232d51d3f7d16927ce4aea0f8642273129139493d27229930864f2532a7ba32fb9627f9a61199d388cca944a69abbc4a7a4653a7a964fb8db630d0a4b9960d797f9e4934f74bf88f36f597611aa23c4e3b257a8e7e5a8ece5aaec7ec415e2715995ef427897043e18dbaaceb6d5f816477b5bcebf25561fc2f72a2253e5eb0f363c07d980cc7790c4c3fecab3241ef687be24f1b05f43cee909d87ff99ac49f4de29b7adb5f9c2e3c3ec1e183d3cf20e9301f817b3bf2105f193f07e96c96ab8b7eaf92b2b0d67d9bc45f2bbcfb36d7a078f99cadd2e55cc7f64ffdf692f86f11076ce3900edf9835f7a63bfb3d32fd7ba44bac03b8cbe273a453bf74d843c7fd16f2e23b71a12d609f632dca03f1f209f7e2c2390f586f7521e53aa378f9ec4acac17ae40252ae93b75caa7d56a3309493e1ab49baba5b47c07ae83912df9389efc5c4f766e2fb30f17d99f80b49fc58d71e07c2fe0dd8c78d22ffd805b6b816e5c1b608f6bf0a8531760e2947ee8d89ab7b63e2378bfc73a75bd271f19b519c7cc23d301b50d8967bf13ee1f4898142613524f26f23f26f534fb817260f856dbc01b3ddb075a6d7b6527833880da8b580d51c715732acb3446a3e2fdd23e6699dcde0cf145a9b4fa593fb67e2aacf592d907c75378cd5322dfff22bbd38a9b9cf8d489e9def62358e3a639aad8fa1f06da9ce66604e51409b49619f42ca913b74e2f03e21229b1954c6adeb5058633521f243dacc2035afb3d4bebae84af00c6d26c593eae92ec2537da71b87bb86e0ec7d23c6c65e44616c137097107c47dc989427770939f9e5f35e549f7b5ddd0c5e8e38c9e775c456ee46f1500edb8a5a47c6ef41d8f7b8d8438a136cc0e27c0edc61944770603c6ccdb4dff5a4fda83cda27af17c1fb246a5f478f92cf4ad2eed0f7ee4378c0e106a2cffb50bc7cc25d8eab503891c6b6e07d07ad33dcbd48eb0cf8f04e7119ca4feb0c7ad5f821eb1cc5238fe800ee7e9a83c2c83f0dd9e1e5c9f9b1816a2ee1cc456c3923c8dcc7e3c7609d52403f96c26e4aca917b20e370ee2e223f364ced7f8e80bdbf66447e483f365cf5414bbd8385f958547e0c785aed187c3af6517dce27f551df5aa5fafb2184436df126de1633d9d230d02fac2da7133b99aed2617f711189efcfc45fc4c45fccc40f60e2079278755fec28b8b75367f3509702da7c0afb5452ee21d2460f456bf323df70db64949a6f5ae7323cf2080f156fb54732f3541cbca7b071af591acc2646c299206edeacf427602ff249927f06c90fdf1dc2dee422927f26c90f63f650263f1d6755df16c398fcd793fc6a0c13c399fc74dc51e38d803d4e58a7fbad351e107adb7bc0dff6c62f2538ffd15ae3d28e6edb8f075dd2b93bdc0908feab078a97cf052a7d23e1f208e2b200c559c8576f4261c9459dff1f5d8a945ba8f2ff80c2b81d006fab176f742d52b74ceb8edb89dc47553adc5f3198948774b59f629dc7c821f38a7c3a7e8ce8b8278a974fb8036e23c293f2f0590ff5fb4f562764174354da2291f205ef2d4471d887c0d98ec52adc99a9cbe20c757982d4a5178a97cf25a42e8b357559a2a90bbc9f58aaa9cbd20c75e9c2d4655986ba3c49ead21bc5cbe753a42ecb3475794a53177887b25c5397e519ead295a9cbd319eaf20ca94b1f142f9f2b485d9ed6d46585a62ec355da4a4d5d5666a8cb054c5d5665a8cbb3a42e7d51bc7c3e47eaa27cad857e5329aef691ac1ea82eeaf74fe2abd375797f118ac375817311df7be3b9b1f512f0417eef5f600f117c28dc2bb714856dbf26b73124e665d92aff3901cbb5e13958f05b4eb01ff89397531ceee85ceb95195fef8d8faf43f1f2097782927b52e2cfa3b6781ee5954fb8bf6e150adbfc27ec279ca0dc06afbd3861f9843be7f25058e2c099b773080ee43f40f2af67e46e2472c1def03ddb57a33899f717b7eda02e8095b21bb88354d9cd651b02d84d0bd2fe9b49fb6f76eb91abee75cb9ded2d17df42da16eab995b4ed16148fe5acf2ca99f80dc1d94e70b623f9321ede67806dbc84f407183b08c64b285e3eb7112edb182e50ee65d276f0ad38dc839687c212670b8343ee458bc3b7d370071adc6dd0829483f4cfbdf1293b78c96b07b9f0feb625696ba8f752e1a9f72475de71d2446f39da16ac7eb78b40fa9dbc8be0ec24383b91fca06dfdbad0b7f5eba48d56a1b08e4ba6b626f7d4c5d53d75939733385c5bc3fd6cd0d62d4939480fd8d693601fab971b9e12e07c594a9f6f6af409f7b9ad4579205e3ee13eb755286ccb9ca26ccaeaed2da73bd30369a93ac1dd73aa4e53ca07a84353842f31e09eb865282c9f70bf5b1e0adb7ca7aaf3ec53ebf9c8a2dfeac0dd6d5b515862c178dd8270823be20e2859b01669e9934f5737b86f6b190ae372bf31e53e20e5e05b01b81fea100acbe71ea2ab3d6efda6e17798181fbe3186b9d585285e3ee10eb78d282cf36d27f25ef6cabb7c2023ef23469e3a6f1fffd82b2f95fe49dace1d9d4919d0eed0b6fbd2767ab96ac7543fd987caef46b2204dca0c72ce1dfafa6744cfeaec771cee4f5b83c292eb1697d715c509ce7e95ff300acbe701827fc01fff0a98ebc139c873d2f5d5ceff40fee7443ef82cb8d7ec511496e5601d715078d7f407158fa5aa9efb493998b37f49ca7de996bbb2a1b79ca5dadd52ed68c16f77da7966c2dc12f64833d435c5a1bf0a7f45387ca538289bb72e22b22f4ecbbeee5008d9c93466a07691f9573269d806d5198738dcb59687c2763dae52babcca6ffeaf302c751632fe8dc2da8dc2f2f92de2abf682ace6284d96d9423007aaf4ef08a63ac311ff1e61f62498df33988354fa218209feef0784d98b60fec060c2fece8f0453edffc47f4298bd09e64f0c26ecc1fc4c3095cdc67f41987d08e62f0c26ec85fc4a30e1bea2df10665f82f91b83097b12870926f881df11e68504f3772fa6afad765065e09eb03c14b66df51af5fee79a433c9635dc8b95b259b8e76b370acbe75f88bbfa0d5e6b443ace52df5e39bf775f04959171a344dacf80afbe84c807fbfe9bc887fbabfe41f2fb0794ff8f8ffc4b897ce80bff12f9ea5b7e397d4cc9bf28987ca70c277f3491affa4dc2f2ca77c2f289ef0bbb38a0fc988ffc3144beea63893891afec259140f20704949ff0913f96c857fd319124f293ea9985e40f0c283f8b97efdbbf46a9f27007daef286cd769a6cff7ef50d6526772138515c61f282c31a62b3e792aff78527e942af718e1544478f696ac11a8de387d71e67aa6c61ee8cf70970df8a09e24fd3292de8ba44f20e9bd497a2e49ef43d22792f4be247d1249bfd09b2eb68bc03e345577e84b5cdd2f66b07b91f29385beee903e45e8eb0ee95cdd219dab3ba41f2782d7bd9c6b8337245c1bbcc16f5da9e6fa89a222ddffaaa838b8536f2dca03f1f2097764ac42615be66ce883554939b84fec4514c61c4a10bc12aa1eeabeae5915093fc085fbb896a1b07c927bc712a5889c355e39b3d4fd17b3f633724a1339ea3bfc04dc4b06e7ae069172c79172c77aeb9f4a5fc2c82d43ca972172fff4e687b55d02df9928edc06fcd0fb673b26ac3166e99d93d7cca40bb9545b6a3de5324e05eafb5280fc4cb27dc0bb60a856db9b7ec2738500eeeed22ef3b52e970af1679079b50dfae27a0ff6f4478f27912e2aed66d894ae9b8c449284e3ee15ea60d286cf39e33ded5d79c8504ab32c23a01c561ac4d282c9fe87e2ee7df125f9d7fb8b130c1ca56183fa0306e1b38ebbdd58b7763b68b770becdbc3fc04f45985d85c792217d2d5dd0516dc7b40dba52a69979e285e3e4ff6b60bbc8f4d95af26bc3e43f1b0a6211d9dace2d037134e391907df60d8757d17ce215dc970ad4eb8f642f1f25983701d4acad70cc0b586866b4d1fae57315c6b11aebd51bc7cd6265c8791f2750270adade15ac787ebd50cd7ba846b1f142f9ff508d7e1a47cfd005ceb69b8d6f7e17a0dc3b501e1da17c5cb670ee13a8294877b65fe225ca7235ecab759d7a238757edd42bf8ffbee5e2f76caaf97151ebf3e1bbedff39bf3c2de0b9c51bd2e2de713f86e15c64772574d42dd5573abfafeef56159ffabe685cba1ed60d5eaed6acb49cfba6fbf084fbb3d47bb704dc9db41b85e513be6bfe0085b1bf83bb90d6a1b0cd7deecf24bf3a4398803b91fe466194df9ae32d97803b77fe71f927e0db609d2ec8fbee7cba482239eacc127c63ec97572b8bb4a1a5ce3425e07ba7dd282c9f6720db3b43d519d63dd0ee4dd31ce6f6277a6e8aca370dc079667ece29aeeaf7c813cd0857f8366b3caae76ddef6f395e9d71fd4ef2059703edbaf3f90bb8b12eaeea2dbdff1e64be547e7622df8a66187378fa5ce5527e07bb5dd282c9f67a5311267f9f3b87336c3e39c103c5a121e2dd5b305e2d14295b9cb8b958a57df03245a132c75be3ed10a61c13713f8ce43cabf4d08feed88cc76ead916c954e79badbb097f88bf4785db132cd52f12709fd107282cb9a03b1aad7b5d1b82f791d67d6e18eebfb0ee77c341eee3116a0f27d101e908e6cfe7a5e39c7fdbf8b259527d8ccba3e64529ff87b0136aaf06ee894dc059a4ad282c3160fe047eed01c44f539f142ef8d28e04b7a3c27da780b8ca67263a11dc4e2eeeffea79f305c6cd53e1ce04b7b3c285f79ff343e282eebb105c7547d2dde0bf60cf08da03be6ffc1785657e38a7fe48001eb6edddfd2ac1073e17107c753fcedd703e624101f1d559f0443782afeec949e57f38981ea15d02eb1bc62c72174e42dd85735f7f97f77d30c6a96fb5ef69a3e2e12e16584bf64472619dd72b1d97e889e2e4537d272ab72b5361890f6b2ff51db995e7cd9f5a1b43febf42d831e60debca3e1ade7d11ef3e284e3e7b13deea5e9b7bc11e286ff88e751dc90fefe71e0ac91bd69a176a78f74bc7252e4471f2d99ff056f7b3a47003fa97d4f7d219f8de13605fc582be03363e4b71836f411e436199ae998f588fb8e1c7d51e80a5f61a1217237e63083e7c3bb215856d5ddc0ff7228e45187ef9a16fe8f6c46721d945bc7802dd59613d2a028f7dd622376feade69789f0467b81f13defd201d961ffe12065f9dc1b6161be22ff5e25bd94a2f03515b5d82e2e4739057a61396cfc148875554dc10a4ebc1284e3e870aaffd0f75db705e73bd5c0713ed3f5acb42b4d372468feafc776218a913ec430c477552e7bf13e87d4f62388a93cf91a44e23dd3a3d584a2fd722bf2f6e3d1da24e2b49dbc1fef1284ddb8d524f72d74e02d2f1fddde0bb703f198de2e413eecad980c2763de7c377472389dcb1c2bb37a2fa736acc2377efa4f0063278a3bc78bef5b475f4e0786f7d2df81df582f419386faecea827d05a31310eb585f28b0fd64332e5739581ecd521ec638dd73e52775da0bb72acb56e9e4530f6c19a1ddd0963ad73f3ec6ea1c2301f9884ea31099543ef32ace751bc0ccf4bebe54e25d352df5325d0fa19de0de5c13b76750f8e1885f2ca27bc0b5c86c232ff8b69394fc3efcea877060bb2559e0d042b17b5636ee6764c4c403ada88e264189f1b57bab136a7b116c37b377576ec3958776d75c3dbe1bde03637bc13eead5173be056a4cb5d4593d0bd69b9abb9dad97549a9a4f38bfbbadf248953879d4193f4bcd71ad57d2791e6eef3e17c059d6d7bc78d64e9417e6c87eebc55cc207dec7aabd4c4bdd436ec11955f88d14f51d4696154206f81778aff9020adb7a7cf8661ecb82fbcd5f413c543d17ec0fc181abe7dba49e70be1abe3779c840c666151e43f4a0dedf66c550d8d6c323c009ee66e7ec80d3d5bbc23b16a9fbcc7d7d86f20989c922b31f51f79b5bbb4859789ffd180acb7cba79e96e6f595f5f3455e4f3450b0faa3c6a5f25e58bd43ba504dce9b50c8533f8a247e15cf61e8285fc6f02f8faf922f43ec1da8be2c2f8a20f85d7177d24bcbee863a1f5458fc1bed36455a777dc7c8fa9f59cb54f3dfd7cd427c48e753eead30cb62965c2372297113c1827c0ce3ff3e6b3547f4ec01d69ab5058d671bd172fd53e52a6f257e2019286db2eac8f84bd45b8c72c0f856d3e8f93bdd4d4b929f8e66b370acba7ba3b2a2b8ec2b2dc4215afce603c0e73847928bd807395541da6933a4c77ebb068bc375f2affb56999d6e742bf9faace30246692faaafdfbc48c344602f6210ea4db6011ec89dd41d20a524f355f16f85e3198474dd6c44dd1c4217f631d14daf5b340ef11e12e7c81fabd2f47b51792b80e617c29bc733fb5e79ab81ee9ee7ab7ad1643bfd984e2719b423e1817ab137ed2cf1ce6b9a7706f10deb33037b8b84f34f7e64be95afad4812a8e7c0f929823bc7b04731416b4fda5245f1ec907e76a371399f2dff09e68729ac792868407ecf7de4878dce8e22f294e78dc487840be863e3c94cf5d02f7d67ca56c077ce4016473127b0de18fc739b0919b088f9b5c19293d43be9bdd7c59491496cf5b54f93d24bfbab7202b0b85e5f3366ffec42d281eec44962b44f0e67ae5a7e26f2772e6a278990f7c3c8c153037ba03e942bd2b4cc05d556b511e88974f78c7b40a85b1aece22e5e0eeaa03286ce75f56d86db765a5dce7d367101e501ede092d4361f924774725d4dd51cb062adc915edc5439b8bf08ee7c041dde4fdaf63e142f9f700fd65614b6e53d599ee0c31d1aef10fc79a48d1e40f17ef80d897e9a13fdc09d467f1179f3195b79c8cb03ee904ce1e591f6ca533cde40f2904f83fc5985bdf997eff3e687df2a482c20f917b8f99f5a8ef8c927dcddb10785115ee21185530485e513c6f7a2282c9f8faaf862282c9f6abf32ab380a63fda9df115bde1ec5cbe7e384dfe384df22e1e9c34e583e17137e8bd5f309c24fed772696107e4b483b1ee3e565a96f54134b8577fdb754b5cb74559f3ce1d177c672fb0a665fa9fefb3ee92750be048987f22549bcb21bf80d2eb0d7d4d807efa1d57ed15238afa2c6be049c47c05c67a7e312b3509c951e2353fb9a6a8c7c1abeab22be54377ff79d9f40bf5f86785551717077c75a9407e2e513f65057a1b0cd6d15bc43ae4aca2d17debdc8e584c3d304ef6917ef19b557be12be2781f2682f3101ebb115a81ed0b756a27c2b509c7cc23d191b50d896b9027e17e55b6f1d2cf8cecae6b30bd690dff9f0794ec36735caf71c8a93cf67099f67151ff89607de79add1e0ae45b86b501cc24dd991c25d5986e0eaeab04e236b3dcab70ec5c9e7f344d6f34a168c0d605f60177067040ecb27dc61f1050a23bb49c07d2cf45c34e06c20b81b08ee9fdefca93e0c77daa83efc4c806f46527d79a3f0ce0736ba755f759d379f75286d47abc027c3fd16bb5018e7e538f8f16aa3b0b6a0f6dae2727a16dabe1d8ac7dcd53c3cb11995ddaccac21d3ae7a3785c16f2a9bd1bf85dbdc456926fabcab79270d986646e4318d2ae60dd0ab6b81de5ddeec511ea8c4ad6b1997565fda0daa305d2bbc4dc91c6b77e14da3562e225d446e0cf5e4171705e1dee3f588bf240bc7cc23d0bab50d8d6cff3e5090e9483fb17e8b97748877b20e8b977b5b79b80bb2636223cf97c4be4eff36f233dbf85e2e413ee2ad880c236efd56afebb7a1ec17a0761ed4471186b130acbe71ba8cc1b0a7f878b2fdd9d070bee37f8018571dbc07d125bbd786bd4fd07eba1ed5f23b83b543938d70e77fc50bdc31d04f45cbbfa1e3e0177266c24e9bb91ded51a738dd269ca3fed1229dfb106e6f7f3481ae2ee39070dfbb9f81cb4f237da73d070d688d60fee50a067e1e1ec1bdc61b091a47f88eaa7eea35c9b47eab737cd632df88579248dabdf1e4dfd60aea4abdf2f4cfde89d0abd51bc7cd23b1520fd1354bfa96efdd64d27f5db97e6b1ee2e52bf7dc2bf7e1f6beab7cfa77e709f0aad1fdc7940cfdcabbddec46742eb173c5c3ed37079c987cb6f0c97fd844b5f142f9f07182ed3915cb54ec467e653bf4ba73b33ff0a6993578467cc7f6e206917eccb616fa080be7c33b94f29550ef65c97a130f65579282cc704f50ef379f5fddbe62da41c8c0dd497817f5d81c2897479b85f24f0180277cc90f649f973ea330f3372de157a9fa9ca85f1992f80df82f67d2f6d032fc2598979242d8ccf7ccfc7ce7f67ea07f7d5509f02f33dea33211dfb4ce5535e2467611dbf0bf58339d73c9216c6677ee053bf3f98fad17b6f7aa1789dcf8474ec33d598b001fc3ed4efa3348f0df04e621e490be3333ff2a9df9f4cfdf609bdcfdca79e47c267fec570a1febb2f8a3f523e13cec37fe962679546615906be9139a8d28f4361bb4d374d74f1362d25785f113c7547b0f58f0f9e7c7e8178d3f7ed708fcb5614961c0ebb1c36174718905ec49b7733ec712a7f6aa9bb21b2d4ef44507f2b5feda7d2517c02ee81f9158525febd8a33bcaf407b379be12ee339240de3aa71330bbe2dcb30a63dafde5dc72cf58c79f3e73bff006b3b18c7f250d8e6bff5a0371ffc6e35f5f7b138c1c3f7df287fb665a1978b33862a5d6c011b9f47d2008bf4310bce22e03e06ef65347d2c9620fcbe13f9fcd1d636841f3a93b2b50fe1f73a92fb9d86df640dbfd77df825bdfc701f8ea9fdcda07d38d05e20be4b08e6287047d05a9407e2e513ee035a85c2b6deb6d3f729500eee075a86c2f2097700e5a1b08db34d9d23dda66c797b29524edd0d94753c0a439f9461b807e85f144e101c59be9c9767aabde10e25257f5b80bbf86285847e3fe157d47eeafd53befd047cff10b4cb6114a77ef32501f706ad4579205e3ee18ea055286cd77b670f8203e5e0fe1fd84fe84ad2e17e1e3a1704dfff97f08e3b6a2c95264cf71392563a2e29509c2c07f7f06c40619bf70ea5ff97549f8d41f998caff289111473262280ecbd884c2f289ee1a72fe6dcb7a49bdff7a69ba92abde9b24135eb949c52b99149efd8724f4e17908178f4f20477d1fb613be1980ef5a95fe937027cd8b288cec3499e5c575c236eecbf08ebc31c12becc583f61213bce9596a5fe4e5f69a7c32fd046fb9047cdfaceed7ca52dfc6c48ae9ed2a5984d8554f142f9f7057c546925e1cd9959afbbf0c7be5a0936222e5075f015f3f8fa4810cc911612615dfd831698cb7d55e6eac045317b8c784ccf393ea1d5912ee17d948d24b897ce3e22be4fc53b224aa0b9c7f9a47d24006ad4b499fba9464ea02778890397d52eda726e1ce938d24bd8cc83786be0a67a7a02ec7a579bc4ace3fa5d24006adcb713e7581fd615a17fc5dbc4cef83e2e513ee24d988c2446ee2371fb9c73272cb11b97d51bc7c962772d5d8122b2df28de931a4b377d49a00faf84ed8cfa77d1cee36e1fab84acfaa203cbe275f1fafe8c54d8d8d70df1d8ccdf05ecf6f6c5473683a36264f4cd739565668c7c624baff24652f15519cface2b7992f08c8dc98a285e3e2b09cfd8e8846d3dbe3d92e040b9ca5e3d262b130ed94a4f3114b6f15e9fc7e055217855900e643cec4df627e5aa927255098f93090f75e6f58da90c5e352f5e2abd86c8e75bdf80ef1fa00f574fdbe31b03098feae9f2c96a284e72536d0077d9a5b8903b52923509662d52b75a2eaf377b3078b549dd20bdaec8e76bdfac45ea56275db7379b131e75d2e51d191087eb7611e152cfcb25598f60d62775abeff27aab2183d7c08b974a6f28f2f9deb760dc83bae5a4ebf65679c223275d3ed900c5e1ba0d205c4ef172499e42301b91ba3552bc5633788d099ef269c90a84c74052ae0929d784f03895f050f779bcdd82c13b8de0c17d1e7036ae92377f4abf707793f2893b839c3d863924ba7b23561cc5c927dcd7f1320adbfce576a0277f53e19d7fc2ef62cc23382f101cb0b5095ebc989ad36481cf0b528f33513d4aa338f984bb3c5e4661297f07c9df9cd483f6c366a41e807398d403e610ea2eb5acec10f5383b5d0feb7214279ff03bd32fa3b02dffddb924ff39a41ef07b23f308ce0b046783c299e6c5b3e03b8d00f76ba7ead112d5e35a14279f2d483d5ab8f2dfeb43f2b722f5807b3ae6119c17088e9afb397b1708cf52bf77965525443ddaa07a744271f2d99ad4a3b52bfffd6c92bf2da9475b520fc07981e00c55381dbd78f0bb3c59557dea310fe52de2932f880ece453ae881e2e4b31dd1413b97fbae6a243fdc63f2030a631d00ce0b0447cd8f9cdf024278f07b3e5927f3f580f39a4ede82ea408d57c90e8adf0a1496fc0e79f359b09f67fbe1ddb03618a4d2be4779f0be47584eea2c79f23cc249ddabb25bddffb75bade762b0b6506b00edfd42aaad2d74d64acb819cbf4f927b5992ea5e96bd7984abba0f25ab1a0acb6767240fecad4b3a2ed919c5c927dcd7b201856d791f5c2742d503e4c33e7212ee33f91185e5f3020d3f644fc90b509c7c7627fcd4bd1e7baa85e407f2d5efb7c399d3a4da8b88815d92fb3992ea7e8e3deafdc79ea5044ffdee3b9c554df60a88b73fa49da8efc6f6fce5f2d8abd603b113081fb8d72349e2fb7879c64e44f9215d3efb2abedb5058cad77c7f06d8816d7c06b1b9ad286cd7ed6398e72a1be7f6a7a88d655527750ddb07181bfb70b617e348dbd887bb5cfd7e542a1a1bfba87d38fe60631f0d543cd47b875885fffb36165373f8985a5b18f964bfb1e23865abca0fc42a21ee92ef854a07354818d6c2b0f706bf2bbc02856ddc7d2d085e7fc415f6a8d47bcf18ec696c27e90711862efd4b150fefe233d557f2b828cdc3f9b7e43adbd5ef3ed82399eb93176c09f4a5be534a5e4cf405bf93fcbc977312eeae5981c236ee27e309de40037dddc6a487d15759c56b8392998dec91b1715f3c584b0d521cf250d896f3a9da578b5551f14350fd5559a1dec58b79a47e90fe2f2aab4997ff74645465d22da29f47513a705173b324fc76721e0acb7aa8ef9f3f85b6d0e964597edcd8c97cbdad2cff7a5b8532d4bb70867a03876a4c3abcf78075318c5343f3738dd540691aac584d7f2e31b5ff95cfc621bdb6086ec3ea7b99e430b74c16ecadc1b834dcdb86291b1d99ae9793c76ed7fd5b4859f55bd259b5ddf6deafce4fc5eaa2f422084fa6c1d907b8d7783b49afefc5ce970e7b6dd00e0d09ef5122d527e937a04975274e561d128feeb674ca639e3984c728c2f312269df04ccdf54733fa46f76f39796c7d7fde84941de3d5f7e7ed89bed17d45c9b1a41ea7109e63493dc630e9b41e30968f535cea92787c874d69c2a191d0db737d2f66be74ca419d314a5e463840fc041f0e8d3370b82c2007a59f642ee100f113790e16e3a3521c72037250772d25e14e933a247e32cf21d6240387490139a8313ba9beafceaa47e2a7f21cac5b337098129083bac322398db405c45fce73889d9a81c3b4801cd43d34c92b080788bfd287c36919385c119083badb2449eecc48f9986bd21c92ea1e8dafee2565d5fd19e063be82b9715d945e04e1e17a9ceee5994aafefc5ce974eeba1becd4a4e67ea81eeb670f2d8f5f87a20297badb71e5f4f24f5b81661cc20f53883f084f4fa5eec7ce9b41eea7c5952ddd191ea9f107f9de06da2a9f0b789994c3ae5a0f61692d7130e107f830f876619385c1f90833a07989c453840fc6c1f0e6766e0302b2007b56f9f9c23bcfd13e26ff4e1d03c0387390139c03b0875bf44567d127fb30f87b33270b8292007754f4652dd5191d580c4c31d15eafbb6d839283fa4cb27acafb6317ccfcec097aecf38beeafea024dc755187c4dfeea3b3161938cc0dc8c16f7eaddbbf68a9d2d43deb317827a2be49cf6a88c232bdb548cd590f0d5471f03ee72e54bfb0fb1b3a6eeafd4af2ce34ae235fc6215949f53d5412eeeb80dfd886771277a3bc77a3bcf2097771ac4261db47ff5891604339b8eb62190a4b5eed5418eee8d88dc2920bec07aabb3a929fa2b02def879fbdf993e87ee0e403480ff209f7719c82c25286babf21a9eed548bdaf7e90c8509c93f3918cf9a82dfdf61a951e52ef0de08e04f5cefa107c83f168303c6f5cd2b2e45e6c7b314c0cb26765394e05e4a8d84b7413ad4503d1530cb5678c63ed7fb5b69f63ecffdd10c443c97a223b4319e7eca773d2d7feafa62376a2ed60c7db00967cbfd2dd0ee4da51c3ecfc12a3835d66a2682c1a39d863ecb42136ce047b2d314a0c162758c511efd6cedf83ec1ca31cd04659f944acc92742921b6dff3fcc2e36d12e2849e6daf1e7da3163ed3f13ecb82176b8a3fd94a5068a53443ffb7f2f4a2f5bec687b82344cf4b0ff1eefe00db469e7cf99a94a17d9b1b44c371b73acc36e8c1d030a1d6f87473b0cbb3b7f4f76980e73d877b0e326da71b23623442bfb39d59196bfee13ec7feb64f6502ad373bc2854bce56cad4033b5b16b23d9e738b6f8ff5ae468b488547d96ec1ff2bf448ef326e6c67c2df1ff74e83a19f9e2a383c238c55199e5896b24729c7723ddf269307c1df3d7506fdfaebe4f134d7ceba2d78c6cee0a4e0dd22dfcf3bece85eabdf3eaa8a4b76a8d458eb3ad5a3143d5fc142bf16a59c7e743f0af42329968288952f55b3af53b5bbbddff43f5bbf94639f9c237409633f8791bc0f959d01ef63fa6da7f463b22863899a5d7eb64671b6bff19e110ced7460d25602147cdf907d14c543945c7748a76f6c87b1c153bef97c1c7e9555d38558bb4aa739c9951791f83e4643953a6989a374197d9d5a9c9e967366cba20a96f97a24ebb14441ad732715dcb14fdafbb40669fefd72ec552f54ab78bfc4fafc3e28c6d67e2c06930a1d360b1a363db927bc16c5b1ef4ac4f74a8d75f095f1bf463c06930a9d3a07302b5e77fa8c12e36c34bd44cb1603a2c195887a51c1d9e90af764138705accd268b1a1d4e2b13a5a45082de7224c3d70210eb8b42170610ef83843e0223a833ae6bfee92326d9c832207dcf0e624bf95a94bdd9ade9eca327d323305ce9a8aeada46aaf0782d2bda3865f9c629c6219733452ece219737453e466750ceb776fffd3cbd6063a4f435e5028f91270abf6976d811b2844e7bce9787fd8fa8f6f26f1fc1bf5ad96547da7a98ecec094cb2cbebb69bfc355a21b0b7afe868335be836c1c231e2345c5267f952ed2771cd4e8dff44def84be9c0a5c44a41dc74451ef8580eb8b22170690e38db10f838cec35431f5306538e4aaa6c86539e4934d918fe790ab6990ad30c8e538e4eaa6c8e575bec8b1f09147d417f5b4e3dcade4b64eea2867ffb181b31a9f28dc9d485921d9ebb9bce0793ad9cfa13637c9c2df47d508eca36a3a3e4abeca3a524c39df7582aead9d097290ce5a936fea1339e0da86c01538e03a86c01539e0ba86c02771c0f50c812b71c0f50d812b73c00d0c81b339e01c43e02a3acfe20c71638f9267912547dab2e4aedf500751fe817565745ea661aae6685fcc19831bf9fa93e8f8a9e386ee7f8598cdb3468e8bfbaf2871eeaeaacefee49aa8b14e8bce84a3207b2df2c09d5c5f3bdb53c97c765c82b7e3937504e5d82bcfae198dbdd538e4d34c91abebfa9e33a5fa6f37f2dd9d7189137e85268fb355264a583ff1b373f4c67c86e076e8fd3970665943a74167ea38e2a878af1e42bebd98e8ac848645ecaf9aea3cbd56cbcd1c2dd7f57119663cb9d6a8a9eb29b235ce0c324835e33b4a2d0eb8b921706d0ef82c43e03a1cf0d986c07539e0730c81eb71c02d0c81eb73c02d0d811b70c0ad0c8173745ec559365e7254bc0a5dc3443f176a2d34a3b8b39c6de0e345a2e0258ffd659c03b5751cda91a6c2b9b5863a737056e4971e157300cc714e584a8bde20dae90cc259f3e6f8b44234ccce0d6212ed1d9338f26438a33845e77c8e7582f935d7502e2bce23d5a20ea911ef901ae984c9d9f7f93a6172f62dbf302fd844ba3127ab1327ab73816535d1c9923dab8b4e9634bfae1994d89e17762a27ec024e58b7820b3b4d27ec18c75d186e5f9eaef346cea651ee51f246931c891219af408fe45458be0f0d3615eee9b889d37dddc491e0cfb98d3374765152b857519aecf137d59985b3e537e9ffb059443f70f5d674e61c6787b2a9b11114846d1f116030ebeb58e9d121c8596a33ce5d5ec8b9cb7e05779767eaacd7d9fe1d7d54acb797704fb348753552fb56d1db6a7f9dad3a7bd30d7d4c213a6e012cf362c732ff0b3a9c1d36d79986b3cffe5f1eb3c21b54053b663540d7d8d93232ff81aa20d2060acfac4bdb7a8384fec056107cae3dced2b587f316a1d77fd81ede2342056b91c1ba167136ba4fcc579360f286409b587c9b0c75daa4a012b856395be7ad65ab0cd3796b59c9e15eaed4590fe59df5399cac119cac910596d58293358a9375498165b5e4645dcac91a5d6059ad74b2e4fa405ecf60b43e68ad41ce71de8e5c7844fb271cfae92edad8cbd25636f95c353ec8f89e8e05a70f077973f9f753f92232d86c7f9cd3b72a0961c486eb636db8361b6fda666d75c872557099aeea215605ed74c6e0bcd01a73448d811bf8ffab05e284c02693eb988cdccd39f29c39c33a57d74ad5c5517b8b85a7748d236e1979c5449c0ebace6b3cbff755668cb2a58b4effc50ccc9344a6b766662cb8d66fafebfcf22db0bc0183be5a75f853077006ef003ae8c0a5cf9aa2f159a15e5e9fc7214f35f586e7eb90e559976941bca1cf59978e3a60b93d29ef96303d6fda8903bf2202f0ce1cf895118077e1c0af8a00bc2b077e7504e01770e0d74400de8d039f1e0178770efcda08c07b68c0739c97f3ffed9239fdd565c116683374fd5debbbe5453ffa856e660e9c5feea96b22a9c5eb82b8a1997cf3f4e280af3704eecd01df6008dc87039e6508dc97039e6d087c21073cc710b89f0e58be1ebb3108b0cfbbb0fe1cf04d86c01771c0371b025fcc01df62083c8003bed5107820077c9b21f0201db03c31323708705b1e78b00638c7390e352a9fb3fbef0fb845bf257ebb4e5f5a972fef85aa65c9c345478e2b37340ce1ece84e433b1aca01df65083c8c03fe9f21f0700ef86e43e0113a60b9ef7f4f10e0413cf0488ef1bd868c47e980a513b8cfd0095ca203964ee0fe20c077f0c0976a80739c339147e7b51b77923d5a1ff340601f334f647afb151563ced38cd635bdb44179b51a5d27c86b39c2ac13c670e0f335e0ffdaff85011fcb813fa4011721998fd381cbcd873c61b8f9305ed7259cd3bc4776c0f56e5837d69e5fcb75f6a046396636cef3efb636ea04c7ace8a676e30c9d61815dab9334ade1b488b6533c2c60e03d729cb9ee701967548f44605413744def9cb73e3a4768e899d6ae4ef9f14e8cccddca8e1b67e35f1ab17f5c18d83f3e2a329d5b397275e04c24973391c7223091893a70e94d1e0f3212fb1c399fc4012f32049ecc79cac5a69e720a87fc8429f2540e798929f234ce389646601c97ebc0e546bebcb2d57423ff0a4e274f9aeae44a9ddb73be06393a5f3be80e1445ebe09e129a7750ce672a7e9f1844c14b9e9f73ff625e422d1799be74888206e73bafd219997c5dfc74102f94cbdbd8d55cbf7b46d3efc2ce34afd119b0f371d0f0236ac0f9a73f1d6c2cf78a423869908e6963979d62a3c8f16e905a29849dacadd03583d68e563a765447e82669e62c39fb99ce35f3aa08dcebb53a7079e1d3b3a9cc196ca8380f3e8363fe9c8679d875d64cce77afd6f8ee502f61afe374b246a393e93ada3e3ab99e035fab019f1b12fc060e7c9d063c2f24f82c9d4770beeabbf63ff108996e0b3fd7ae9994862fcecbbf7482eba2e5dec270314c9d85922c32df32eeef47d6a7f4830640e733b7b6c8631cfd5ac8dfc42b5a911f2d5f70bcdcff2dce9c6f9cad33787949a1fcb1f67c57e1ca2fc906a8d15dca1fab564fe39cd6eca0c6fa7c7da210df27e6701e6e83c6c359213ddc8dba0ee77c2277646f11c9d4ec722a24ef5acf75fe3d59356f0f4776fa3e6093aeb45184dd3fd924e0428fff823d678e3771fe77b3c6ff9e6185f3bf3773b6be45049847fa18f12d1cf0565d274a38f9c277955b39dd6cd38d4d2175731b5785ed86ba99ab0396b30cf90b2d462bc4db39ca2fe9b4dec0e9f1e99bbbb39dc965faeeee6ce7c6c05cfb39d6b6d06ce7dfb9ce26d028b55934d48e9d9cda27cc76eedd1f64f73e59ba41289ddcc1e9e465539ddcc9d9c82b1a1b291e0b672377e9c0e579e05783d888cf79e0ffe9fcb4f375f1d1799d9c7fe88d76a5ff9a4e5f5aafbc53647a9d6cce95f3c577eb9a5b4e575f17f9e7690de53ced0d217fd553f27e5364da30d04d79c233cf67652ff056760fd737ded2f48df521fbc6bd9c337a5be78ce4e71bedc438c794fddc4ab6d3acd9ceafe74c50cddbcc0e5f211a8aab42b99cfbb8cabfa3a9fc5f212b7f3f57f9777595971f99b4762a3fdaa9bcf4b713ede770a7ad8792eafaf9dc6c679e913f75b018e46cde678b298e5f188da44c71ece8d2901efb015d0de534f53d917f9a2ad51a669a3a8f037f5f032e42823fc881efd28087dde39acf81efd680c743327f8803ff40039e08099ec781efd1802743822fe0c0f76ac0b342823fcc817fa8012f1412fc110efc230d78e190e00b39f08f35e04542823faa01cf716e0df92f6fada3a359b893c5fb44d079c127427f635d26f9dc58ff98ae69a41ffb54e41f1ea6160d373c3cce817fa6019f1d127c1107be5f037e6f48f0c51cf8010df8a290e04f70e09f6bc05787045fa2039793b72f0433793b2852bb5a2126554bb94a7ca9a9c4d262e12ab14c072e171c5fe93a4a8805c7931cebaf35ac4b150fc7fa298ef53786ac9773acbfd5b06e1e92f5d33a70b926fd4e18ae499fe190bf37455ec129e4904e21c78453c84a0efc070d78b592e1c057e9c0e550f8a3309ff23dab0397cbe99f8218e04e1ef8391db09c62fc1c04d8677abd5a072cbf8bf82508b0cf77116bb846fc55d388854b856bc4b53a7099ff3791dfc7e638b78a15ec578a0edba5b212c2fdaf81fd9fe61a1b9f5ff059c735dbef42b33c939f23ea16e7b0eacc16eec74bee86d84467e125272f72a9ee56cb5db74eb2ff5ddf7e0eb7ff9ee06cb5c98db66cfb0f6c194bc4531cc4e1cee46a8c534e62bbcb7e99dec84e6f663f1bdbcf2aa16c6a3dd73a7f685aa7a16c9d3fcdd4fc3ca7e6bf746a1e18899a0bae4cb9121ea966bceedea75c7b8f56b8f2574587aa7dcf6c557ebc833bc26121f746c335c70b5c4ffc5bd3138b970dd7135fd480e73837ebfd973f29d4d2393a2a3720c24ffdffd1393aedd4ff5fa1ff39217fe9dcc47f83ae59a4e6e4cbb68c9ef75fbe4936ea80dd5b1c03007fc2036fd2b5b573b1e105ff615b07f9c15a7d4bc774f5d7b674dc922d5d365fad7c7fd395d1da665d7348ad256c2145081d670a409b44b261c0b7707d3b69e5efdbef84ecdb5b39e6591ae6dafd0e1fe6db38e68534cce71d1f8ef9766e40286c690604a1a3eee3507770d48b68a80f2d178efa4b1c78510df88613c381bfac039793df6296f9e4f7150ebc7804e0af72e0c74400fe9a0e5c4edb4b04f1983ed3f69d9c1d960c02ec6382afeb80a59594d258c9c20ae1ace40d1db8f3139c16337f2b6d19cddfdee4d4749caebbcabb2fc2cedfe460f47f71aafc16a7ea329caacb9aa9fa6d4ed5c7eb543d383255ffff67bafc0ed7b5ca69bad6ea4ae1bad6bb9c1b2b1f811b7b8f033f2102f0f7391f79a2a18fdcc5596405431fb99b6bc88a3a1f59395c437ea00397b3f7930c67ef7b38e04a86c07b39eba81c81757ca8039753c5ec20ac7da6891f718d5845d388a3b3c335e2c71c78550d78932ae1c0f771e0276bc0ff0a09fe09075e4d03bea36a38f04f394ba91e81a57cc681d788007c3f075e3302f0039ca3aaa51b3ae515f36187ce896a1884737161e627e106b9cfb9bad4d6d54526647ba48691f50527ab8e4e96fc3e6e80fd7f43fbcf907c27ac648a7b46456a360c8b831c8bba3a16a5118b316a1ae19e572c38832f3906f5740c8a220603446fc73226861c01bfe2bc447d9d0baa16ce4b7ccdf5b50611f4b56f38e6391ae67daa8763fe2dc7bc6104ccbfe3989fa261be3224f3ef39e68d22607e88b3cfc63afb9487f9fb295f7691ed1bfa293fd44c4ddfddb83eceb3be38dbfebb2df259431c20793a4c9e201b6fc78d74fccb54673b7098133b34a44ffb81e3df44c75ffec2409a115cf59b9daa5333559f8b34bbffaecfa64b91314e8e5c7512df5dd4b8f5cb15eed6e634a764983afda8ab93349053b9f5e169727d5848b8ff3570ff0bb744fc89d3e3e93a3d560b6407ee522ec77e365171ae4d5c214e55794f0b79acf2674e3367709a696aac995f3899cd3899671acbfc95ebf2cd23e8f2bfe9c0e5ab82b30c5f151ce6347536a7a973a4a6925853e1f4f43ba7a71611e8e90f1db874ea2d354ebd628b704efd4f0ebc9506bc7d48f0bf74e0f234526b5d43c8d3486dac829c46fa9b731a6d754e43fe0e51feafd9bad8cff4a162f93ec8ddd7e989f678c2b8887f384eed749cca0a77c2d5c8fe939ee87610ee2d4e530d267eff723ccef59b7aca6b0fbd434cc119088b61d0de6f0a7e8a47139dd562a6e02c2c8e45071d8b92024f807b6a7615c3c88ee964cb7e701ed70fce2f503f887375eca8ab6379b61f7477167f139ce9506b650723424f1f125cad3b71b5ee5ca05a277572e429a22e1a3939ce2fd615ec6edeae96ff4f4af91c48cae25ae6023f6fd030726f5088e3d12dd342342a6f509863d03dd3823c4a6f508463d123933790d246d8865170d94539d93d75b28ff178a26e065ea818d71f7b71fdb17781fa6371ae3ff6d1c991fdb16fc13bd6313a6172fe72a166fe32b275b8f94b090ebc9f067c6a48f0921c787f0df8c190e0a538f08b34e00ddb85033f9633e08b75065cd9c9e77edde75ebb364a5c2edc55acfc5abcbbe868ff6bb09d79b8bade007629a7aad55c18232fcd711bc0ef73b542b27b380e368cc4e33889037957d2c61960073bce144b0f3bc496e19a7990ce40cf0dd7cc65b98a0de63cb5f44eee6f86e5fa3670982a1ecfb118c26d16b7119d441ff5c168b8397b399d2cb98c1baa59c66d88875bc695e7da6a986ea5d5215c5b9dc06969b84e4b851d2394b721ca094f78933f9193364227adb8465a77e504c248ada0932acd6ea4657ea35d45ae4aa3f82a75710c5a9afa44e78e81418ef187a9d2499cd44b74528b3952dbab030b973b6f26263ac9616456d2c8cc717e09586aed685d50d64164bafc2becf56497ea7691b4072e475bf2355a6d2767d41cb9839995396f3046e30d0e9f1fce1b64737e6c6c04db515574e072c5322ec8b69dcfe5a05539d6e335acad90ac4fe6f47d9946df853b86d377350e7c8206bc4948f0ea1c78ae06bc4d48f01a5c634e346ccc9a3a60b9969964197efd558b439e6c8a5c9b439e628a5c47e7739d1f49ff2f0fafb7b243f2dfe10faf4fb5e4f94baa00ad339d66e94faffb09e79c645d6ec4bf3c8211bf1ed7da5798b6767d0ef94a53e4061cf255a6c8399cf3bd3a8221a321077e4d04e0a7703a996eaa93469ce7bd56e37967770de7791b73b46798d26ec2697b6604da3e9503bf2e02f0d338f0eb23003f9d03bf2102f033b8d69c65da9a4d39239cad31c2e5ddc31961334e277322d0c9991cf31b35cca70f08c7bc39c7fca608989fa503973b3737079915f97cca7f36a7925b342a913f10164625e7703678aba90db6e0947d5b04ca6ea90397efdae70651b6cf0facb6e2947dbb46d92b078553766b0efc0e0df85d43c281b7e1c0efd40d3c43c381b7e5c0efd2805f393c1c783b0efc7f1af03223c2819fcb81dfad01af352a1c787bcec6ef89c0c63b700ee55e4387721ea792fb742bcf31e154723ea792fb23504947aedb3f60d8ed3be980e57ed8bc20c03e1b679d395d3fa873de63c3e9ba0b073e5f03fe6a48f0ae1cf8431af07bc78503bf8003cfd3800f1d1f0ebc1bb7025c10c10ab03b67820f1b9a600fce041f3134c19e1cf042dd7eb1ecaa035237310f40c79b7a88b05bfebdb8567e54d3ca0727876be5de1cf8631af0eba68403efc3e9ec719dce2a39c1b49efa888e22c779b125b3c0ae4c5b913e6f2b0f25b8df5ac85de1303aedcb315bc4b5667e663d9ddde75122dc571117720a5facdb0dbd329cc2fb71c3c613110c1bfd399d2dd1e9ac34db9af0f3885d9caf5cc2e8ee224e774b75c61a52771773ba5b1681ee0670ba7b52a73bb972c8453767bb3e037ec0368cc60672729fd2c9755e5fdbbdcafd713679fc6c9873ab6b1889833889cb75129dd77c760d270bf787e0fa8692359893f5345fbbf1ce9db5d30ae8378670129fd1492c42dab15d686f319493b74227af9853c35ce7aa12f9cd593731c8f19be342c91cc6c95cc9f9c6a1119da918cef5ef559afe3d7e7ab8fe3d42072e35f66c909981cfcffd8ee41cc77311388e515c63ac369ccf5cc2e97a8d46d78742eafa520e7cadae21af0d073e9a035fa7631e127c0c07be5ec77c4638f0b11cf8f33ae621c1c77196f282aedbca607a821ac670c673725ed4c929ec9113fe16f5cb38691bb881539eabce152ded6877189307e0c6879e6a4ce0e46ed4c92d2ee03c370c6469f961a4e6725237e9a49672a4b6d40c6905933e9193be996f5977482bc889af499cb42d3a69eee13d7722d4d278889bccc9deaa939da56a2a27fbe3434e51a67092b67103b8be45c3c89ccab999ed1a3753fca6706e661ab772df61b872bf9cd3d44b8623dd15dcf8fc7204e3f3959cae5fd1e87a75485d5fc581bfaadbdfb9391cf8d51cf86b1af052b78403bf8603dfa9015f1f127c3a6782af1b9ae0b59c09be61688233b8bdb43723d84b9bc9e9fa2d8daeabdd1a4ed7d7712a79db5025d773c0efe81ca3fc600a7f471ef5278337703a7c57a3c39b43ea7016e780de8bc001cde6f4f83e37c0e05f74496b2e8cb6e66864e6c81369564ff1df9da9ea29dc0fe81adbd2b9efc6fccf56ed4ad523ada21c794180e62bb520d276db7885a5c2e49f81b7099167ff79d5fe337daee07ebaf2034b1eda2a983ceef0d68d9c35efd1bd74b82d9c35dfc481efd5806f09097e3307fea1067ceadc70e0b7705de5236e6b2ad76e92b1ce0fd249630cd3456ee5647dccad5b463b5b37136d3737c131ff098e99869d55dfc629709f4681df8454e05c0efc130d7893dbc381dfce69ec539dc6ca6a068468be9dbd83e3f119b7069332267a5ef27412f8870ec348bf9393be5f275dba0df84231130b996f8293270c9fbb383e07747c8e43da68ed6cb6c2a635def80fab93ff711c3ed771a8a8d1893f978269e66e8ed5173a566590665a3a2b57f7f515b659b8653a0c8b7b381607752c4ed2e826139b8269e75ece557ca973e477867315f771e05f69c0678704bf9f03ff5a377886047f809b0a7e13c154709e0e5c0e2ddf5a86a7d01ed421d7b183df59f97ff53826849efac3bc80f99c80ef3502ac020878881370482320510001795ccbfea069d946215b760167933feae65cf785b3c9873917f293ce85640be15965657bde70b9bff13bd171abee17c7cd9c38772273560136801fe1aafeb3a6eaef84acfa42aed17e89a03b3eca31ff55c3fcaefbc3317f4c072e7bf06f41d6e53e5f0f3dcea9e470042a59c4a9e4778d4a368454c9624e257f18aae4094e257f46a092259c4afed2a824fb81702a59ca81ffad019f1e127c1907fe8f06bcf9bc70e04f723aff37029d3fc5598a1cbb4c2c6539a7122b965f252343aae4690e3ca6012ff56038f0673895c40d55b2826bc844ccbc2157722a496a54d23ca44a56712ac93254c9b39c4a0a45a092e7389514d6a864effc702a59cd8117d180377c281cf81a0ebca806bc7f48f0b51c78310df8f490e0eb38f0e21af08521c1d77366788ca1193ecfb12ea161fd7348d62f70e025758d99170efc45ee0550a9202af17901b481637dacae2143b2dec88197d6801f0a09be89b392e30cad6433075cc610780ba78eb21a75c81ff80ea38ead1cf8f1bab13224f8360ebc9c063c3b24f8760ebcbc06bc4748f01ddc52ef8418b32beddd39cb16939de45121f7545fe22a75a2a652534356ea650ebc82067c5e48f05774e07233af62ccfccdedab1cf8497af01661c05fe3d45249a3961d21d5b2939bc2548e600af33aa796ec0874fe860e5c5ec5572596ff65a073155fd55841aee27b93eb6a27ebba5a55a1bb10347d021befb87447fb2d9dc86e4b984ef9166720d53406b2fce17006f236a7e6ea9c9a6b1448cdef7095a8a91bb11f0957897739f05aba2e1412fc3d0ebcb6067c5748f0f739f03abae9d7c270e0bb38d3aeab336d39dd4a1b7236d93ceceed93ca4e6dccc33e21464fb7037a7887aba797f48457cc081d7d7801f0c09be87036fa05b6b3d1a0e7c2f079ea301bf3224f8871c78430df8cd21c13fe2c04fd18df621c13fe6c01b69c0978604dfc78137d6801f0e09fe0907de44035ef1b170e09f72e0a76ac05b8404ff8c033f4d03fe4d48f0fddc3ce574cd3c65a808374f39c0bd6f3b2366f8beed73cec336d5795879a80bdee6cab3ef1738d1f22c49184ff90527b3994e26be1d5a2fbb60ef8d0f72d670a6c61aca2c0e670d5f72e0cd755e2f24f8571cf8591af0ae4bc2817fcdd9f1d9baf976a97076fc0dc7fc1cdd96e1d3e1987fcb81b7d06dd1ae0807fe1db711d4d27023e87b4edfad2258df1ce2b6545a1b6ea9fcc0e9ba8daef33c174ed73f72e06d35e0678404ff89036fa7012fbf361cf8cf1cf8b9ba813724f82f1c787bdd347e5d38f05f39f00e1af0a1ebc381ffc6819fa7db8f0c097e98033f5f03def1c570e0bf73e01d35e0f5368403ff8303efa4012fbe311cf89f1c78670df8bd21c1ffe2c0bb68c0ab6d0a07feb70e5cfed26b571bbc0801cfd579c4b8c582ffc3815fa001ef1912fc5f0d784e733b685d258ee469f59eeae6fd69a2ad933acaf9354b8939c9912891f151c41e027fe58f97c9f0795d3d67f9cca1ba67daddbc931cbefea7dfbbc57c8e5669cfaa778fc9b3ea2d85f83f5037eeecbb88694c49b6760f4d75d9a36ab2a68c004b2740ee6cf5e476b67a1568672ba6932367cebd75f371f75bd0d6ceb7a7eeb9df494e62413f8889eba44b5fd247e34bfeda12ce972438f0beba35fcd670e0490efc42dda64c48f02cae51fae91ac5fd2cd8fc73d5425c95faeba601dbc355a930077e91067c7648f0225c67b998eb2c030ad4598a72720672720615484e314e598335ca6af24a386515e78c6b489075818ffd1ca303762eee886035538253c930dd7bdc57c3a9a424073e5c03fe6a48f0521cf8080d789bd7c2811fcb818fd480af0f095e9ab394518696729c0e58eef55c12c1abb7329c4a2ed5edc5ef0ca792b21cf868dd8ba090e0c773e06334e077ed0e075e8e6bccb1ba31457ef2d3d9f9d5f8f48b11f77795f16bfa09a2e09fdb94e7bcc5388db72815d25b9cc06972bcee24c0de709a3c91d3e465dc16a69ca3e6dada9451eeb82c5f43b9af99b2ed196b76017e07ab0257c509baedb48fc255b122079eab01aff57138f09338fd4dd4e9afb2d612bd5f03e4a20f8ab29ddfeb19ad6642613fcbabc4719bc4f512f9bb37defbe79ae57b779efe3c4efe3675183e95393e93757ce45b015e7618b9d99c014cd118c0864fc21940151db89c464de5a651d30a348daaca29ef72ae31f31f8ec02b9b36f61ff92b67230af841fbc95cbdafe0ea7d6581ea5d4d27476e435fa593237f9ff1ea58817f9fb13a57a96bb84a4d2f50a56a708d79adae31e1874d9b44f8c3a635390633fc5e5d3589f8874d6b712c66fae941fed8f210f57b62ee1e49c119d4e6185ca763e0fda165b9b335d1d96949330923bb0e27fb7aee95e5e49477ee2ad23752849159979379834ea6dceca96fff1f46423d4ec22c9d841248a397da11d30cdab23e277936bffde34a9e9c8a2eb8f4069cf439dce8462da960eb8f1c4eee8d3ab9eeeda1057de1dd901b496fd28ca43d0e841b494fe12a7233d715bd537893efe51b71b26fe136a9f0a40d7f031e466a634eeaad3aa94589d482dc20d78493781b6f2c63d1fd1a61649dcac99acbb7279c796ba73ae030c7bdba2f18c2c83e8d937d3be784c62beb71ef2dc133a5dc50924fe724dfc149f65a710f51d08b8bcfe024dfc94b9ee4b4ac3b9c175c72534ef25d5ceff14a2ed8dd8bcd38a9ff0b26b56037059ec949bd9b73f35ea9f8c6cb30729b7372efe17c85576ef88b94cfe224decb4dce68ab9a6ee29fcd31b84fc7e0d87c0c745b1561e49fc3c9bf9ff39605ff29f0169cac07825973afd4864218a92db9017d9e66402f7c28dc80de4a072efdfc8341b65c7d7e47a6b50e58de77373f08707b1eb88d0e58be547f2896ffa5ba4330c44bf5b63a7019ccb3132a10f03d4f5ed1a5c359779e904f409267df8e33a1057e336f6940c3edc80162a2babe461a51b841ef5c9d64e9fb1e8e191eeb6caf439653f7478234b5cf71b50e3ae0e3ede0c220c06d79e0f338c68f1a323e9f53f263a64aeec8e9e271435d74e274b1c850179d395d2c36d545174e174f18eaa22ba78b2586bab880d3c552535d74e374b1cc5017dd395d3c69a88b1e9c2e9e32d5454f4e17cb0d75d18bd3c5d386bae8cde9e219535df4e174b1c250177d395dac34d4c5859c2e5699eaa21fa78b670d75d19fd3c57386bab888d3c56a535d5ccc515e634879800e5812591b04d8e7f8f7404e17eb4c753148839c73961db44689a37184b287b3a332d62e3ddcd9c91913f1d1c8f5ba96d01e897c3e268f44d617fc914873aedc51c7c1baf696adf242104392cc19e0211cf08b86c043757674b6b4a34b8e8a1d9dabf6e5ba88c1e212e1aeeea3b5a40d4134f626dff38671cba08d41807d5639c339e04d86c023746d7c8e6ce30147b48d7bd968ad9d1c6dc4f936c506b6fc31ea157b03b21f28f7ad646f94ede6968352feadb939b05fd8e2f885939d9c51f0e27cc0486e94da6a384a8dd235630bd98c97ff27cd083f1904686354287d0c60b85d2fc0eb90ca9fbe14ba9bd3a187a9ab6d2720a572e8fe8dbf2d70e36f771aff6cd4f847a3369cc95ca23319796c6f47109319cdef095daa03963b332fc5cc8f998ee6c05f8e007c0c37737ac574e63496dbdd7bd570776f9c0e58f6e7d78200fb1c1b19cf01ef3404be8c037edd107802d77a6f98b65e2e87fca629f2440ef92d53e4491cf2dba6c893b92ef84e045d700a47fb5d53da53b92ef89e61179ca60396af10de0f025c8a07be9c53f4ae08147d05a78edd86eab892ebdf1f18f6efab383def31d4f3d59c9ef746a0e76b38757c68a88ee91cf04786c0d7727afed850cf33383def8b40cf3339757c62a88eeb38e04f0d81afe7f4fc99a19e6fe0f4bc3f023dcfe2d471c0501db339cfffb9a9e79fc3e9e38b08f47123a78f8386fab88903fed210f8664e1d5f45a08e5b38f0af2300bf95dbacf8c670b3e236cef6be35b5bdb99c3ebe8b401fb77326f2bda189dcc1011f3204be9353c70f11a8e32e0efcc708c0ffc7d9de4f86b67737c7fae70858dfc381ff1201f8bd1cf8af1180dfc781ff1601f8fd3a70b95173d8709ff601ce4a7e37b492799c3afe88401d0feac0e58fd3fc1984f54e1e78be6ef7505e1c610d174763a3ffc86df0ff157857f06f675750fee6d09160c9edf63da46b62d912ff0469e2bff9773979dcd0f9afe9d0b98043167143e4873964cb14f9110e39668abc907300f17804bf51c4d14e98d27e8ca39d8c80f6e31ced2c53da8bb8dd914271b3dd91c5dca2af7010609f45df139ca28b44a0e8259c3a8a1aaa632937d12c1604d867a2b98cd37371433d3fc9e9f99808f4fc14a78e1286ea58ce019734047e9ad37329433d3fc3e9f9d808f4bc825347694375ace4808f33045ec5e9b98ca19e9fe5f45c36023d3fc7a9e3784375ace658978b80f51a0ebc7c04e06bb915c2094154e2b34258c7ad694e0c02ecb3a659cf31ae60c8f8790eb8a221f00bdcbce024d379c18b1c722553e40d9cd1558ec0e83672b4b34d696fe290ab98226fe690ab9a226fe1ecee6443bbdbca01573304dec6e9a2baa92eb67366572302b3dbc181d78c00fc254e27b54c75f2b20e597ee3553b4833fa7ce3f50a378dae63388d7e95dbc0a91b04d86703e7354ec9f54c95bc9343ae6f8afc3ad70b1b18f6c2373873ce89c09cdfe486ef8686c3f75b9c3a4e3154c7dbdce4ae91e1e4ee1d8e716343c6ef72c04d0c81dfe35471aaa12adee7189f66c8781767cba74760cbbb39f0332200ff80731c4d4d1dc71eceef3733f4fb7b39bf7fa6a1dfff90f3fbcd0dfdfe479c92cf3255f2c71cf2d9a6c8fbb8be728e615ff98433e7161198f3a79cdf6f69e8f73fe3d4d1ca501dfb3967d7dad0d91de018b73164fc3907dcd610f80b4e15ed0c557190637cae21e32f395b6e1f812d7fc581778800fc6bce719c67ea38bee1fcfef9867eff5bceef7734f4fbdf717ebf93a1dfff9e53726753251fe290bb9822ffc0f595ae867de547ce9c2f88c09c7fe2fc7e3743bfff33a78eee86eaf88573763d0c9dddaf1ce39e868c7fe3807b19021fe654d1db5015bf738cfb1832fe83eb7e7d4dbbdf9f1cf285a6c87f71fdaf5f04fdef6f4ed3fd0d35fd0f077c9121f0bf9c3a2e8e401df24c85167c4004e0960e5c9ac840531389e990e5d03dc870e88eeb80e5d03dd870e84ee880e5d03dc470e84eea80a5390d35b4bb2c1db07476c30c9d5d21ce2c869b9a45618ef20843ca45b86e3232826e5294031f150178314ed997982abb3847fbd208681fa30397efbd471bbef72ea1033ed50e8e0902fc2f0f5c9253c7d808d4518a6bc571a6ad782c477b7c04b44b73b42f33a57d1c477b4204b4cb7036926b682365397d4c34d5c7f19c3e2645a08f721cf8e408c0cb733a9962aa931338da5323a07d22073e2d02f00a1cf8e5118057e4c0af8800fc240efcca08c02b71a67295a9a954e690af3645cee62694d7184e28ab7013cae98613caaa3a607964fcda20c03e47c64fe68067180257e3a67d330da77dd5b9b9f5758673eb1adcfae57ac3f54b4dce906f3035e45a1cf22c53e4da9c25cf36b4e43a1cf01c43e0ba9c2e6e34d5453d0ef92653e4fa1cf2cda6c80d38e45b4c917338e45b4d911b72c8b799229fc221cf35456ea441ce696507ad29e2687c55c5ffc26f1b0753febcc328e7e700c6a91b8ba2fbeeea765b1771a2cc9cd65217670afe0bab23cb38a9fff0eb8eb8fcf0eb68d2d29b53636eaa76670453b5261cf85d11809fca0dcbff331c964fd301cb1e797710609fbb394fd701cb5d8a7b8200fbdcd37686ce27b491fde0685dcd89cdb7916dc0d1f6fb7b75fad276bbfbe299afe634e5ca75ada6dc1870bfe918d08c437ec014f94c0e799e297273ce173c18812f388ba33ddf94f6d91ced8722a07d8e0ebcb11dcc0be2103ee1815b702e6c81a10b6bc9a9e3e108d4d14a072e7fa9ef91b8f90f0fb7e6982f8c80791b8ef9a311306fabf3ee6da5771f7154bc7b2fe17e9d2e3d6193883dfb63ba195d3b59d7ba3e3edc8c51b66c10f217338b7bdc194e8e1c156e2869c7d9d7a208eceb5c0e7c7104e0ed39f0272200efc0812f8900fc3c1db8ec764b3536dab05d7e1b528644454a1b62449ecff9a86511f8a88edcecf349c3d967271db09c7d3e1504f83e5e1d9db9516cb9e128d6859b2e3c6d3a5de8aa436e6a079fb1138ecd883c8dbf58f7028ef30a53cedd38e495a6c8dd39e455a6c83d38e4674d917b72c8cf9922f7e27af7ea087a776f8ef61a53da7d38e4b5a6c87d39e475a6c81772aa5e1f81aafb71b49f37a5dd9f437ec114f9220ef94553e48b39e40da6c803b846dc1841230ee4c03745003e8803df1c01f8600e7c4b04e043b8d6dc6ada9a4375c8b5ede0b62083f93c1e78980e58be50dc1e04d8e785e2700e788721f0084ec92f992a7924671b2f47601ba374e0f287a15e09a28fb63cf0259c69bc6a681a97728a7ecd54d1a33945ef8c40d163b899faeb8633f5b19c3ede30d5c7380ef94d53e4f19ca6df8a40d39771b4df36a53d81437ec714399753c8bb1128642247fb3d53da9338e4f74d9127730ad9158142a670b4779bd29eca217f608a3c8d53c89e08147239477baf29ed2b38e40f4d91afe4903f3245be8a43fed814f96aae11f745d088d770e09f44003e9d03ff3402f06b39f0cf22009fc181ef8f007c26077e2002f0eb38f0cf2300bf9e03ff2202f01b38f0831180cfe2bae797a6dd73b60eb99e1dfc4ab73b2c5f40cbe39eee5ff9f78497f382e6e8049d6407bf0e3219bc9807be9153fc371128fe266e0afbade114f6666e51f69de1a2ec160ef87b43e05b391b3c646a83b7e990e5f9d11f8250f6393f3a97a3fca329e5db39bbf8c9d02eeee0d6903f1bae21efe456bdbf18ae7aefe218ff6ac8f87f5cebfd66da7a77732ee370042ee31e8ef6efa6b4efe590ff3045be8f53c89f1128e47e8ef65fa6b41fe068ff1d01ed795c17ffc7b08b3fa8039644fe0d02dc93079ecf018b8419f0439c83b68200fb38e83c0e386608bc40072ccf4ac68300fb1caa7c9833b944c2dce41ee158270d592fe4586745c0fa511db8ecb58582b0f679bdfd18c7ba7004ac1fe7745dc450d78b74c0c5ec60d120c02578e0c59c432a1604d8c7213dc1e9b978047a5ec2e9f918433d2fe5f45cc250cfcb383d9734d4f3939c9e4b45a0e7a7383d1f6ba8e7e59c9e4b1beaf9694ecfc719eaf9194ecf6522d0f30a4ecf650df5bc92d3f3f1867a5ec5e9b99ca19e9fe5f45c3e023d3fc7e9f904433dafd60157b6832706011ec403afe1e6b9151286f3dcb59ca22b46a0e8751cf8491180afe7c02b4500fe3c075e3902f017b8d6cc366dcd1739e42aa6c81bb8054055c305c0460ef86443e04ddcdcb19ae1dc7133a7e4eaa64adec2595d8d08ac6e2b075e3302f06d9c4e6a99ea643b47bb7604b47770e07522007f8903af1b01f8cb5cb7a967d86d5ee15ab2be694bbeca516e6048f9358e728e29e59d5c13368ca0095fe7c04f8900fc0d4e278d4c75f22647bb7104b4dfe2c09b4400fe36a793534d75f20e67daa7199af6bb1ce5d34d29bfc7219f618afc3e87dcd4147917a7e666866adecdad63ce345cc77cc0316e6ec8780fa7e4b34c95bc97eb826747d0053fe4965ee7182ebd3ee258b78880f5c71ceb9686acf771ac5b45c0fa131db8730f7d10d63379e04f39db6b636a7b9f71c86d4d91f76b9073ceb58347e99796bb8b917645dcab2ca2fd3eb49dae752da229e753cd7313997e69d98425f7a1e601ae8ddb9bb6f1e73a64d9c61d8218bcd40603fc05d7ffcf33ecff07395d9c6faa8b2f39e48ea6c85f71c89d4c91bfe6903b9b227fa34396b7087409d2803eb7087ccb59465743cbf88e637c8121e3ef39c6dd0c191fe218773764fc03c7b88721e31f39c63d0d19ffc431ee65c8f8678e716f43c6bf708cfb1832fe9563dcd790f16f1ce30b0d191fe618f73364fc3bc7b8bf21e33f38bf7991a9dffc93d3c5c586baf88bd3c500435dfccd311e68c8f81f8ef12043c6ff728c071b32964773b48c871832b674c092f15043c6318ef13043c6718ef17043c6098ef10843c6498ef14843c6591ce351868c0be9809d0bf44dbd50610ef95253e4223a64b9fe1e1dc1fabb28073e2602f0621cf8d808c08b730a1f67aaf06338dae323a05d82a37d9929ed923a6479107942904ee37310b9144739d794f2b13a6479287b6210ca6d79e0d29c2e2619eae2381db0dc849d1c04d86713b60cc7788a21e3b29c354f8dc09a8fe7c0a745005e8eb3bbcb4dedae3cd78a5718b6e209dcc075a5e1c07522a7e8ab225074054ed1579b2aba22877c8d29f2493a64f99dcff4209af6f9cea712077cad217065ce366618da4636671b3323b08d2a3a70d92ed70561ed7342a52ac7fafa08589fcce9fa06435d57e358cf8a8075750e7c7604e0353895cc3154494d8ef58d11b0aec581df1401786d4e25371baaa40ec7fa960858d7e5c06f8d00bc1ea792db0c55529f633d3702d60d38f0db2300cfe1547287a14a1aea80e5b5977726ccafbd3c851b79ef321d791be990e5aaff7f41f4e1b3ea6fccb5e2dd11b462134e1ff798eae3540ef95e53e4d374c845ede07d09c89c4121c579f0d3b966bcdfb019cfe0f4f180a93e9a7206322f020369c6e9e341437d9cc9e963bea93e9aeb90e5e7830f05a1ecf3f9e0591c709e21f0d99c9217182af91c8ef1c3868c5b70c08f1802b7e454b1d05015ad74c07227e1d120c03e3b09ad39c68f19326ec3e9f871431db7e580171902b7e354b1d85015e7722eee89085c5c7b8ef51243d61d38d64b23607d1ee73f9799facff339e4274d913b72c84f992277e290979b2277e6909f3645eec2213f638adc95435e618a7c0187bcd214b91b87bcca14b93b87fcac29720f0ef93953e49e3a64b9ddb63a884ff2d96eebc501af3104eecde962ada92efa7094d71952eecb01af3704be90037ede10b81f07fc8221707faef55e346dbd8b74c872f9bf2108659f7d828bb9d1756304a3eb004e1f9b4cf53190a3bd3902da8374e092cc9620caf6d9961ecc19de5643c31bc2016f33041ecab5e076d3161cc6297987a1928773ba78c950172338e0970d8147724a7ec554c9a3b86ef26a04dde412ae055f336cc14b397dec34d5c768ae095f376cc2311cf01b86c063b9167c3382161cc781bf1501f8780efced08c02fd381cb97ecef04d1b7cf4bf6099c51bf6b68d4b99c3ade8b401d13b91ef3be698f99c421ef32459ecc21ef36459ec24d963e309c2c4de5da704f046d388d33e9bd86267d3967d21f1a9af4159c3a3e8a401d5772e6f1b1a9795cc521ef3345be5a872cf7c03e09a2699f3db06b74c0f227c33e4d18fe64d8744e199f992ae35a1db2dc1fdd1f44193efba33338ca074c29cfe4daef73c3f6bb8eeb825f1876c1eb395d1c34d5c50d1cf297a6c8b3b8b9d2578673a5d91cf0d786c073385d7c63aa8b1b39e46f4d916fe290bf3345be9973fbdf47e0f66fd181cb730b8712e6e7166ee598ff1001f3db38e63f46c07c2ec7fca70898dfce81ff1c01f81d1cf82f1180dfc981ff1a01f85d5c0ffacdb407fd8f433e6c8a7cb70e59d6f1f7202ed0e7ba8d7b38ca7f9852be9743fed314f93ece3afe8ac03aeee7c0ff8e00fc010efc9f08c0e771e0ff4600fe20e70545d2dc0bcee798cb3853e60f71e0b108c0f338238f270d8d7c01879c30457e986bca64044df908079e1501f8420d784e7b6927ddc591bcebc48bdcc64e9b24063b38f2ee903176da10e79e90d136dae00cb79814b2e957d1e8c1d1854574e1dc665238296f332997af86997870f7943caa6b22a9c5227ed4683349568c80c73801452312f0386764c52230b2451c78f108c01773aa392622d53cc10928119180259c8092110958ca39be52a68e6f1937121c1bc148f024075e3a02f0a7389d1c67aa93e51ced3211d07e9aa35dd694f6333a64b9a97a7cd26c537505b7d7502e08b0cf5ec34a0eb8bc21f02a4ec927982af9590ef94453e4e73865543054c66a0eb8a221f01a0ef82443e0b51c702543e0751c706543e0f51c70b621f0f39cbd5531b5b71774c8f29bf1aa4128b7e5815fd401cb73d3270701f63937bd8103ae6608bc9153727553256fd221b7b183358250963fa7c5006fe628d734a5bc8543ae658abc9543ae6d8abc4d872cf3d709a2669f770edb39e0ba86c03b38e07a86c02f719397fac9082e22e75ab081690bbec2d1ce8980f6ab1c78c308c05fe3a65da70469499f69d74e1db07c63df2808b0cfabfdd73975348e401d6f7026d2c4d444dee4904f35457e8b1bbd4f331cbddfe6804f37047e87b38d330c6de35dce369a46601bef71e0cd22007f9f53c999862ad9c5b16e1e01ebdd3a70e914ce0ac2dae7dee60f38d66747c07a0fa7eb730c75bd9763dd2202d61f72ba6e69a8eb8f38d6ad2260fd31a7ebd686badec7b16e1301eb4f385db735d4f5a71ceb7611b0fe8cd3f5b986badecfb16e1f01eb031ceb0e86ac3fd7014b22e70501f679c3fa0537949f6f3a941fe4903b9a227fa9433ecd0e760aa28c387f2ced2b0eb8b321f0d79c2eba98eae21b0eb9ab29f2b7dc6cfa8220caf0994d7fc701773304fe9eebdadd23e8da8738f01e1180ffc0b5624fd356fc91731cbd0c1dc74f1ce5dea6947fd62137b7837decb893349ad66abb3b3f65ff85a3ded794faafdc5ec28541b4edb397f01b677dfd22b0bec31c78ff08c07fe7c02f8a00fc0fae252f366dc93fb91dce01415ad26787f32f6e8a303008b0df15dc9ca20745a0e87f38450f3655f4bf1cf210536479f647bbe41f1a44d33e4b7e8b031e66081cd301cb261f6e681b710e7884217082031e69089cd4014b6b1e15813567e9c09d3bb34d6dae1047fbd2086817e6c04747005e84031f13017851ce4cc61a9a49318ef5b8085817d781cbf9e7f820ac7d56cec770ac2f8b8075094ed7130c755d92639d1b01eb529cae271aeafa588ef5a4085897e6743dd950d7c771aca744c0ba0ca7eba986ba2ecbb19e1601ebe3395d5f6ea8eb721ceb2b22605d9e637da521eb1338d65745c0fa441db81cf6ae0ec2da671d5381637d4d04ac2b72e0d323003f8903bf3602f04a3a7039219991349c9054e668cf8c80763647fb3a53da5538dad74740bb2a077e4304e027733a9965aa936a1cedd911d0aece81cf8900bc860ebc981dbc31883b29c103d7e458df1401eb5a5c4bde6cda92b539daff5f7b67011fc5f1feffc15a5a684ba943bdb4a4b44592607512b40d8542a05e1a92105202499360956fdddddddddddddddd4bddddf5bf337bcb7eeeb293dce5eeb37926bf7f791572b9bdb999f73e3bf2e8b139e8763f5be3c7e5a0f18d6c77f2f82cefe4c6b65e9f90835e6f62bb9327667b27fbdbba7d520eba3dc0d6f8c939687ca0ed4e9e92e59d1c64ebf5a939e875beed4e9e96ed9d2cb075fbf41c74bbd0d6f81939687cb08dc999d9321962ebf65939e8f6505bb7cfceb6dbc3a25ad65be973d211ed66f6dcc36d3ccecd018f4d6d3ccecb96c766361ee767c963731b8f0b72c0630b1b8f0bb3e5b1a58dc74559f2d8cac6e3e21cf0d8dac6e3926c798cb0f1b8344b1e45361e97e58047b18dc7e5d9f21869e37145963c46d9785c99031ea36d3caeca96c7181b8fabb3e431d6c6e39a1cf01867e3716db63cb6b1b57c5db62d6f6b6bf9fa6c5b2eb1b57c43b62d8f8f6a59bb73dc988e7434e3ceb15d54c3dacc76533a0d3763669b606bf8e62c1b9e18d5b046774b3a0d37a336dbded6e35bb3ecf1245bc3b765d9f0649bbcdd9eadbc95da5abe23db96a7d8a6a33b73301d4db5357e570e1adfc1d6f8dd39687c475be3f7e4a0f19d6c6bcbbd59ae2d3bdb1abe2fcb8677b1c9dffdd9cadfaeb62e3f90659777b375f9c16cbbbcbbadcb0f65d9e569b62e3f9c6d97f7b075f9912cbb5c66ebf2a3d97679baade5c7b26db93caae57cefe5e3e9c078cede7085ade127b26cb832a2e101e3bc971df650cc2c2b53bdd68acd1523d5b6de7b65def5ba4dfff713bd16cbbcefd6ed8d30dfa0739ef8ef257fa2f9fc2b4f46d1e99042c7e45d79aa8bcebbd2c75c999b9ed932b2ccb049dfd3d94a5f95ed517c26cb47716654c33a0be8b3e934dc4c16d06a5bc3cf65d9f09e3614cf67896296edeebd90edddabb1b5fc62b62dcfb6c178294b18736cb7efe52c6f5fadadc7af64d9e3baa886f5e6ebd52e39c8676eebf56b59f6baded6ebd773d0eb065bafdfc8b2d78db65ebf99835ecfb5f5faad2c7b3dcff618be9ded6338dfd6e577b2ecf282a886fb792fdfed928187ff45f62f5868ebf97b59f67c6f9b88bc9f0311d9c7d6eb0fb2ecf5beb65e2fca41aff7b3c9df87d9cadfff6c3c3eca92c7feb665e0e32c9781036c2c3ec996c58136169f66c9e2201b8bcfb26471b0adc79f67d9e3436c90bfc816f2a1b62e7f9965970fb375f9ab6cbb7cb8adcb5f67d9e5236c5dfe26db2e1f69ebf2b75976f928db34f75d0ea6b9a36dbdfe3ecb5e1f13d5b0cee8f84397ec333a1e6b43f2630e901c676bfca71c347ebc8df7cf59f23ec1d6f02f59367ca2ed89f935db27e6a4a89657f55efe964e97c7da1b3e39aa61fdf277efafdee96ec4bad8bfe0145bcfffc8b2e7a7da64efcf1cc8de69b6c6ffca41e3a7dbc4e4ef6cc5e48ca896f552fe4f3ab09b59cacf8c6a585728f9379d869ba95072968dc57fd9b2383baae5c1fa5e2d914697ffb3377c8e4d363a2c91833ce6361e1d97c892c779512d6b7d6ca7747834a38f3ddf369d76f61aee9bd270876354a0af9ca22a8c9ed5d7c9ce363f8f33da5aada99ce17dc4d7c98e5b7ce52835cffb8dbe6292f7af7eb7dafca65ef557d3bc3f93cdbb155e8b738d6655b71b7e66a4f76fa009ad50a3bd4f95a9d9e61bfccf86da585f075c6d74c0c9eff8fd2bf04638ad99518cf2fe9fab74beebf0db4b8d0e3a6833b9d5a9dea7aabd7632596b2eb051ef12455d1b74a778df5ded5dbbd0f4afcaf4a5524d50d3d59e8666638262adaaf3fe1ea7b49ebcc668c6f5a7f43b2db7903a32ad41af35baf632efda4cc677a16d7c4b448d6f33ebf8c624ee72d3715679af748f1b8d24ccf1fa3cc3e8e0673733d6d226d76632a68b6c635a326a4c43ad636ada8be411d579efd627e48e35968b6d63e91a35964dad63092c32b5e6d59c36bc3b97d846b454d488366ff588aa2224d23ea628f9cd645497da46b574d4a8fa65304f04e39993e86173b368263dbeccd6e36e513dde5229ebb7fafd1c9d9085b288f9c93ed33737abb5766497db46d63d6a64db5aefc57833964ad3077df94463b1ac33bfd1d71679bfabf57a3e2b41a0dcac85f5e667bba4a5df6a2663bec236e665a2c63c24e56e86ebed08af17f566f56e3a26db0a6d7b276c2b93915c691bc9b2b61529bd914c4e3c47f671a437bed6ec22aeb28d69b9a8318d4e5b225b77b7326d3b93915e6d1b698fa8916e9172f77036c8eefe3537afb4e60e5e631bd7f251e31ad9ccb870f7374aede57da0ccecfff4fd48ed69f228d21d5feb7783d7da46d9336a94f919dcbd312dde3dfbf83219c175b611ac60bb4fb63d4ea55ae0fd76aed9e1e5f239b3b59cc928afb78d72c5a8518e597c16f4fd500acca9a3ccec2cfcdf87af7535a1f95e3ff51a54e63d23e1a92f7575cba6c54cc67a836dac2b458d757833634d26afef95debf6636bae8363219cf8db6f1ac6cdbffb6663c0d89e74d3f77730c737f761fef49619d99ebeb224ee4ad9f396eb28d6a95a851dd9a13894c7d27fc4cea1d0c3caf025d82ae8d95ee3ad89c06a2b57a944ce5ab39891cd722b14ceee3cdb6fbb8aaedbc19c5798a6a34be7fd5e65fdfe36f9ad17634243eaed7dfe657bb5c49e62db611ad1635a26119ac6999ef8da35bcb6434b7da46d3cba68f8aee19ee424acc1d6af0646fa6a19bfd1eb9f577eb36dbf87a478d6fac75fd6eaa1dc8e51ade5ceb998cf676db68574f4736f17c9cbd6c46b796c968eeb08d668da8d16c95966c8ef0e6898ac43c529b13d90cdfc9646c77dac6b6663ada92e4e701c737c5e875eabd6bb7f3dead326b4ff44893dbc8dd1377976d646b458d6cfd9491a5ca5da0ad2a31cf4595f7f3cc1cdd81bb6dfd5cdba6d56959bac698553658ef83f96f82f77378326bcbd9f01edb98d7891a737133f343ae7474e1fdce95b6ee5edb18d78d1ae360eb8cafed4ed3bd8b82b1967863adf2aea837fab5a63361ae3504f7d9c6b15e3a1a824ce4b32d25f27edb28fb448d72a07594d9ea075a37873c60ebfdfa51bd9f6c95b54cf439e958f3e2b4f83d6863b0413a3a9ee6f61c99dec3d6ce180fd946d0379d27ade9ac989e2ece3e3f26bf93abfbf4b06d947951a32c4a6b3e99ac74a568dfd657dee67baa476c23dc301d5d7173929899aeb8b9fbd79a95e051dbb8fab5fe8cd69274c6b9063c661bdf46e9ecc4389643b64df171db98378e1a73a5e27adf3426ac865509ef9aa9e60ca1f5557e1df8dcd85f5b23fb4fd8386d12c5690a9993dd4ba97942d97378d2c6a17f14871ddbf819613f3d4fd9680cb0d93fd359b1c7995d92ac55fb69db4807468d74545a73ff78efe21ab35a079e62762d415c6bf733b6710e4ae7649aba5e179b9136bd7b78da4ce7f7b9b5da3f6b1b637e3aeb78d331866739dd4f7d9d96aef288f9bad4fbb9cefc3ebdd1b54e5ff79c6d7c05364b5473e3f3d7a5f003e9dbb2737bd79eb78daa306a54bbe458326dcf5fa6d7e796c90b362683a3988cb79e7b2725d6545f1b8196aa64ed5f8559abcbcdfc5aa7424d74a6ad8e8c68279371bf681bf790a871efd6ea7197e7788cad6927132e2fd9b80cb569715ac705e7bcdcadb12fdb7a3f2caaf783b296e6f9e679cb9d26fb155bff87db3430d9f57fa6d27be32aefdfe6cec4998ce055db0836cd6c3e49b5b5e34a923ca2e6f775e978dae4621e7dcd36eecd6c3a99ccc73d2e8df3096fa578dd36c2cda346d8bfd5b2a9dff79ffd861cdd9b376c3ddfc2a64d4a476af2bdf939f9699a6ea25bb47f6e53f94ab7c54cc6f5a66d5c5b468d6b67c53b51fbfadd6c340fb9f1f17bcb4664ab7434d8c566acfeb802ed7da9f7bbf4bc3672337fbe6d1bc1d651232848730493139ca3ee43735af8f053998ce11ddb1846448d61baf5799b9a20abf73d852d782f248f30b7efd89edee4fe6542e85d1ba1a2284225ad5a2db077ad59239347978b79f83ddba88ba3469d97965c14a4ccc10b7226c5efdb7a3b3277bd8dd24ab5aeb71fd87a3b2a77bddd3b67bd5d64ebede8a8de6ebd78e56a8d8f63f218269995cdd79ab1d6e50f6da31b938e4ed31e0fdab24e33eea8808f6c231d1b35d2c266ee6326bebdd55ecfb5875daef6871fdb46312e6a1403d25c738bbc6ba24eb7cdd9ddfc4f64d2f74f6c7ddfc67607ec773e5bab7debe5e853db28b64dc73fb0f9516466f16dde97ae35d2f5996d6c25367d78cbe7a6f06908e6b506e301a4dfa968b22b686866a6cb4d6cd7e7b6318e8f1ae3aed631a245ce7e4eccadbf6e66df9809952f6c54b68ba2b24d5a6b727e6254b964d07cfb998cf84bdb8827a4e7b51cee2672e1b51cd55a26a3f9ca369a89b68887f467a5ccc7636b2f93117d6d1bd1f6999d3ba22426fd71e5423e3319f537b6514fca2ceb837dd4e10eb9d2e8407863f9d63696c951639990d59cd2f2ca997edbb95849bfb38dbd343daf30fbec92a957985d9bd29a717d6f1bd794cc74c7e9ad65c9123b5ba5c6b4a5bb53c864843fd84638356a841b34b973a95e1ebc58821f6d3ddd21177a7c7f479d7c3f5ad28ba67342cd64843fd946b8a3ed29b2c74b4e36bb4e3c9da5e6acf0f5a7235b1c65f677ee67dbb8764a27cf857fbf66264631def4acad3c687eb18d64e7a8914ccaf00ef973dd1873b29e6e9a695e1e5b9eef9bff7c6b66c45f6d0476e1cf88dae2313761b328f27e9ae1fda94c9cac7277e2fdcd36c25da346b85d4e46d890f50873716f7fb78d7c379b8523931936f93cecb3b0cfa2f8746432863f6c63d8dd9679a0f9f54c473f6f67b492358918b3d9c6e3a325afc55c49e39fb6f14c4b67ee6c3a1efd9b32b30234a81d0cf7a6eb3367247fd946b24766fbe3686d4b8362695b72f164fd6d1b7b597af13bf6fd71e6f13badb30bfc631bc1745b8c77cb3eb2a931ec726238ffb58db63c9dfb3505fa94edfdc2b63219c17fb61154649a15c8ef77785f9a6620e15830742edac81154daa21232cde2196db59116fbd7c1c661461487e316ef39db3687ec64d342adb93e932cb2c927f8b6cd23dbd146be2a1d7ff9e8392f1d5b619c335d27db1867a6131b9ca985adf92724731b5b675befabb3e97dcb76c0dc9c26bbd87abf6754ef37b2ce70cd9d9972ed07bb84adcfb3a2fabc71abfa9c7bdfd7256dbdae492f27433827e1b33cd2cc8fdae61d1dd793be17532e76685d6d639c6dcb2f97ce18d3cb66d0ba91b67ed65aca36d63951631d97e6583389d98af7de2e6d1b6f6d3abe04b6796e24681b9a1f5ff27bf8b94c46d1cd368a3a9b9fb25d0f38c9f4614e845ea4b951b5b6e7dd6d3ddfcb16bd60efb9cec4ad7b5eaea2632c18fd5fc6d6ff7a8ef76d736368dd0cbeac6d040d99798aa7ab894b67ddccc51e7339dbb81a6d39aab21b577a6b6b2e46d6c336b2b9cd479547e9cac79833749dd76b3d2b0799098b123be8746d3199c767e582c3f2360ef3a238540be5906edecdec79f5b4f19a1fc56b5dd592e622b0ec05d1b9c93d0c7e9f490f57b0f570413a79e5826fcc245348746cb16d4caddf57ad681bd9425bc68cdcd93ee67a63a95041c6db5af3896cbdc3a658dacc564657b271dadbe6259d3d271c0b77e65ed936ba7da246b7534e465715b31464c263151b8f7d33b38be5ea6eb7e69eae6a1bc37e5163d823ad7d4674945954558cf4ed2ecdb5c193f8d56c74fe1745a754249dec29f4b251d8df16b5989b1a2c7263877bdb881c908ba766722c72c17b6a56b7d13930174f4d3c74b2a7b0868dc241b6cc6ad9f90405369c2a15785064673b68cd98d7b48df9609bff7c76631eadfc68a3b6f3045dcb36e24332f35e68dddc18eda96bb7a2e5f66eaf6d1bfba136afb75c8edd7eefd3b522664f601d1b81c36c19c2328f0a9630ce756de33c3c337ffce67c6cd391e55c680cd7b38de5085b8c48e66349f79ee5c60ad0c736a2235baf03cd2c5e2dfd35379371ad6f1bd751dcb95582cff706b6b11f9d9e65323acb624b15189a9b519a93dbd66592ec6b1be3319965ae8ace169f898f416be6c43c5bef8fb5f90347ed75b633b2365fe9c89b594977cc97c20926a6ba799fd8a87aa7fa6afbde6ae2628f9c7a4f26eabc763219f986b6911f1735f24ceaa3fa994f722f69fd6c3d3e3e9d6896a88a1fac9e6e64ebe909513deda39af72d62f572635b2f4f8ceae5faaa255d3cab9f9bd8fa79523afd6cea0fc0ea677f5b3f4fceec896a39deb169b695d6eda206d87a7c4aae7bdc9c1f5c263d1e68ebf1a9513db6d78bb0d5aaf6e7eba6ef3698fe4e54c9f5c56df61a6e8daa413606a7453168294becb8c46e7181f744cf68322a5b96d46c32702de9fde9d0a19bf7e32873a5aeb534d1acdd3ee9015aa560760afe3ad77fb18f68ff242fd1f0f7fadb677b3dd2f37ba90a329f6dacd66ea185d33d604b7454fe7f7d3b68d88d89dbd861460a37ff9335a6e5b05283b6d286151db5ddb6bfb773a9369fdac3bb57bb787f5a1a4594dfaefe6dd4e85a1ed36ede1f7d95f69e2d374fa4b63b4ef72466c9c48882b63cd25a61d5ee467a86beab7989bbda71800ea737fe95ad91a6967b71a6feb64ed132b44a13b2b8b644f5dd6f60bbc45eb0c3f2de8b69806d4ee2e8536b9a1c9798665afc567c5aa3be7513d3403083b5d81c862d4435b79a1135ff9852affc30903edd955ab24bc781fa6e9cc544b6ba41364d0d5c3cbb213ab4bc8d353bc10a23e7f55ea3f94e801c382004793613e49ade8b60f92e3687df60e91ba11acc77680a9316bb514e483891d59b43581aa31700b370bb10e6394c98bd92a432c81438c9fba924c99f2e352ed405881f4c08219e2bf3d11ee404c82b3608419ec704b94a12c8284d998b0ff3156785f8ce67e25b2e099fdeeceb2e542536431a9b0bb8beef15e2ba80896b0583cb8f500bf20c96283fbfa0ae7f569ed809363881ed986d436c17c6b7648c69574bc6d7b0ee5ec496bd601393ba6dae4ef864eeed0cb62b60137d3113db8a49b257643e58e1499fbf18d426a99e5d003770eb10dc2571acac83609fe7feca3af19c10dfa54c7caba9a6dbe4626fce2b757ec69b382944781913e11206a1feb89f09c405389de1f1bc9c09a7a7c2336d9949f6e23f963a15cc086f86f3cdca2e40eb3e3e8476051b5aea43195a6b271b496b7464267b655108ed4a26b495ad92a68dc595267182ee7e1078e702bc89207157b1b71fd1aaa7c9aadcfcac5f8d7646f9f90680bb9a096e5515a52f9e6094dab506a43e6a152702bdab9c593dbb9e1802bc860970dd4880c526b252fb16a192096531d53bc905a879178750af95a9b72b7002e4d7fd4290d7c5b73d0e6cd5ed617b7ccec410e1f54c844b1a841888e6029e176e0df1dcc0c4d3c3e029365b92f1e6619cdbe4217501d8df8f86c06e6402eb6a8069a7db19892f9fe904a055cf0f01ddc404d4dbba2509d549e119c23539fbfdd810e3cd4c8c6b29542cf953bf5f5449bb29cc3313bdfb8aa673ce0b71de129f9eaebd58c0ba9e1de2bb95896f69159874fc62c98d466bb2d009483b9684906ee3dbbdfcdd5a90072130e08c32f3a0bf5f736387760f986c6e675b5783c3bfbba69a0a30d5dc11c7c230b05d2f0c7dce0d71dec9b6bab6a4b7d3c1163a89dcc244d086366abb00f1145043dd159f7f497bb182cd84d5f56e26be6e06df28e3741b5827dcf1f4d48edb01a67be2da8468d79b603d7501d2eab009b997af326a4ee7e6aa2967ecc721c2fb980897499acdf4daea9aab57e97221aafbe3b3afa2e12679fa7701da13f0883e10d786d7ddf3c102733e58b24b4ae3a39b34dedae092cc18dbc36034ee519e2cd699df362a3fa17d52588cb74f92d7f30731ac25af994d425e9a612379691cb5f232f0a0cb6b61a6cc4bc371362f2b27ef6c3e5d90d5a7f3bd4fa77adee465e4469797819f6c9e75ef936755cde4a53d39a75e697793c9cbd8cd21afd507acbc8cbc02f2b20e5fc94b635ececb40c793d76a87ded44fa61f3d92d74a8b61eae7d275c4cbcb42db9fd72ae785bc56c432849f495ffb9bfa3de99c6953bf27bdcf64afcfc9cb81b1202fd2b0959733ff88bc08436c5e5ad6c7bcb4fdd1f25a79f809e393715b10c6150fd4f1c90ffd1f0f1d1ea843871fd610ceefe243f077ca8fb04312f53df723c5e7a81a957eacfd343524b53fab37e9cf2493bc5fdf21fd7dc17e39aa674b25eda89f4b67b0add9556fd8293c843cca57d9d59a8ff810f5a392818b53ee608e62c12c5321ccc7f86e78c9728a0da656f71cd6d4d12977385762e1dc0f64f3714938873b89f361c0f984249c839cc439b76388f3494938f39dc4791fe07c4a12ce022771be07389f9684b3d0499c3d60ee7c4612cec14ee2ec0f389f9584738893382703cee724e11cea24ce72c0f97c1c38abac40b1fb7adf493c627667e1bcbd4388f3054938873989f342c0f9a2249c839dc4b90de07c4912ce422771e603ce9725e11cea24ce8301e72b92700e7112e79e80f3554938073989f36615e27c4d12ce0227712e03d2f9ba249cf94ee27c13a4f38d38bc916d3093731953d5738b680b51e710e69b92603649aaea00ccff01ccb724c16c92c6d201986301e6db92600e7410e66880f90e3ff1b4ef63a1fd3ffc5f3798dfd519ff36fd1b1ac05e2c80cfc11afe2e3bff4f73d298bcbb1cec20ca4bc084f19e1494054ea2ec051acdf7a5a0cc7712e58f20951f484139d849940781542e9282b2d04994d300e58752500e7512e5f380f2232928873889f23a40f9b11494c39d44391c36e69f484139cc4994eb02ca4f9928574aa02c57be3b766324ca21de92338d7958ecc202390ab6429ff1533cd965124bf061413122d43216d43b60cefc9cad04f62332f4259312ced7258644b5f9b969055f1acebe2c9c3a5225c0f9451c0ffb50efff4a13eca2bbaa3bec17bf735db1f10d80fc328e649e76e3042adaf071276a2f7bb0b0de0358bf8aaba68c96c2aa44f0560c3249d356fe06f0bee667adf4e155b79b47fa1dc0f70d7b6ed4ab73adf7169656d7cb8b6ea4d4e00c62d36820976581dc05407e1bc7e6bcc6bba8c6c862734adfa10ecae477b039ff2e0e1bb86d738ecd69980399389764e1dc0ab6e8df3371aea1d28d9c4cdd53ea13b97bfbca9900f607a960873908767700fba354b044b5070dec5400fb9354b0850e829d0c607f960a96b878d1c0ee0a607f910a96e8194703bb1380fd552a58e2699e06761b00fb9b54b044ad280dec5800fbbb54b044bf4e1ad88900f60fa960893e9e34b0e301ec9f6d69b04b3dc8ba77889d0128ff62a2d4aee8a149c4d74a59328ae60edba62c6cfd5488ed6f26b66555980daccce08b4933fa1f0bdddb80ee1f1909a7a236482e1e43cf01fbe6bf71d8915a469becb85dc05c6efee948c2fa12e84dff9388951aa941c37a3860d50b9c38ac839cc4ba2360edc0c41a24c8b569f983915237469d3a90303e0acb544726c660851fd86e56f807005d2726ba206a283d3b1335e89fb6412f87a097ce9260ba68b2ab00985d24c124eae66930cb00e612926012b7ee3498d301e692926012b7403498d30066574930895a4c1acc3d00e65292601275ed34983b01cca525c1745177b92bc0ec260926d1378406b3126076970493e8c14483590b309761c26cd94011466f50ad93c358288b40a7b92c136550352593b45244a0b4d43dab83c56739694089cb100de8da00b48734a0c4ed3b0de84000babc34a0c42d3c0de80800da93ad120e8dbc454a8725e8ca42ed23de6d6d15625c818971dd88553d3dcb654c215bb42a2f2520a92b321167671c76d1f9fb46d848adc444bb94f742977c6bf4dad37ffba5e768c0a6b0800d85c77de5b6dcc4275b255d4c7db615c8de2a71d824b5bb4c18291cbc1d93618d76ac7c0e2472d538cee8da26599b525d3034ebba1da179399cd1578bc3fdc0becbc406635ac10f6661ed0e587bc521a336a8c91b77aaba98974ea54b08b3b7249844c9a4c1ec0330579704937846a7c15c1f60ae210926f17c4e83d91760ae290926d12d8106734380b99624982ee6f3ea0730d7960493e8ca4583b931c05c47124c179359f40798eb4a8249d40dd1600e0098eb49824934fed2600e02987d983083b453f9e624eea7fd715dc5b1371c1fd78fc3f66393c4a685948733a5915670713790c60da40125ce9534a0bb00d0bed28012cfe534a0a301689e34a044ad110d683100dd501a50178bd66e0340fb49034ad41ed1808e03a01b49034a3ca7d3809600d08da501256a916840b705a09b48034a3cafd3809602d0fed28012b549bcc2f40074808cf0e95285593da8c92769993d1eeb1c621d1847dcaf7655986d7c8c623abbd33c8c16c2d97d10135d0f40a71bf11db462c2477ba08701be7c26be3e2a35d3f11c35c3bb7c9a9aea5129f69a1ba9b6f5ba3ecec8655593077bdce2eb89a7a34758f911aac0c5b0200ef5dc60efffa055d79d6686808c16c6e113975e94908ba18047a810e560591b22aade9d367f1e052bf71069405dd4741e0940874a03eaa2a6732e001d260da88b9ace46003a5c1a5017359dfb01d04da5017551d3b92f00dd4c1a5017359d0701d0cda5017551d3790000dd421a5017359d8701d02da5017551d3792800dd2a0e95dcc076a3921b01e7f5ad65c453961a98fa4c3fc334379b7b7ebf97a5472a033dd20826da6ede8b990659857998eb4d8c5015733b442bc9d85585d08ada029a8b752c970468c56dab74f39b72379b4c6f980f47c611c23fd0fc1dfc3bc67b2b08881ea97490f47403b3c8fb6986f7a7d274b4c25c5b6fae756fb52e00c4a3e258ad0bdacd6a5d02e846b765c439ca26b5f64ad72e249457c29e710c13654f8566dcc4d6c018cd5c77c53e1e969db1713b18d86c3d181e9dcf5460d002a497805c08e32462a5d6bea061bd01b6e3db30b106c5e8079a8d5299d76a6017f7ade4313df6340798876111da96bd7eeb045165de97fb1f4a7633700f5d5f98314be2d8fae4b79badcf012075e399e87ab5302b865dc7399178d6a1554ebf02169aede2d84d0e34ee58e5a6033af1ce3873fa8e714ea4b9bd5c05d23981bd9bac37f034b87a35c164d01a63e6c9e926fd983f47d21056b0106e0573e34426c2a0f87cba5af1614eeac44f80877b7b4938dd74a67e16704e9284739093388f87cdf8644938f39dc4f910e02c9584b3c0499cdf01ce299270ba699e5d15e6cea992700e7612e720c0b983249c439cc4b903e0dc5112cea14ee2ac059c3bc5e1dc3230610aabf32e2bf33e5069ded6dd1edf2e141ff7c3d1726726d0de00549b2734ba62a36aab4f004d56bfc56083a429e23600a8bbc461fd19681efc8a249d512c7249d31e5501c25d990875baf079de9b0ddedb23bd5f2de0a60b6f60011bad4260bb3181e5452c34d1ae56faf1d65f53eb7d70920ab54aa90f3a51bb49cbce7e2e2c44bbb7a5534cd8757d5a773131ee2520b9d398285bcafe965a7e9be8fdbb8805734b703cd843124ce26e930673538059260926d1424e833914604e97049318354183990f30cb25c1243a6bd160760198159260125dac69303b01cc4a4930895b231acc0e00738624982e5601fa0fb6ec55926012b31dd060168364ce94049398e980067304c0ac6e4b98c91116d4c79c16637131c0dc53124ce20244837939c09c250926716b44837905c0ac910493b869a7c13c06f20fce8ec3e13a4857b667330a38178b7c9d09dba23952627451419caf461ad7191a5a4d80e338030f7c6d5b0654252b895d2cf8753a38cdd4494159e024ca15e081df4b0aca7c27513e0052592f05e56027512e04a96c9082d2cde288db02ca462928873a89f2714039570aca214ea2bc0450ce9382925abf82867213d857ce9782729893285706940bd8ae5a7eac64a5f9980ea69ae2b55d91f85d89f73bdd380de12816c2012a44b8308eb0d342d55ec24e278397dbde716884f4835aabe61919d41faf000eae4749de0c30f761c2f4f3ff97ab994a9b1d66a9d10964dae3ad3641c53d7c7bc163bc6f1c8921aad2b2e9a04b2bd15383963deb47c0ba5f5baed5d81cb5360a2d23ccf370dafe1f136577959abd2d86079be64add192470ff381eec4053eeafd1e3541886df9ef4e6a7c179e680381eecb05e4af3458bdd4379126cc20f8cc3773d2a2dde24d3191d22a5b7471529468809299b2697c3536e828dd2416dbbd263f7634a78f2560712d62301ebc17118d21abd454a1f1a83c24953bccee82081e0df22ef62bd8ccdf3aeaa35724cb6feacce92d8f560e53f847dc42c6f262acdbd87bd1156ff43db76ff894e0744372d9acbc1f1b04c1d16c7693dbd7993ba99efce827939c8e5e1926012259306f3328079842498c440151acc9301e691926012b7f63498c701cca324c12406f7d1609e09308f96049318dc4783793ac03c46124ca29f300de6a100f35849308907491acc4300e671926012fd8469308f0698c74b82493c87d3601e06304f880366b98ace7a909acdc8c5ea910703cc1325c174b1b6e94900f324195eece353bc3dc80155342785a160e838592ada7c27d1ae001aa553e2d0c4b78c36399eb2803919fcc3aa8d760f603d5522d67c27b1ce06aca749c44a8db1a4619d0a584fe7fb2df956cf7966de9cab6273fba2adfc9b80d9ed8c38dd1bb4fccd573b286d10d6a6b8f6e5de701e48e5994cac2baae677a7c148a927a64e2ca3f03f209d673131aea5a29c6f32d99bbab77d5a1564f46cc9705ddc9bbe09dbfe7324c3256aa56870c743f4fab992e112e75c1adc67615a388f09b75fc4d2e5bbe24c5623d5b65ea7b5dfe86cefdb6a0d5e3d106fbfa77c17b25af86994d21e27fa8ba8c82f62213f1f96b9f3d96134618df4f654eff2181522bca02dd581d81cb9a00e0d6621388c5d280926d1ec4c833918605e240926d1218206331f605e2c0926d1558706b300605e220926710da7c11c00302f950493b8c1a7c11c04302f9304937814a5c1dc04605e2e092651694283d91f605e210926d1f196067308c0bc52124c17e33b8702ccab9830975151656e7580c2de8a18e3b13b0bdc662a047735135c50640c8b388d4b68927c8d918fb042c5101f47b328dd0838af61e25c230267724dacc92aac673dda608e01ec429631a41f6889ae65825d57b5d693048310898a0f5a32965d600ebd8e89b86f04e264dde738353ba19a1b977827fccd48afe1f9e653b5de6f2ab826921a963cef09b0af67c25e1e260a3de336a8ed8dedbe219e098136d37e0213c20d4c804139c73086bee5a4042e46d2df00a68f1ba50175b138596fb082de240da88b7e2597c19c79b334a0444d130de832f0c8df220da88b290167c2237f2b136857959a66a881878b96e0aa8b0a71dd16b77b78fa892f8886375ada8b51f068df1e8776c916b994bc8a53c318688ff57500f30e49305ddc163d0330ef9404d3c505e77980799724982e6e875e0598774b82e9e271f23580798f24984467051acc3700e6bd926012f59c34986f01ccfb24c124ee336930df0198f74b82493409d360be07301f9004936812a6c1fc00603e2823e4b054614240aa95889614701dc0fa1013abb61ccc338a8d1a63f399eb5da2551d45de4f33bc3f5ae9116276cf80b18d0a413ecc04b94edaf239de746da6c9671b3838541a1508f1d47e0e0b700528e31e910e987892a701de13003f2a1d30f1744f037c12007e4c3a60e2899f06f81400fcb874c0442d000df072b05b78423a60a2668006b827007e523a60e27e9706784500fc9474c0440d020d7011007e5a3a60a2568106f87e00fc8c74c0444d030df00300f8d938ccd8c93548462bdf9d626c923fc03815ba58d0bdfc78261915a27d8eedd7ef1769d197a4baf6d2c0d11219ac01e09e67820b6a37a4175de262a4e8dd80f28538bca46c5ad9a6c9368732e74b9ae66b4dc860f2a234a0c4159e06f43f58805e9206d4c594b05f01d097a501753161f1e700f4156940899a2b1ad01f00e8abd2801275ad34a05f03d0d7a401256e9b68407f01a0af4b034ad4a5d280fe0440df900694a879a201fd1780be290d2851574a03fa27007dab2dfd57920f9dc39ccc0fd100a7a4b725c174313fc45c80f98e24982e66c8ab0598ef4a82e96286bcbd00e67b9260ba98216f4f80f9be24982eea3d6703cc0f24c1743143de1e00739124982e66c8ab02981f4a82e96286bc5d01e6479260ba98216f7780f931fb48a90ba2d77a6f690be54463b9acf3bad360be4157b59964ac983a8eb9c4fb5b7f150de8b2b4795385403f61024dcd76af2f0ed267a12d1dbf241c8e9b194aeae0bcfea964b82e068def01703f930cd7c5b8e70500f773265c5d0f3535d186ee6e357336a529e8bac36cfa45dc0937a25dc18a556a990baa2bf9732cb4df4272a22f996897f65ee8477aba47a0ca7cd8f755a221a3e528e909d2f81513d9f296cd929f16d3ddcdd13400f8357b16d4e81a54252c29c5dee52e3a159600b66f98d8f2329805e79aafd173213ac596aae48851a221630a0bf75b1064f32d1377906238dd32ead4f200b442ea377408717e270927559744c37906e0fc5e12cec14ee21c05387f9084b3d0499ceb01ce1f25e1a47acdd170ee07387f92847388933877069c3f4bc249cd3f46c3798d0a71fe220967819338bf059cbf4ac299ef24ce2701e76f727547c413124d77540e56a3df9968974ba02d48011c43f1d3b12c78c5a078fb8309af77da7239c1fbf09eca37c251435affe9c80ad102fdfa9f12a1121f731ad43500ea5f12a112fde768508f05edd2df12a1123d3c69508f01a8ff48844af4a7a3419d0150ff950895e8f149835a0950ff930895b8d5a7415d0fa0aaae02a1125d166850d705a81d2442257a30d1a09e0f9bff8e12a1123d976850cf03a89de2801a782e691ba82ef057a49a8f8f733102fe3578fc3b33a1ea4c36e54995407567e7a94aaeb59e066ebe0ac17561825b5185d995662b3f4115facf4d8b434d42737af80e74f54b3031e6dee981b8d9a7393d3c038ffb924cdc2de55f4a368bb858afe12b90dcae4c9481e239588e1a130f7e7ac9dc898b122d99fb9ea0915a8a89b66f0ada79898adf152945abdb33ec2700f6d22ec1261e0c68b07f05d8dd5c824d3cdad260f702fb557726ecae06b6be7c940a7235bab7a3ad5521ae6598b8b4b92f2893ee7fc8fdc496bd00deb24c788155dfb6b1c2e6a699c2962ec6256f0a67fde5d88f6e18b650e25d58c5c3450b59581ea4af071397fe227fe9f0cf44133c128d89c737085f2096fca559eb370580cbc7712eb2b9e4243fbe2ea661b9071edd9eec65649a99e3b40ac497bd98d42134783d01de0a4c78da1f2b80365ef95a257ac4513e0bdb20787c578c438b146cab712ef433c5ff5f2861f5179c625692b5d971310bd86878e857e6e3ac351ff125536fb65337dfc9473f1ace935838a7c364b00a1367fa1516536def2efade4d82d3f4aa12b1e63b89f52e984b579388955a669586b50ab0f66262d5ea98a627a252b307ad52babc09e6bea1812c63cda69bc36cda9b09b25fcad64a670bb1eb27d335d211951f3423dd8f20bbab339107a9afd2dd5eb9781cfd01e4770d49305dcc0afa13c05c53124c17b3827e0130d79204d3c5aca0df03ccb525c17451fbfe19c05c47124c17b3827e0e30d79504d3c5aca09f00ccf524c174312be8a700b38f24982ed645f80760ae2f09a68b1ad17f01e606ecd3fb3463689be6bdd4dec88167723b71af05907d99207ba8d04b39b4a7c7848f6657bf16f0e5c561cb1c68fc3bfd566382d7a90309de43006fc3b6b5a9fb4dd518a8c473f730961c1e0b1aa17e71cc8783dbe97cf815c8e4464c90416dad4c520311b73db4f42bbf8217fcc6d28012b73e34a0bf01d04da40125aad968407f04a0fda50125aada68407f02a003a401259a2868407f06a003a501256e9768407f01a083a40125aadd6840bf04a0f9d28012556f34a05f03d002694089260b1ad06f0068a134a02ee655fc01800e66025dd600ad3169fc1b2180aad8fb5b1f3a69e82e62a1ab5321ba2171b874052e33da3166be01e713695f958b5686d8f5a14cacba0048545d0e3f55c542be9f3c2dcc653048e63089ce86d42326cdd950816bec708958f39dc47a33683d37958895ea7744c3ba3360dd8c9df24763d55f3c43d5806943c7a1d3c07561cd9e0a66cfcddbd2a0115b7ad4452c94bfc35abe451c060d6d586b506105c2f189dda5eb068dc3619bbea58c4c73934d6542df1d9bbad31cd39904f56390cead244225aa3c68503f05a85b33a1ae150175aac7a3d8eb7685719a09fe2df22ed758e7a96a7366aa67bb72d11c15e6c00e748464b8c4e98006b71ae01649864bd433d1e01e04708b25c3256a456970f707b823d93b56dc5e851e23a38d0aa5c6a852cad52c136d5cc743492b6a3a53852847c591eeaf7572eaa2946e0e07d2d171a41308f4a5b3171f02da939e744bd8688d91a1362955c95199c4858a964d6e3bc03a360e57da4109575a6d1a5918d74195e6c2f8341c54c7b133db340dc8261785de89856d382c3bdbc85d76889e76b46567266c8eb66d4b75de488371baf2fd93892ae5ae5d4828af8215bc846f2cb6a9948999e7966649614778c0c7c71137a49795da44e2fd7a832de4e0ba36746d5864b68b03a63de40083b0063b19d1f60a3cd41324c17431a2ed75803951124c17737aec0630b79704d3c59c1ef301e62449305dcce9b131c09c2c09a68b393d0600cc5249305dcce9b101c09c2209a68b393d3604985325c17431a7c75a00730749305dcce9b11ec0dc316ee5af0de60873d4f4b598d4f082835958bb83ae68278958f39dc4fa19643ede592256aad99786f524c0ba4b5b56799b1297318d160673a00a51eeca76546c0027af20e840dbcb7523be098d1e7a4093c95200b95b1ce6b3421554bd9aab62d36cd2cc6707816673f7b8ed40b614bc3af96e9d79f4836262c447fc3916da7361b69c16474d36ed8beca7869e96528d0d53454f3269f9b5896d428ab63e308010a7019a1c6f0472bc471cbe1eb6153fb578f330e6769f56b36d1f704a28938473b89338ef039cd325e1a47a25d37036c0cc5a2e0967be93382f059c159270527330d0703e07382b25e12c7412e7923077ce908493aac8a3e1dc08705649c239c4499cdb03ce9992700e7512e76e80b39a8953fb5d95279d91469ba3a87bbe490b55886c4f36b279de9b0ddedb451e8519de1f7d7ca4216b6021db0f90cd8ae3a14d37a9cf70273321de0867ef1a4938873989f34cc0395b124eaaeb0c0de768c0394712ce422771f6019cb592700e7512e7ff00679d249c439cc4b91be0dc4b124e6a4a1f1aceeb60a3542f09a79b29a3ff049c0d927052f378d1703e0f381b993857f05ef886327d89eea86f00d66633df7e4eaf6a4d0b3fdd0820ce6dcb68b5e4d992e8f14e3b895f078adf79525052336dd35016801e68be1494f94ea2548072811494d490161aca4300e54229280b9d44391d50ee2d05e5502751be0328f79182728893286f0394fb4a4139dc4994733a8728f7938272989328d70794ff63a2ec1381325d1fcd64ef76a2ed9196c4fc1488c5d83fcef4fa7e07748783627836f975316d543548ef01ec537a547afd116a6ae267ba973b2d4bdcae2a84782013625e0653c05cf3357a2298a4c2bc48c90a9169cc44005358b85f817dc0414cdcdd948ece58e85d5eeebc26290f64f4e038e64fbb76131399270709d2b0f660617d09b01ec296453d7b5679ffbb2e8b1b00b443e3cefe9a7e580b356f312db0e53cd8281d16c7d63ed8285537ab3226ee39699ba31761a1393c0e8b50b98a8ea8c4e67cb974314a7d3868e08f60d7552f371987833912b74054afb87358f066c19c79641ceb37c6ab4df42ed70d8e4bcc9dd50903dbdedefb152a86c8349a4beb4d80f52819a7f7a989ad916e2a3f3124dc261117a5dd59988f8499f4e8b6d43725cfa42e66a1391566d163e24a1d39d3f8ad57a81a337ba232c4edd4911fc1e37f2c7b490a665594ce18e0d152e99e02f08e63c3d3a32e330b924e9c3bdfc0ab5d9c378106ef1616bcfd01def13242fbc79bd8f34ad37899b98eeae9d19785f65a586c4e8863864c6fdb3ec4c9ac9ba782cfe6899260ba9875f33480799224982e66dd3c19609e2c09a68b59374f0198a74882e962d6cd1301e6a99260ba78de3909609e2609a68b59378f0598a74b82e9a23ef33880798624982ed61d381d609e2909a68b75072e029867b5adbacd6fca2f72435ccb69a9cb46c361f26c26cad554e6316bc4079d1617b424e82fcf910694f8b0d3807605a0e74a03ea62e4dadf307b9e270d28f1704903da0924f47c6940894a391ad0ce00f4026940898a391ad02e00f44269405dcca0fd3bcca11749034a3c6cd280fe01402f960694b8b1e785fb03d04ba401252aea6840ff02a097b243096c49f31b5589aa340d357a57b8e790304185102f63425c57b5d62c1c93cbf62816e249b0d65f1e87a669a0d136a13be2d4c5092a6272a0a1f9cf9d030ffd154c986ba8646f632d99f3d558a56b0057798f7aaa1a0f67541703b3ceef1c82bd9209b6a74acdb5195d8fc03dd5ddde30975ec52e3e9f8a30886a73ef919e07d8ae6e4be531c6095195c78b5828bf05e5f135ec8738586aea603b5417d702437332dc0216986bdbb24e60f2169d6afea52d2a532136e83a49305d8c0eda01605e2f092671a6a4c1dc1160de200926f18443835907306f940493680da2c1ac079837498249b404d1603602cc9b25c1245a816830f70698b74882e9621a9f7d01e6ad9260127d3c68308f0298b7498249f4efa0c13c1660dece84b9b66a1af91b6a2a936b5696aae43c32f408605a328aefe18079471c256a355edd88af55775d013c08f0dd29475b447cd069daa27f405b74571c69a4025dba36a53534b1f34cf1bead22f1bb8614d8a9f5ac88ca109ae4ce01dc77c71d8139d5e351ec75bbc2782107ff167997eb9b31cf68dcf5dc3a8da91aa129ed2e00b4f7b465297a6c8eaa42e6c512a910e5bd71592b83d57f94a941adbb5c6ce4718ef92d7dada76da50e0098f7c5e1f3615bac9a56facd672e59b43974225829ef9706947872a2019d00401f9006d4c59a95c300e883d280bab86d1a0c401f920694a8ada701dd06803e2c0d2871cb4403ba19007d441a50a2d69e06b404803e2a0d28d1a64403ba2d007d4c1a50a2f69e06743b00fab834a044db120de87800fa043bb75750b77a82a95adda0f4e172b27199d52069f0e6b2e08d5121bc2765e4f62a350a66ad2299619a9bcd5587dcdb9184b61c9cb79f8a230d6a3a68934d21c44d3dcd08320db03e1dc7fc19a89ecb41af6433dcb9e8cff405007d461a50177d9a960395f2b3d280bae80bfa3848e873d280bae80ffa06007d5e1a50173defee8247fe0576406190e9b8dcbba8b11d65381e0af6f917d94130958bed45254a972aa94a7cdcbdf3cf8a2ac4f612135b6f95be5b03465e123745b4623907c20cf9b244a82e56203a14a0be22112a71734483ba10a0be2a112a71834483ba1f407d4d2254a2a28e06f54680faba44a84475320deaad00f50d895089db791ad42b01ea9b12a1124d7334a8d702d4b72442253ae1d0a02e0307cfb7dbd2a779a439d94f577efa54e29adfb50b09e5a560477a278e023b85deff41abae9fdd0be1ecfe6e1cf507d3b56a0e73d259f12c78acdf938473b893385f059cef4bc239c8499c17c14afe81249c6e7a263f09381749c259e024cebf00e7879270527376d370f685b9f3234938073b89730bc0f9b1249cd488631ace5d00e72792700e7512e702c0f92913a7365acd55da7f2e3596738231ccd59bd715a65bee61d4ad04183f8be354ae23e1e62580d5aa89dec55aa5a131ba9e54ed7a40f9795be667c0e6a67143b668119a17c3e3fd8524982e562eba1c607e2909a68bb55bd707985f4982e962edd6c100f36b49305dacddfa0f1c27bf9104d3c5daadff02cc6f25c17431dfc26f00f33b49305dacddfa07c0fc5e124c176bb7fe0c307f9004d3c5daadbf02cc1fe38e23b2c14cf6ef246e920e6661ed039ba49f24621de424d65b405a7f66625d2b026b74d4db98c44792d3ae1117a91759705f04b8bf48864bdc4ed1e0de0d707f950c97b888d1e09e05707f930c97b8dda2c1ad00b8bf4b864b3cb2d2e0fe0470ff900c97a85ca1c1fd10e0fec984dbab854d58d8f5982297966521bd01f6b57fc9c8e850ec3532dbfbd65af36a0e7b2a788e85761d40fb3713ed320a0314477aff4ef75854254215dd33e269610fc0fd23c94a3fccc99c4c87831cfe2b09e77027713e0638ff938473909338e7c39aae961284d3cd046cf703ce0e9270163889f37dc0d95112ce422771f684b9b393249c839dc4390070769684935a108d86b3147076918473a89338ab00e7124c9c5dbc173a94b0d6bb68160fd4a52c50f52a04b52413544b4525c2aeebdda48bc9d4d6ed10a2ecca44b95ec4239cae3a0375464457c6b12cc86bc383bd940b9089ceb734c89d00f2d22e4026da99689017c0f6be9b0b9089f6261ae43900b9bb0b90890b1f0df2150079191720138d2534c8fb00e4655d804c349bd0203f0d9097730132f16c46837c3540eee10264a2731b0df23700797917201343816890df01c83de3383cb7ec134036c5d00ecf6702ca15a4a0a4da0d68285783d3db8a5250522d5a34948b402a579282926a2fa0a13c10a472652928a9962c1aca9d01e52a525052ed043494cf01ca55a5a0a45ab06828af0294ab49414975f3a1a12ce81ca2ec250525d5018d86726d40d99b89327d9fe8a9caf783d64de5278644d5aedec0827b043cf2abb38dd675de9bb5dedf2d65e129f1fed55f44c349f387ce5721ce359838d751612e9ef0df314a9708f4f18e36266dfdd3c404768db8d19cd4e995ea87b1004f020bed9aec79b541cdf45e56187001c43106eb7423b725aad234d7e85de7debc3a196475ad3896a8a02e5375b3aa0fa2499b8672f52e21cab5992883f0de2aeb7adf9e6a38fc0212ba4e1c1ad04042f5c5fae375665d9fea9129f6065061f49ec1bf45de07f5f4a033a1d59a229754d31f2d5ca223ec00d6750132d1f44783fc3568a1d6730132d11d8306f96d80dcc705c8c403030df25300797d29075b37770db701ca0da4a0a4a6e1a6a1dc1c16b1be525052334dd2502e0d28f3a4a0a4a6dfa6a13c0c506e28052535313c0d651da0ec27052535ed360de5078072232928a909e16928ef01941b4b4149ad9a4343d9005afe4da4a0a4d673a2a1cc0394fd9928973128fdd34fa5d2bad0c989b34db9f7ca3d70352a0437a02d23a962cb12b58885f25240399089b26702a57e5c679a80c70aa5431f632b46404b00f33a201c24473f4f5424d31eeca76146cc8f2334d7f66063731ae64027b3946f0e8a8b0226cee5bd175a7d36dfacd3b5c618e7a725aaf5ba3ddb7b5dc55c6868b1cd45f06817b6e56627591e5dccfe5c09b238988972c5165016793feb9fa8baf3851d4818f7871972485b620c464ac5d88985f14bc038348e6dcfa076b7ed7916e6c6614c84e9a7144cf557d2d88956c8be2cb4b3415d315c2a5a6a790c1ada85f0e06f1a870748cb68533390139d1374d91a0ad69701eb6612b152eb8fd0b01e0158379788959a3e86867527c0ba451c9b28db3133dc4411b7f4b44dd4c3b003d8928951eb1bf497ce49f8784ef048e80cb85a8739dd6ca78abc9f66787ff4bb23d4d48417280d69056b79da1a906ed5b6074ebfa91af6169fe6813c1236515b33512e974039d86ce87defe39836f7b4d37a29b86f8f60c25b37ed852775071a53be9c512cc4e34021522475934f75d8a26df26f8547bfb82d67d1d84ab4d0ec435f03ca91fc59b4d67cc497472d8141888c96551a3c5a94d10c58cd47b56db8013618d3cc49ab26d60516a7d14cacabb4f078271bdc0a98306926b7652024668c2498c4d992067339803956124ca2aa8e06737980394e124c1733e6ae0030b79104d3c548f79500e6b69260121301d260ae02304b24c174d181663580395e124c62623f1acc3500e676926012135dd360ae0530274882e9a2e7f03a00732213e60a4a29f41b4ed5108d4be8e41738783ad7aac700e2f66c2b50548a8ae05fb7d3536c0f18273131ae9478b00bbdffc33a88a104c6a473a781fc18404e9661ec2d35601b4da880b60311179e4d59582bc1d85b2a032ba6a52ae42a862fef44c2ba0d2886a7b015c34d8dbf934c37aad5de8ae8574c33f36e018ffad4b60c60c1e6a8d9b76996cac701e50e4c94ab453cdec97ec5a9753aa9c1d0349ff71b61bedc511a50e20244037a3d00dd491a50e2d243037a0a00dd591a50a20d8806f46800ba8b34a0446d3b0de8e9007457694089b6201ad05301e86ed28012b5ee34a01700d0dda50175b10cea1900749a34a0c48d3d0de83500740f694089b6211ad00b01681913e8d2de8b72a333f2cfedc1699d868c96757b5f15229bced6b3d7a664d71ee17d44b75e6e0096192e449f769adcf50188e571587e748eede458cbf6a3247e1a6056306176f55e5427b49723955f48cc3dd95b1a7055b6ada2cdf5788a67c0eb72465b3a5563dc0f35cb70d72e249497c14a5cc55e569aeace4779f3605d627e9cecac0e7d4b78b467c6113f11a4dd096d8fc54612e73479d8d1c5c0459fe059109a521db7c9cc669e482edd4c3c22d2fcd65704af8d3d2562a5560ea461fd1da4759644acd432a134acd703d69a387271d98357a624cda8c399dba7ee2c9cd7c0f669b6249cc39cc4793ce09c230927d5a446c3590c386b25e12c7412e7aa80b34e12cea14ee25c0038f7928473889338a702ce7a4938073989f34a15e26c9084931a4349c3f925e06c948433df499c8f01ceb94c9c3d12380bbcffe799e080b9aad2797dfb3e3057ce63e7384a2f6c25f96849434a8bbbb8063c87e7b30dbb517117d186b512452e664b3ba9ef048ff8823866cc742de5c39c743c381de473a1249cc39dc4f902e0dc5b12ce414ee2bc00d472fb48c299ef24ce8701e7be92705243a66938bf079cfb49c259e824ce3561eefc9f249c6eba140e079cfb4bc239c4499c3b02ce0324e11cea24ce7ac0792013675e04cee840d5628f91fe9a5aef83da8733f0232955c971c1c4188d292cdc0f02ee8398b8d751c9fe231a69906b131d139bdfabba27cf4b80bbc3c1d201bb18b6752a48f0216de9dc98acc377d1e3e96215a23c9489b26f04cae442f4c566b69d6d7ed673f15cd3e4a8c54e67a5869aff8554b97d8805fb28807d988cccc7c90b5abe1ac99d73cf646565180f53c2e152aab352cd7ab429e13438ca1e2105a59b69519707a93c520a4aaa398f86f24e90caa3a4a0a4fa3cd150ce03a93c5a0a4aaabf130d6531a03c460a4aaaaf130de5a380f2582928a97e4e34941701cae3a4a0a47a2fd3506ed4394479bc149454cf651aca6e80f20476f0970e38acf5ded2ee3881fbc31873812eca4c7779a0f990ecae4288273221ea11ccf3de6cf0de2e3667f24683b146f991c53474abb3d08d027427b1d39eb65c147c8af9380d632d6dcb03184f6edbda2e5865089dc38879697ab0b0fe0c584f9153719d98778e9619f151382a9e1a47013c9d77a1d2cc8bb3e3f2fb5cc482f720c8e16971e82875f267bd1aa7aa83837f8bbc8bb52be33ca59d15b59e92ac58a32d40eb805c9e1e473e109bd922f911a7167ca03de4ab837ff2199260ba984b760d8079a62498c4f8611accd500e659926012b7453498bd00e6d9926012d3afd060ae0430cf910493e8464383b932c03c57124ca2659c06b327c03c4f124ce23e930673058079be24982e1e26a700cc0b24c124a6d8a7c1dc11605ed8b64a0ebf293f951a11252d2bdd45a04dbf288e2cb199c4b2131f745abcf05b209b174b034a94501ad0b701e825d280120f9634a0af02d04ba501251e2e69405f03a09749034a54cad180be0e402f970694a898a3017d13805e210d28f1a04903fa1400bd521a5017d3ac3c0b40af920694a8a4a3017d09805e2d0d2851514703fa0a00bd262e73709df27d8e623207d34eecddc16679ad8c9095d452cc6473705f16da12f0d2bc4e2a5a6ab0000ded5ea01cb95e46e95bf45522dbdcffe948c2ba1d04b6de20116bbe93586f0769bd512256ea619486753a60bd8989b59fb285b64e5623d5b65ea7b503ed6cefdbfc6a327a200dde157eb5a35af86994aa37fb06dfc78986fc22d6bc7b1e6cb56e96632c19e6a487d386b0f5ba45124c173d9cfa01cc5b25c174d1c3a92fc0bc4d124c173d9cf200e6ed9260bae8e1b42ec0bc43124c173d9c360098774a82e9a287d39a00f32e49305df4705a0b60de2d09a68b1e4e1b01cc7b24c174d1c3696380796f1c87ce20f7d7ec14d55d43da4a3e8c9c23ceaca358c8ab418f7a5f1cfa7d9de83f68d5f534ff03e1c47e3f13debaaab54ae898223b69f2b9234c090fc4813898126abc377463a5ca4f03984e0630ea14b0290bf121a0ea7b908958a7340ca2e2b11c6f91f7d30cef8f96da116a6a22e5000d242db3e23815827c8809b26742560799b934590263995169b2783dcca80fc7a1cd0f1e778dac6af1dbcd6dad5c3c3f758155fe91b8ada5e9472613d579b4b8e4ad60f67c348e0380cddf24d9db64a0930955f701988f4982e962caa06300e6e392601275a33498c701cc2724c124ea4669304f00984f4a82495c8068304f04984f4982493c6ed2609e0c309f9604936883a7c13c13603e230926d1064f837916c07c56124ca2d69e06f36c80f99c249844ad3d0de63900f3f938600667f6194621d75cae6ef760fe06305f9004d3c57d666f70b97d51124c17cfe6bb8364be2409a68b67f32701e6cb715439c2054877c25718cf51db984a3175aab9d82517431535cf00f02b32dcc2536d45c4f3114d3fff1028925f65625d2f65129869cc71c5dee58d5ec7ebbc2ef976ce8614c96d0f15ba1a01f26b4cc8cbabe852e7a38df49628574b9bef080fffeb4c807afa9a6e24b3126ac6f93678f716a5ed00db1bec1cf3fa4beb8c95bddc34129429c339b28107f12416c43d01e29b6cd92bf3465f610c68c9e0dc5b5836046c6f31b1e91ce4bedc2d348f6eb99ad5c46986868f16b3b92ae07bbb2d8b3a26dbca5d8ccf380b50bec344d927658b1344bd6b69accbc86e4edce4d0ece6c7c326e75df6031f2416d0eb734dc21b2e1647195a06bbe7c151e6bdb6d460263ff0439d74e2de09f444ef4b82e9a213f7ce00f30349305d0c631d0930174982e96218eb1880f9a124982e6e93b604981f4982e96218eb0880f9b124982e86b10e03989f4882e96218eb6600f35349305d74c35e19607e2609a68b61acab02cccf9930575599a5fa1bee64c2e9bbe040f985249cd450561ace2b00e79792700e7612e744c0f995249c854ee2dc12707e2d092755e541c37934e0fc4612ce214ee29c0d38bf9584d3cd5212f7a910e777927052cbf0d070f600e9fc5e12ce7c27717e00d2f9838c44bec52a35e124d597f83916da772177c28f71fbc0d98e9b9890822ab134efa2373b87587f928895ba4cd1b0be0cd2fa333b0d459089a652cd4b3ce2a1fb96eb59693e8419f517490bd470274b4a5c0bebfdaf927052934cd2709e00387f938473b093384702cedf25e12c7412e75a80f30f4938a9a6381ace7d01e79f92700e7112e70e80f32f4938dd2c1675156c94fe9684b3c0499c5f03ce7f24e1cc7712e71380f35f26ce5e2add18753c64127d96966521dd004cc6ffb565056df7e32b878012442d4d44d95b257bc9571a19f41b696f69fa1e0115480726d49552a0565b1f796a7d779a0ae45e082ee82805a48b89528e02909da4807431e0ff1c78b43b4b01e9621a8a1a00d9450a481793a3bc0920979002d2c5943d4f00c825a5807431f9de7f00b2ab14902ea684fc12402e2505a48b49f7ca60fbb3b414902ea6825c1d40766382cc53e97b79cc355fa37d3d26a9ca84f9b7be499a1ee204308585fb29c0dd9d89bba57400c9db761717a58f41e7be0c1365e09f144c018d2a93c223c433112de7c74450c72dcb44bb410adae9aa690e85f69d6de10c40bd5c1c13822e4da22fd41dd0736bfb71afb90e26841e4c94eba8307145f86fa977f94255e27d4c67ed1ae95d38c3a401aaf11a0ff27735982bfd347f34c0b4f4675b01e0e5d99baea01ed1e4c4e3ad93518df07ea3bf41d76f9f645203e9879f0692962364ac0a41f68ce3a14f4f79e7a2b264253077acc04419d8366d1baa642307b900042faa180ea82b32712ea3a212f405f3a47b7238111ee995e278a4d3f13da66a9b68327817c8e0ca4c94f9118f743647524c7f3adebbb6827d0098dc91740b14dc8255e2302267ea49efa21ffd5100755589508976501ad4c301ea6a12a112770134a8fb02d45e12a112ad5134a87b01d4de12a112172a1ad43a80baba44a8449d140d6a2d405d432254a2c58a06f51080baa644a844eb150deac100752d895089e72f1ad40300eada12a1120d7f34a8fb03d4759850fba964959fd6f4677bb0a5ee0d68b6d64f4135b86e1c2a197bd883ebbe7d7fa810e57a6dabddf29baa51640f009eee1f3c00fa3051aed6a254360d15236a0068010f9f83556a7d69405d4cfcf20500dd401a50e223cfcba40340fb4a034adca1d2802e02a079d28012cf5134a01f02d00da501259ef669403f02a0fda4017531acf11d00ba9134a0c4d3110de8bb00746369405d0c0b7f0f806e220d28d10a4503fa3e00edcf04ba9c0a5d23f1e8198333242dc5e0a92a843780092ffd32bb13bc0fefa97cef3d6d1725ee3cff613946740077dd8112b15237f434acb780aa6e9044acd410091ad65d006b7e5baaed926112cff08b58f3e98fa0b62b886375d74ee5cd95e28dc95b9f57b01c56f7422650af6de34c5e6e7cf3ab120f78150f19cdff7e0558d307b391618cc878d381993c64f92c64eb00b22171c489eac7b6d8d4890d8c67535599f948858a21f683f6b8de038feb5026c89ede0b1dd8a52d91daca539fe4565ba2fcc4c0c452d03423da32208bc3980883bc618109586f67e6272ce8c9eb724cee5fffb190ae08abf27026d2f55390ce36f2d860dd3da6162e8fc9256c140bf4c9007ad338826d7127997e042851cd418b00dd0236e99bc511c114ca7010a260735570319fd338c0b9791c1b75db99a7c8fb68ad59c2f46236cde8dd89f675daaef30050796c210d28d1be4e037a0800dd521a50a2e69d06743a00dd4a1a50e29244033a03806e2d0d2871fb44033a0d808e900694b8cad3809601d0226940891e2034a0f30068b134a0440f101ad0fd00e8486940891a781ad05900749434a044eb100d680d001d2d09e8204737f67f8292648c34a02e1e3dbf02a063a5017571dbf436001d270da88b1bfbd701e836d280ba78f4fc08806e2b0da88bca910f01688934a02e6e9b3e07a0e3a501757163ff0900dd4e1a50178f9e5f02d009d280baa81cf902804e94e19ee83b818501dac4a589e653b23560dd3e0ecba74d4eb139fa5e949637ef7838cf4f6acbdce2c9388927791aca97558872729c45d474424cdd72790454bf513ff29d289fb4c8f773c1325fca84da4d85e9838bcc258d09871c1ab4be2c68db82244e8933157bb4ef71bacb11513e69cb513dc8e75426ea55325a8e0a99aa3bda0cda1960ee2009a68bcbd1120073474930899b791a4c05307792049378d4a4c1ec083077960493a808a1c1fc1bce43bb4882e96216f17f01e6ae9260124fea3498bf01ccdd24c174b1c6c21f00737749305d547afc0430a7498249340fd360fe0230f7885bcf6983999c4cddc524d58b60935426112b35830d0debc7905275ba44ac839cc47a22602d6762eda392354e338df6332801345785519f0d2dd8955cf41cd90be6da8ab823ea6cc980751ae03aa3d50fd47dc443292df74d3f405bd99676a554391de6a407c9be807386249cc39dc4793fe0ac9284739093381b61b99a290927358b1d0de7e580b35a12ce022771be0538f7948493aa87a2e1ec0673e72c4938073b897363c0592309e71027714e029cb325e11cea24cedd01e71c264e9d574b3bd6d4aae926598befcc101c44751217fd5de3bcaed120d2d261fc4f85106be390c974b3d20e671e2d693969efe810e2ac9384739893382f069c7b49c239d8499cdb01ce7a4938a9ce0d349cc3016783249c439dc47918e06c9484738893386701ceb992700e7212e72db0519a2709678193389705e99c2f09a79bf564de03e95cc0c4b9acf7a23c297fad7f1a0a5ed1d0d1dcbae702ba856d99043d798e24baced20e93578136736f29280b9c44b9062837f69182925abc8c86f26f90ca7da5a01cec24ca83412af79382921a664043b907a0fc9f1494439d44f912a0dc5f0aca214ea2bc09501e2005e57027518ee91ca23c500aca614ea2ec03280f8ac3e5b035be70c99e9d4497c3b12ccc2741828083e328a8a7bf7886811cb43d2771090d1ecd37be830ae11d1287b7b15da181d5b4622a2cd18385f52ec07a681cb368e06d5cddece99c8892368b3e096bfb6171a8dcca553af93fc8497f680ffc9670ac3c3c8ed251e9e98ddc93cbbd01e4115240baf880cf0390474a01498cc0a4813c08401e250524d1458be75d04208f96029218ad4e037924803c460a48620e051ac8c300e4b15240122d8e3490c702c8e3a4807451b9710c803c5e0a486216241ac89301e4095240127373d1409e00204f6c4bcd65f241d1c5c428c701ca939828b56749b9f1c1d05fadbb39c6bca50b91d2b0d15cfb17a810dbc94c6c6babb02c73f8ef18a58b30273bb64c307585eb4de37e554c778b355f06ce57a7c4a1094ac6eb776694aa318d0691e4749cb42ac3f783b49eca4e5c3acd5c12565ef76bb4bab7c8cc0668a7c9c86f905a9459abd388671c5a4ed81341d17bba54b4f94ea2fd162c9167b0d7731d7156e5fd9f0acf3d6cabc1c37e26139bb643d5293f302f3540afc4fb40037381a119660b01df597124314bcf7243f561a36dc9e7c1e6e76c49305dccef3a1f609e2309a68bf95d1b01e6b99260ba98df752ec03c4f124c17d518f500f37c49305dccefda00302f9004d3c5fcae7500f34249305dccefba17c0bc48124c172b5c1c0a302f9604d3c50a174700cc4bd8e7ee6946f3e3bb004ef3da2d53f5e66df7946c9b03b64be3c036b05d60db1ab05d1607b68276816d2660bbbc6ded867e537e2d34e21e91560b6d0ca870af884302f3db85048e0509bc320e6c83db05b6dd01db5571602b6c17d876016c5733b1ad1b31dfa5676749cee24f433c8a857802f84f5cc344bc9eb23b024cf5b84c56256aa4f7f1b9de47f5b252e4fd34c3fb5369ba5a1187fd9ae66dd11fe4f8dab65cb7317089ba6e2f62a1fc1ed6edebe288020bc29574330b16bfdddc01d0452dcfdf6076bd3ece9a13b56abe9957ebbd9ff53450ec3538526deb3dfeba164565e27713558d9963f57523bc9e5473313fd58584b91202406f68db18466c30a6458c5631a50f2c6237b6650daae44831aac297b6e92a0019bd49124c1743ef0a01e6cd9260ba18ec340460de2209a68b2178c301e6ad9260ba18f4b439c0bc4d124c1743f1b60298b74b82e962f05311c0bc43124c1743f24601cc3b25c17431086a2cc0bc4b124c1743f3a600ccbbe3c82c546854cbbeff6f4c6a669af2633ca8e7ee61d73969306536754849fd6207ea30928cee424d3b83efa04288f73221aed6c2e3dcb4aade30e6234d531a6f0d8ff47dd28012171c1ad02d00e8fdd28012951b34a0eb01d007a40175b124f1da00f4416940894a0e1ad04d00e843d280ba58122e0f803e2c0d2851d941033a18803e220d28511547039a0f401f950694a8f4a001dd14803e260d28512547033a14803ece3eab4f4fd8d17537f5a1738177d80c0b6dbaa7e898a442784fc4e11216382ae873bbf64eaaf13a83be49cdcba88bbbd04dc0c5e6c9785d6cb40ea94a6927af716a64a49a6e88d13c11b17661613d191efba7e270024b2f5cc5c530aa636112783aceec4583c069b154b5d7ec4557823ef419592b7e8193aabc599d43a0cf4a03eaa22a6f26007d4e1a501755799300e8f3d280bab889da1e80be200da88baabc5200faa234a02eaaf22603d097a401755195b72b007d591a501755793b00d057a4017551955701405f9506d44555de3400fa9a8c4490a5aade406d50334c73b3b967fc7b3b92d04e87988ed7d9190d8333be8fac5c55c6e5d34493cc135488ef8db60c39c4984eaae2ae2b2b68eb1278c8df8c531faa3549538d9e7eae4a0d394c8ee424625dc492d033411ffa1613eb062958671a93089a41a678df549108ec6e68871afdf9a0d17fbb2d5d6d5355cf2ea69dfa1c16a67724c17431edd40f00f35d49305d4cbcfb09c07c4f124c1713ef7e0a30df9704d3c5c4bb1f00cc0f24c17431f1ee4700739124982e26de7d15607e2809a68b89775f07981f4982e9624a969700e6c79260bae831f20ac0fc248e337c3a3093d3ae10779cb4a0afae70b0fc542256ea469e86f56690d6cf98587bab50f7e9fbdd4d53c5de9b752af06b1ae73530424d4d842aba9c84ad2f78357d1e47a6bbd0adb156351a3d5310ef59a22a4d638d6aa68a727274b742faff6042f88209b9570b1342d8759c0e889baa6559486f01a45fcab031157b8dccf6beb5d6bc9a63a60de2b1f43916dace80f62b26dabe2953429de9c2bca4bc7641febb295e0735d8e0df22ef5dadb29ee7355c6b6665ead4b03a0bf60600fbeb386a62a66b7c763370ec38c0f98d249cc39dc4f934e0fc56124eaa8e8a86f308d8c17e270967be93381f049cdf4bc2e9a6a7de5780f30749380b9dc4b912cc9d3f4ac249cd7f47c3391070fe2409e71027714e019c3f4bc239d4499cb300e72f71641ad3baa9398bd3aebb9d69ac1a7450bff275fab5e623fea95deb9ffce21523bc8fea6fd1ae6393cc6ff4c19206b38c05b34a85307f63c2cc8b78b06d8a91b9e66bb47a6492d2aa113fd15ba9c25851aa43ee1416eef3e0c1ffbd2de39751474a353ad3b4a4abc034f0075b15ad218e533ab9a0d6f09778af75fac1c91e9372e3e9ac3b342ea17b0aafd36ebbf38dacfbd7d320d77420415e1320ff198703b996c779e0ae1bcb52452b90b6029c91fe6a4b07f2e4c7ddc554eb6700cabfa5a0a44681f2664e5884fe918232df49942f8054fe2b05a59bb514f607a9fc4f0aca4227514e0594aa9b1094439d44f904a0ec2005e51027515e06283b4a4139dc4994fd3b87283b494149cd6e4b43d90b507666a25cd17b51a5c278b9c08f4977d94f7bd5c8cf5c4f73b0d94d8518bbc42191617c6773271d176b7afc0e12b90413654f152a87671a7d7a85d1acd7c775eea6f924dd06d2b824fba19ead92ab19070fb6ff482fe43fd46359180702c6ae4c8c2d57dac4506d74462446c5f5a03de080752929abb79b73e54d70fe5e5a0a4a6a3a405e954dd89e77938232df49944b01caee5250ba59e0ec5040b98c1494854ea2ac0194cb4a4139d44994ef01cae5a4a01ce224cabb01650f2928873b89b2160e8ecb4b41492d734643d91750f664a25c498576ef4aa307d25d1da7824213319dc469209f5121c8159820d78890495b72bf543f226224102dbffce320a12bc621a183daa9843e0512ba921ccda58b45c7af05995c998952abb1eb94ef1ae87f2839fb9c7be81a400a5761a20b1cac6d8e81d89c3f37ba98de670bd00badcac4995ae1482f30f3133ec2b605687c8ac2981a8ada9785f82678d85763220e42aa75a0bfd6a46712e34bf575a345f9ae0fd2db8b6dbe683eda62a1f9892aa10b59ceab13e168d9bb2d310623a562ecc4c2f8053ce8abc7f1a0b7bc856f3a83521f74da1c7a3448e81a52d1523d336968bf01a95d330edb65cb6893d34d534bf2fcc3ca287f37605d4b22d67c27b1d600d6b52562a52a496858a700d675e250920c6fa74a92d7540872dd38b652b6e369b895222e4ab4add4bf104eb51efb316f30a7213f7632f049c242125880b7d2bb8eeea7444bf5b73348671f26d67e2af9b49feafad590f6b62a396d250df92816f2fb60665d9f89dc6b5be95213752ab6606b5a38e0fa20a71b30a105d913ed2929b7f3fed70fbd4e4c59e7fda9f1be6e8cf9b896699753546e08736c5f26649d5b41bb73cf37a928f59a5f632283ab120f7d9583f0560209cd63c39b6656713f919f5e9c5c4f4c712048de864c78cb2b7b628af021a601a405115482f4f58b63bb6e53d8e1ea4c3cf7fcc70279369485daa8ad2431cc78ec9e249683246e1cb7622e7df306312f37cdb83112768e9bc4b1c4e41bdb51706c74fb1c3e009698fe4c78abb43043263b2b50956e34981f82240e90049398d98806f363803950124c17731b7d0f30074982e96284ef1f00335f124c62b6771acc7f00668124982efacb75816d7aa12498c47d250de6920073b02498c410551accae00738824982e06132c0530874a82492c764b83d90d600e63c25c4b45971bf18b89ebb2e2edafc6f53c58dd87cb70432855c9d11ac4d99416ab51065837958175aaf2cd69baa942aeb45ede8984751478cf6dc6c41ad4c90a23371a3c1aa5ed7002f80c2475f3388261d20b4370b190f8bd2a44b90513e56a2dacfa4d8be10c61aefc34d97c1164734b694089fb521ad01700e856d2801275a034a0b701d0ada501757139ba15808e900694a80be5d5c002a045d2801235f534a0f702d06269405d2c8df308001d290d2851634f03fa30001d250d28f1344f03fa14001d2d0d28f1a44403fa28001dd396fad1e44327350910edd87924e847c74a82493c72d2601e0d30c74982e9a242e45080b98d2498c4458806f37080b9ad2498c42d12cf711b60964882e962ea958301e678493089c74b1acc7d00e676926012951f3498ff03981324c124aae66830e703cc8992601215c734980b01e6f6ecf06afda53ae0af4c959b46fc58f5d400556212355a506ab50a314e8ac337249df84a3d8ca0be8bcb719579107a30398e0c75f6621053923c99a8f3677716ceab0167a9249cc39cc4790ce09c2209e76027711601cea99270163a897345c0b983249c439dc4390770ee280927d5ca4ec3b93de0dc49124e6ad2291ace2b548873674938a919e768381701ce5d24e1a406bdd2703e0238778dc369d60633ec3a665b201a3668c90206c2e97d3726d265bc17fa50a9ddb9f545a50a7de369e0687ef1fd4116779791feb4d86b64b6f7adb5e695be7a1ad37249ab80590132398d89564f541a976e605c02e9c8043ef7941cdd4022f760625b414527e80b93a6942857d3f14d0188654c8879193cd673cdd7e8877b92f20b4754369941a9a9f8a6b0703f006130d3db32662379ebee62d8ebaa9078bf3c8eb21103cddfc1bfc546f35eee51a94968e3277baf74e7b4c48e53984d96ac46a6213e1b0e9b1532d6fce44920df5bbea8c15b67b2e2e186c1445029a5fe1bf50c4f93d253602298210525f5fc4e43d91da4b24a0a4a371356dd015239530a4aaa8183576f0ba4b25a0a4aaa7183867204a0dc530a4aaa618386f21140394b0a4aaa5183b7cf0494355250525d156828fb750e51ce968292eaa6c04b050428e7b0d3e6cff3de6cf0ded6679d32e5177da8705029375285d06adb52feb0396a261a5e520ad841d6f193e36b2546b99ae94960bdd169d69b667cd5867b72b832c8e15eb26ab4ba18a9b635c8627d5be8da8b95f6c9d4c51b7443babca87b0bca7890c986380a33694d6558e12a78dbf5d20db703c6c6788bd946eb24c7243e905c858db8e5799185f634403b576e9d60225a5a2afda561069dc744db5385a9f46727bebccc78bebbfee01f02e688f93252f3a5960925aeedb4c28bdb83fbc1028958a999646958ef84e3e3428958073989750660dd9b89b54702eb20efff79c6d83b37be3994b6075d0696a17de23817f9d6f2a9aada6ce86b93ace4a38d8cba6c21bf0496a47de358d5079a4d53b2234c2c1249732c5c0710ee1747706a7a27756a627dda16a92bc0fc9f24982e2ae0960298fb4b82e962de8e2500e6019260ba98b763498079a024982ee6ede800300f9204d3c5bc1d9d00e6c19260ba98b743d71c0d601e2209a68b793b1448e6a19260ba680f5a1a601e2609a68b990b97079887f30f91b52aaa02b0ee7690fa84869016d6570133e5116deb76e037a5fd37a81192c35828078282edc83852e66612614e9c2b6951bc8fc3e37d9434a0c4f99206f449007ab434a0c4b3390de88300f418694089e7735ee03e003d561a50e2a24403fa28003d4e1a50a26e9306f431007abc34a02ee6eab81b809e200d28f1bc4e037a2f003d511a50a29e9306f43e007a9234a0445d270de80300f4e4b8529886ff8e51da661e9ede1b173bcbfaa7f8854e5bd6b705b8a730e1f68e843bc934566b5422a3cc695e5fac071103d4ff5850df5221d4539950d756c95558b542a4d6bb4ceb9bd089db1e33e462c4d00110c7761a3b5f57bd0a53a34cf048f8a97ce62662878abc9f66787ff4bba133180d69050be90890d8d3257ad11530b7ff342fba09e0f3798644ac548f111ad63b40777aa644acd4543f34ace580f5acb6d4ee27c3242a5216b1e6d35f61893a9b1dc8a5f378a5a6ec9990b032e9a62a4ca7681069c185ebc1a2740e13623fd5d4fae907ca4cf656fb6dbd4e17abd41c880de06c1bfe14467552b75617b1909f0bc78173d939127db9c5dc73fe06cb3d491d02927a1e139b1e415de2f8995a9e649c0a92a19528729e449a81b900409e1fc7231f9c9c6637a9f5625be953b163aa5ea202905621667958f52f60fb98542e9e1f272530961812d5e6e78a94458c0693e665bf31c8ef85ec6402811a4507255419898d2544819624f50e8077511ca9265bded637f7b0134dd0b4877d0ac4255d1cc7fc8a88ff6f6ea916800ee092b8b37ba61fee4db4ffd382bdb786a5eb5226da8216d1fad23cdbfcec0f444f1a33945f514e973c0bae1cb5385384def9ea77ab136735aa7c3fced21a54c39472990c654cf22e823a53d37612978206e172b9d306d15390366d1c08d3c6156da9e7424b027506eeda8584f26a407925df7c18ce9dc5069d6f289c65201799b97656a2491df35ce935454cee46b36fe9bd7d00f52a39756487381942b12c6cbfae9604d3c5108a9e00f31a49305d0c22ef0c30af9504d3c520f2a501e6759260ba1844de11605e2f09a68b41e49d00e60d9260ba1844fe11ec376f9404d3c520f24f00e64d9260ba1844fe36c0bc59124c1783c8df0798b7c4ad53b2c144dd7f01f381a719587ac05274ab44acd4641c34acbf8006f4368958073989f51ac07a3bbf3040606f9aa86a0c36ad91774fb7a9d32906d0ee90541a7ab89341e577823fd49d92700e7312e7a580f32e4938073b897302e0bc5b12ce4227716e0638ef918473a893388f029cf74ac2493564d070d600cefb24e1a426b8e6adecb051ba5f124e6a767b1acee5403a1f9084939af88d86f37d90ce07e3a861a351b5bf1a366f00c687e270c7cd4f399fc7008f76942c82f3f7c332ca9237f519a5fadc3fc742fb0ca07d248ed9d2365716791fad35fe4765debbe41292b4f09bbdc157ee514938a9c54d6938ef049c8f49c2492d4945c3590f0ffbe3927052b335d3705e0c389f9084b3c0499ccf02ce2725e1a4567ea7e1ec0073e75392700e7612671ee07c5a124eaa93020de704c0f98c249c439dc4b92be07c56a2e197aafca0197e1701d6e72462a56a3c69586f8795fef938121306b1f573166b93ec7e4a2eba7c5d0872fa8234a02eba7dadd63904faa234a02ebacb3e07405f92a4951fee64bef15bc0c8f1b2249cc39cc47916e07c4512cec14ee21c03385f9584b3d0499ceb03ced724e11cea24cefd01e7eb927052a38a68386700ce3724e11ce424ce1b5488f34d49380b9cc4f917e07c4b124e6a1d5a1ace5700e7dbecac8ce526b3879ff6ba514d3569afaa99791468eab97d00db3bec3ce1cde991c2aea316892889b4fc8c1b4104d1bb6cbfa406936dc6cf0c1ad45cd05d0eea279628729a4b9a2a6e2a48e67bec7ca1cdd5f54c3e93d340d252a55c0420df970292a81ca681bc10407e200524518749037924805c2405a48b553e0e02901f4a01498ca3a4813c07407e240524519b4e03793680fc580a48e22e9206f23c00f9891490c4443d3490e702c84fa58024a68fa281bc00407e26052431a9190de4f900f27326c8a50d487d89fe6aadacd0291f5d2cc13707907dc1d6ee34780dccf12e4a4d6c4ec3d69785ad3760fb92892d4fa51f9e32d77c8d0e52c1b226a52a391f3171869cc2c2fd0638bb7c1547d2dcf40e882eaeda1780ede6eb38fcdbecda71acb495ec3848c3da8385f5059810be6162cdcff18430c5eb5745623e1eef5d5b612609e2997d322b17fccf9dc35bf02dbbec59584ba648e9b2a73af9737ba821b309c8f1776d9949ae6970a07b36a03dc0e9f57b493089da761accd900f30749305d0c1e1803307f940493a875a7c1dc1660fe24092671234583b91dc0fc59124ca2f69d06737b80f98b2498c493130d6629c0fc55124ca2169e06730780f99b249844bd270de6ce00f377493089ba261accdd00e61f71e89a8238a0ea66754d2eda2c978613f99f717862dad476d89c9fc9c3c590bf6120997fb1151c417d576de26884f2ce3165e5a2c9e460d07ffedd96f5d79265d2c54a2d67833cfe1387ce131fefffaff3d4b7e03f90e67fe3c83137c8fb3f6835a6a9a0530712bc775508ef3f26bc8d23a68268f9b5cbec48d3e972f3b57546c2c9355b4fea44c29e0fc63c1db64075e30ef5f4bef3761050e0be097a4d90de0e4c8ce967484c85aaa70be2798a86f64a90d08e6c096d6edf1a8c94ba3fa0cdaf23617fd0898931a8f71e9ca4fc3d6bb68e12c4b995e628711a9cb83a3391079a80f44e5c439dac91b904c86f1749305dac91b90ac05c42124c174f5e9fc1b67f4949305dac91d91124b3ab24982e26fd790324732949305dac91f929c05c5a124c17b5a74f00cc6e9260ba982ced4580d95d124ca29b180d662f588096910493e8264683b906c05c960953db9c6abdd1377aede9bf53951f41d2003f5d40b5e91e0d27ad0ec73015e25c8e89b3657389df94362e535d1e86b1508e03ad520f26ca20c1642659935cac53b41a3ceacb4b034a9c3b69407b03d09ed28012cfe934a0cb03d015a401753119d58a0074456940893a4e1ad09500e84ad28012f59c34a02b03d095a501259edb6940bb01d055a401259edd69409705a0ab4a034ad479d2802e074057930694a8f7a401ed01407b3181060931b4a3635880b4fd383bdeaa4290bdd9ca90006495f70bad599aeaf198ac4a8cedbdccfb883eb95798abeacd15349c34d7f08d41ebb97a5b2a4330729eaa0c59c442f9332843d68843e76943993c5f524d1bb4c7fc38488cbaa624982ee6503c1560ae2509a68b1120a701ccb525c174329722c05c87093348291d5628aa54f313295a92b162da16e2ccf91f0be9b2b00cad2b6745276ae3692bfa5f80723d26ca203a295fb5bfe8a44d6187d9276ea76ebd612ff6ba5d61ccc3c1bf45dee53a15fa3cefda5ae31c4b7dd46996ccf3413ed78fe35039ac9d1e2a7f5521c80de29833d3735770d1c1eb0c40d9370e947acef4a388fcb495ed472a6f8399338f89728d04ca466f56d42520329937894661dabcb91428e336940a96b861a281ed0060fb49054b9c5569603bc254b09154b0c4d33c0decdfb05c6d2c152c51e744037b3580dd442a581737fd8703d8fe52c112dd1c68605f8639768054b044871c1ad81700ec40a9608916271ad86e00769054b04427471ad8ce00363f0ef7079b0eb569fa4b6ada2c9a99f944d0f3174803ea621accd30168a134a02ea60f3e0c800e9606d4c514c24700d021d280ba98acf52c003a541a501713b69e0b40874902aa1f7817f3d917760e810e9706d4c56a0b8300e8a6d280bab8287505a09b4903eae2b6694900bab934a02e6eec9705a05b4803eae2d1b33b00dd521a5017b74dab00d0ada401757163df03806e2d0da88bf9ee5707a023a40175b11a436f005ac404ba7a04d0e89497a52a39b52571374aab4c3704fcf78ae38865b2c92936e71713703183d309709e1fc9c4d9538599c3eb949f1347e7caa98bcbe58c66f81807868f514c84cb782fcabcd157184b91fba9ab75170370a3e57890ba983bec454039862d8333cdca5c61d6e87a6f81097c9b8989ad68057b97007063db7239695ae8d445e5db19b03a8f938473b893385f069cdb48c2e9a66af84270b5dd5612ce7c27713e06384b24e12c7012e79f8073bc249c854ee25c0be6ceed24e1a46659a4e1dc0c704e90847388933877029c1325e1a4e64ea6e19c0b38b767e2dc4025c7c4eb0ed4793f9579af2bcd257394bde64c7b50c0ed0d7acd494cd46ba7a09e692ead567b9b537ca32a6b51965d340e6f0a923c998957bfa84e48a97b98965221a65226a63c15a6b40af497d3d418a553574d329dd112a7552015298ff704f3db7af3657e69497aca2bda437f2be838a7b465029764551d75a34f53d67d078ff85449305d4cf4ff03c0dc41124c174b9d7d0630779404d3c55267df00cc9d24c174b1d4d9bb00736749305d2c75f63ec0dc45124c174b9ddd0c30779504d3c54c38b703ccdd24c174b1d4d9d500737749305d7494b91e604e8bdb9dcb0613f32e5265f460daba0edaa43d2462cd7712eb6b604b2a9388951ab941c37a34609dcec4ba8e4ad63a0d04add344a36e5ee87d482b9d673571048b41cf447309fbd6e89996ec92d2f8e8268d171bb59b56f5969bfefb8e5dfd0da2390918e5deeb12556d3eb5872771bb787f32bb2bbb797fa27edfa1c3725e8f46a9055ef7f46f757b15a6edd9debbba670d6ae078ef92722d249b268424af4337efef79097560ede21ba97b9bd7a1abf79efefd74ef9e5479fdaef5feceebb074d26f757ffd9bedbf33cffb6479e2daaac438f23a78dfa9c28c93a9efea9ed778bf9befbde35f5563b9467f53b99ae98d533fb77a9cf8fdda25abae0551f4fb52635a6feab118f6a5ccf834eaef8e6ea1c1fb8e39de37347db7799f48fffdcac5fd6ffafe8a49ef6b819d67ded1f7a8e9d5ab265d3d29f17e89797eaa1352d0d2771499116b5ad1572f6dc61be6661c6f1e8d99de3b2b347927f9b3baf77e1647ffdada1405f408efd3758927c6efbb66e64b655933ef05f72f59bd9dd761d926772ff58a6e70ef52dfeb9e74e7a2de0d99a5bebb4233772df5da55d2b867cdb79f7cc752aff525acc2b415d557edf83c3be54e4df15857404ff48ce4cb49ea95c9e54317c2d5ddcdf3173852fb3212bebb6ad2bbc96da61a26c24fadd4cca742e90aafef01d7db7baa09541986d3d318d35cefe74a635af1bfafdeebef5cf3ee522ab9d46ab177556962ac999660f5bfabbec9b7149b6bf23a2c1ff9aedf72d05e43e2ee37bd4e5729dddbdcfd9522df2f35eeee7e85147c2afd19b1e9f5bea129687385c86bfcd5c8f7cc0dbfbf67e4b563e06e9426668c5e91578e3464fdaa2d45de4f33bc3ffadd116a6a8243a69f0c2de33ee50ab316cd593c939424669b71e659a832a35831adeba698f5395865eb3d6235295567fc392b78af386148ae5fbc97a84f485970c548afed0509295b0e7e3fc18ca6c1dcbfc9de9d2b339ff6ef7670cd64e567732a6f66e65d29e9bb5a269dcef5c817491499f9319061bdc9ea60f84f5ebcb6569ad5dd9f97ca8c8cfaad0fd8cebbacc310ef2f3f8355ffc5b9abfc7dd86cef8fff2af87dcb6dea5d55f3ad55e8ad5387e8fd754dcef6832d8dc8dfc2eacfcf48f8783498dfb634d296c767df5b766fe6ae0c98a0ef457b1e7fa5beef89db6ec4741523c6b8644ef02ef6a71afd5f97ff07a72e9bf8be750b00 serializedProgramBytesString: - serializedSignature: 199c10bd6c20aead92697c33532af353844db5323858292deac74ad158ba20ce595060eacf909bc17188552c619881498d1113bbba9dde1851e23c0d51483105 + serializedSignature: 6a820144b7e3581c0ee3a8304dbd6887d507c6466ce6a0b2d874e3475414f72164e51e144913b4c74035579efc3f07e88216175e9b93440ba58e4540eefb3f0f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset index 73f2f09..e6bbb73 100644 --- a/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset +++ b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd4fd350143f77ac1b53105111303ef00646a00512dfe5432051241bdb8b316340c1990d966d107cf4d5ffc8ffcd047fe7b4655d7bb76e4023206b766f7b3fcec7ef7cdd6e0993f051b3680a94a5159aa73c1dd0091de36e057d1597f3e48d6f531dfd11da12e666692a62277fa6d504da4d3c35a8899da7b48fbe2cf339b271bf89bd369e78f4105f1bab54129bf2b44a9f698bc6d5580489826c6ab8638af552836897e907666d118a999832358e26879986cc5521b4b7ee0b7d15b5aa98dbc79e3a5540734f280e6ef05ed149ba44eb9132eefd80db2bdf18f9c652f8b266c6c5c5c51f4389961be05ba21a9942f04d1fe6f076461b8249a712ae30d3c2b609956b20a041232f5837698916b5684caa219fdc2bd296b0a22c44995980c5ef100b16ae82cbf699b281f175f10436661933f3f4113defdaa50518e74b804a016c2b70079b76d0d684de2ec40eaf8c5289cd1edc93054dc72bab18f100ade1b92212e6a43d13496d917e13634d89916344c932fa73e116d6bd8e7b1dcf1d1732bd8c7ae7ec34ee848067a65568c3d29be2a30f16f9171661e853861b8649936344fd0a59e2014327c91892f41d1a0b4e1a6d1b5b24931fd5cf1082fdeb18d6d0f3ef5e93f1bad4441b056b8fbebb51e4f13d91086289bc68cca23f1429787cdfc5a63b2f0f293deec94b7c5afe6372bd516b7d9494f8b5600913669a057b1d61b86e6ec39acda829ad6adedd32f67e83a06792ce4eb157279e6118ed7eb544168b97160eb70c3c2369b1a183c1a174c1c1d95fe5620d8e76cacebab2aceb16ea7a076671e7020eacb74c462c133eb744f1ef845e42839ec58f8f343165b1e73de649be318c4c404216b0039f011d1f567b484e65ed7c146b69c30e8ed76cb9be15e297e9cc2fd989dfb08e5ffed2d33ddff37b9e5368d8330ee5acc79eb179b972ed52ceacf8bd0dbccf64f53c1571e564f600144fc55e4cb7b5c759d1b2a4df8ec1b902f69641498f431a97526c9d35a15cc7ce6dd9c14f0d32e5506ef511d3ccbb0adfe1c3d10e34df9328898ed4275d4edc873776f88ad24267b5799fddfcdaf55e80c207cdb4ab91470b484becdc374d47d8aade4b5dc26447536fafe84dd1523c656e03bdbeb545653f8780974724bd14ddc0b0e58d9e0d12c9c55fdb745ce6848057b96fe055935deb3de0399022d1c0c51f0ef400f10f31bdd2f45ad5c251312279e85caa7f5de81d04a38433ffad937cd4efe5331d3ca5956af529d2e26dcffef32c6871167cce2024bda46131642fe28eecf0c121c0e53a67ef4c5b8c677a51e12a713e2071ee0036162760c3e2e0450d6845b2ee2070ca07dccb38811b72812bbb3fcd96dc179958614bc5051bf9601b8f13b694502b61fa88ec70d1bd035025ee4f09b6d88927fc756a2664a0990e39d5a981a3aed6ecfb9f647d095c4ad2b7eaa1c95946bda3fe0e8bdd694617ab497f290f58ab72ab0ab04ed3eb14e3a12e5631f9edec5eebff8a9c3f9bdca49636c6e5a89687e51de2fc2b555dfe13abcb1ae32fe3a454410f1c0000 serializedProgramBytesString: - serializedSignature: e0ed9e8d9012e082ea6b669d64b2db0e0502c636fc7801eef10a1430d6c32e9ef921a37c4b616ad75ebddd50ce415ef03d043d6a179627bd0fb77e8954ff6e0d + serializedSignature: cb088eecc85ba9057be2e57ff7acab5db2875f0e23b2d829dbae9f51d582ced1f8b0cb33b9847b52cbfc5e00607523ced95a2aa0964fdee1b0e293c3a6045907 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset index c3283e8..ec62dd6 100644 --- a/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset +++ b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5bd976134710ad913d5abc22b02db305484850007bc41242c8826d6c8813b66359ce0327c708231b81bc449601bf25aff986fc474e3e24effc09a9aae9b15b33dd331a5b2d30413a9ad1f4525df756757775b79470005fd645bc2cc01cdc827128c153588735fc760befabf8769fbcf48750c7fb0a5ecb9877114e47d4a4d7396b14afb3f8b4090dacb9054b78af727e112af87d16eb56f0895297f153c1525637562ac1343c80fb90b38623442c70a54d9166112e2b8dd729d8c6dc0a2b458d389c95c34b117336396f1595f6ca3d825f19d62ae62d619d3ad450e61396981ec5abc598f89611f73efc24f133283dd3bd47dcfb45fe21e999d0bdf195ef12e5b2bef46e917ed8976e8bf423bef4a4f80cf9d253227d583ca7157a50fe8878ee15f70109eb80289313cf099147b212b6c556fb11792cc3063894697d19c3bdbc9ad18e45a29309d716e861d46c034db8810214d62db1ef34e00a5c565af7a8d527e97d8baf652c5165a1a3c126fe093441cad5f05d915c7313d3efb06793735631671ceee29d6a3d864be86c8f7c5216b0d91aba7705e6f1bac1f21ea3dac1925190c88dfd75e650a6dbcb5631c52374039f6bac6191af2f59d30a6b3f8b690deef36bd8eba7f0fe9a5b0b62afe377559bf38232b58eeacea64b77bbb467a6694443da3bd46f3e5ae49d588487ac51d10dbb1dea23d69f014b7ce4d01d646c9ec45c1997dc69a429ed3238f468cd05188c8f318850eddf2edfd7e06a2816353364eee38c60d7c2336f8efdf5efdf85b77633b42be0d0b4619d888016462cc9cb5b230109e1106cbbbb408afae9b754f4d31469153b48bf5baecae5e21b20c93353b301389ef326cd223cc38c3aaa3a0e33a84499d5ae09254b0ca9c6d35c55a43dc4e732364680ee71d0e406580d4e0958b5901481455e31ed4681d39926a1324dbad3a6891e8bc24c93dec1b56b1a7aa919cc68188cd241c760978ac14ce79ddbb57d2d62a4543348e1f3a9008313136a067bb53e18ae838ec16e0583858c8892836afd3e61677c6a91461ae1b64e78bf5238c4129ed4091f6883f0944ef8a09a969b7184a7555ecbaba8f90e7a2de5adb39432968defb7b4ccbbe06742edb45976dad100b86815746e9b51d987783dac188fdee22b609f8cde3e3d2afbf4767a547980f09f831bd5c7b70e2d96c77c3ca88d33a41951a2dad799a657c51eafcdff30ca5eab8bef3b1c1d549af079edaef38a8934f2565f73785f662d287d498caee16d855b6678879f5dcb3834205a33d0fa168279141480260ade2648de3aadd4cefb36853229067bc92bd02d6c49d5826dab7d70945b78bff0ebfcbb4fe5df34e7588f3be2df4598869f31af8ce52bbceaa474399e9de416761136d708f7cea32d8f1bc7d86667259bed57331de3fdaac19e06e9e3ca29c83fd267f523fd80ca96bcbfb96cd496254c7337dd6638b7ca1e1b1c7375e53c6bb92b972dd620dcae275ab6eb49b6eb7900235aea6c3ca8b23145619f8062edf7c38ed7357bd07da035dc2b6ef7858888c76111df2b9cb30877316f8905c97e492554f2741e1cf0b194dec70ee9909d5221bbedf33b996b17c93a6ab0c8eba50afc8695ca6265bbcdb9baba6139cd79cd41591ca4591dd2d32aa4931a1bea381f179a921d7f127ba2b37c25cfa29a7e24f29ac89fb78018abe89571f01dd6e13b13c7475bc1e78e3545de22aaa096a6911dd121fb5485ece63e90fdc2625e7410db900edb67edf64a77bc2f73a4d1397cc33a7c6755f866f681ef0ea37b29461b176d85b13430f6338d734487f37315ceeb7bc259e23277f1b3c20763db62be58e798d03b5d69079a9c0ecd172a3437b4b371707e98e6e8c38d3cb605aaa89af110a5f06d59b4ce9be188a88e351f720d7ada0487a7bc428c689eda5e457d68de9947d84f76f6b1c2259c03fdf1683082dbeb4959140a77ef92ea2fb3d778a72f2a74adaf1e83a7822981c893854c67d5b1eac1469a27ab8a1f2040c2e169f7c21ebd295a0b3ab84f76a97d28fe5ebf2be0be589d5a14502f72753a9e6844cb8fda75196301def1511b7e11404e3589c43ce5c17c13dff4a22eee13ee8f4cdb75f2dcead150b03f0cf208f49a57fc7596f7d4df3f38b079df343f2ffb773ee023bbc3ab7a582cf0ceebff7ce42bd0c8474780c9416fa028d0403166b237d39ec373b1f4a0ada52a567b16ecd5fb39fccd34f5efde5640eca58f77711f77291b3749d97176ee45111bac61a1d6e2918239524f9a22754022d531492a35bdd2148c1f3c0f4c4964154c92d52f3c901a5e66fff36453846b8c38db1471201177c924712382b825315df8379164e58d76d88c292a33129597df25951d1bfb864c51d9235179c524956714130a29d1e043a7b59dadc10fcd571312c1574d124c21f3564bfb20c648cc9a22312d91f8954912a9a1ba6f13f7e0cdd1dd125dd74cd235a89da3d7441163e4a54c916749e47d6d92bcbc20af868588ba8dc0e666bcc32da3e3e3315374f749745f3749378df0af02a71807af73db1261df98248c10b81bd2fea39183475a5222ed8649d272100c73f4a7b446bbacb1d9b85f22f35b93649e1464d231156d7079e3a1b70da5ff1193516273a688ed850f6607b740e1e877e41c49e11c79ed365c5e1976e53523763e6460ca2bb658f2312263770b372bf8a65f9cdd035aa294517699efbbdbb90e1f50537815e77c235c66f45eebf720ed41fbfca4d6363f69c7feb10ae97ef692fb42ace2f061fa878c9f7e95e2f52476d31c7783125ade154e1bb175fe0f719dcbd8ff0184d773623f3d0000 serializedProgramBytesString: - serializedSignature: acdc3bf33a8e7d3bf618be329b6f9b50778ead9ac647f278c22fff106baaaa2d449d68a7f1551b0203bb5eceb7c58ae9e716628381f297946eb95d282adcf20b + serializedSignature: e9c8ea18f11b729d452d190ce8c5d670ef8b168a27c6e2f1f6a915e8a0b3126d2f2bf21a0fdd37448d553759b7888a54cf617c50c0da5328e806620ce93fd008 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset index 5940f28..c5b9161 100644 --- a/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset +++ b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed585b4f1341143e53d816a48a981834f1c10713300abb40a26f265cbc101508a57d21a62cb060b585a65b15ff82ffc8ff6682df39bb4bf732ed508148806e3ab37339d7ef9c33d3e66cc2473d4753a1755aa4692ad32e1dd201de16d137f004a3687e8d5ae8f7d1ba587b4e8f0d94fc99500fd02e63e4531b94df68077d4dd64be4e17d19b41e463cbb87af875d6a1044655aa2555aa17175dfc0a222447e38a7d82e358476817e62d513a558882d4be3684a58f165ad01a5a37d9bf449cc6a606d07342daa83e7b6701c9a645ab129ea281fbec7c7397cade3e3e33f96122bde81af4b4db279413dedc3dd11a5d9d1cc3a9f0b959810b16d98d404038db565f1659be668566bed43558ce9bd28ad8b1d3561cac252227e6744b072753c5e0c2a1ff36f056906ab869569fa809ea9b66806cedf4c71a9406c1d707bb481b629fcb6a07676a7c92486354db30e9e41d435301339b489715d342c49fb5d34f544fb65ccb525070e90050be88f445ad6f616de7532374297e975d4075fb7f920c4239896600d6b6f0f7098dd20f23f1061d7e707c2341cb43947d4af0c12373e0c8a8c25453de0311394d5c4dc2cd93c545b190ff66f63d6c228bea3c25a4206bdc79a8bfd9ea0c4f36be0e84236f39b17099d629ca488ecd47b8d43614aaceba06f25cd9d235b8e934706737b399bf94daa27b133e6ac6659d6a0c3caa7e1523ab80a3c59ba50b8929c837d35d9d72bf8f4a0e4e5b04c82a25e9d382fe98815b968fc10d2afa1c869aae2d997952a2ae7218433a3b87b79878e5f37203251e1b09a0501367b949b1cd00dbe9c063e87850ce97cf2b28b4fbad910f8a52c7be6c1bf2dd787cf18ed8ac6eec909c4fbe21655305bc32e6b38e505d6cd2ae0516a04afaf25a05aa05c130a1ef964b3f6cae9e38ac5b21bf0139f8d1bd06b5b42d27ce11aee71e1da3bb7b3d76445703a30fd9e7838aae73aebcc3675bf6714428b225ef0343be0ca597a8b518deef2399b87ead93f4693598b91f86dc1786937657ac060457e998101e3530d13c3931f6c0c8851ca2a387d09d1d349991206d111740ebf3438b4e6e19e5da9c83e1efe70a2a798bfb9a01bed698f906c568c4a1d3a827a3cdb0eab5b224b18e24ba779311ee5935d22a5536af525d2e1527bfb9a5741877d772751341c2e1aa31799d945c12b40cc97c3f4408cae9293967596abe47022d3add31872cdb3dde16cb94bc1bf402786293516dac2307d94bba20b5a57fa4e42d98cab7ad1e769d39ba739dac7e2c19bc2a07ea9325867e959b2b9d803159b0bdb95b6ff5e3a4cc7a5d697817cc0dcc355a025ff99b6648ff51757ec5b982f160000 serializedProgramBytesString: - serializedSignature: ed541e87bfe4eda124c3f762026df4581da9dc9c374cd449ff50731b69ed535394d5659f2d63d2309d7855e95fef69dbd3a966fca836920987fed79e30395a01 + serializedSignature: a27178491750817f8b688f2d4f1cec70016b258e343c3326ba3993442d0c35d3f9dd9541bd15b647ad807aa7b8d48d782f14d75da53c552070c64d9d8fe5f800 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset index 6132779..8996181 100644 --- a/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset +++ b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09edd3f6cef44c4dd5d7d5d5617a86a284d2ff6287f5d780ea51edaa56f5ab617553ddd0bfda753aa53fce96bbffb29ad1e998fe1ed47987d5ae1c67c2bfaad826fddda5b766d59c3e735e0de97402f37bd588fedda5cf1dd15bb07754ff1fd147c596eb93fa5587baa42eaacad8861c2206f0a459b32f0676c556eaef36f5acce1d41a5e02209ccaad45fbd3a6716f3a6b4d2ee718fa9c7d1ac299d37a4cf9951935ae67594b87297d62986363957d0ff57e8ff1de6f732931699fd67c971ee7e733ae69f23db2079dc6c2f37f99d641bd2b8499b4cfe79a203a4c5266d36fbbaccf64a939698b4c5e43f64b64b4d5a66d2559ef35799f48cd97fc16cb799ed87cd76bbd9ee36db0f98b4dca415265d6dd235265d6bd25673fe45c756e4117ffdf5d7ff67f24f9b741db1653b6102e96623e392d9de499840bac593bf9b308174ab27ff8c49f7916bee25fb20dde6396733b9962bd33d0ed20de6f8cb667b3fe109e9468fbc2ac217d24a4f7eab49ebccfe2b641bd27a93264d7e0fd986f488d9dfeb9177ccecef23db901e37e9518fbca326ad65e49d34fbfbc936a4a74cdae891d768d28447de61a2b77b3df738480f9ae307cc760dd94ff5d9648e7b84948bcbdfe5ec1e07e97a4fb9adf3ecbfaa8cbfc66318bdceeb7832a8a655022b7e8dca3fccba67e60eb0186be00bfe55e165e774289bd6022c51ae1f63e89c6ad03e618b729b636544ef76fc1ed4474ca050b898e712af645c02949bd49f1112a267f5fe4e8cf010a427744ead0e1a1378d613da4d1fd39f742903fab2933acc8f68e79bd79702794f68b5338fcc65128473ef393d5aa6d3da4ce93d2ed069bd3d891af6e2f72dd47404b5efd2fbe6b0edbba15bbf369ddec6ab65da3ea37fdbaed96790d975b4373adc7ea769738ba9435b03da27b0fd592a91c5281140bfe251530d9727b0c57e29a32496183a41063a325d46461d228ba5edab5709ecebf46510f46f63a68576ff86bc9b2865501f9bcd1e3b1d28f2436845aa94553cddae0695c0bedab61c7665a30af2aab147ed57ff787c7912b4f4f28f59f827e3a64dcb34a9c463126c31928b38c9c5854a5e66f319ecff8e89fa4cbfdee73486673177022368adee128fe87dee2003e87347bafed28dc7cea30ed93d0b62fd760fac19136a321c2c098556823e724829217d394f5a6e2b151c7df48658937b51f73194e3bf1ec36067a7d73559d2a5483ab3a3954b078e60dc56638060995dad968c4a53ca579a15b6e2c1414d4f88c593ab61cb563830a2acccbb70cab1703666d8965d03ae688a6d4503f42a2c4a811765144d395f342bb9725fcdb9a38f722fe184afb10a7fc19753ade2b0ace5caca0796524ef8ba00849771c2d75b845754f913fe00c77c4300055ace09df1840815670c22b03d07c35277c53009aafe1846fb608ffcfbf1ff6257c2d277c4b009aafb3084f60cdbaa616a33b03c30fe8dc8fe863e7b2760fe0c8ec311b66bf8e78f8d8e335748bab6330bb168c5e5c245f6fa38da126dc6eca1c0ebde138ff2de1f6bca9ee505c1725fbf5397a1b6c1501e8edb4a9e4ad043bf84ab09113bcab40c1959ce0dd050adec409de53a0e0cd9ce0bd050adec209de57a0e0ad9ce0fd050adec6093e50a0e0ed9c60986eaff2088e3da837af9b21f629ed91cfa9a4baa353f98f1f9b76d8225b59d891ed9226f5a472a61bfd47b6eabc235b0d13d9725d9f8b6c3b398f3868f308b87b378104c3f58720fc6497cd52f09343f954aa1a5ef06e0ee1611b42b86937aa376eea5d6163f4836b0f87eb4881b8f672b86a6db8e0fedb2c69b56581f901b48f03942810d07e0e50d206088ebe652a3e54f7868210f901708003505720802a0e40bd0d00c4cea7f5cf413c7606fbc610afc3c250cd61682810430d87e1a80d0384b7260cf993e807a7750dde6b00ec51cd24c70153a7f737695f4ded6ff665f641ceec63059a7d88137cbc40c187399e276c3c61ec0bf44ea9abfab83b482cf5bbfeee6f3fcc8e70a63516685a2d27f8648182139ce053050a4eda04c3d402743a0b9d71a9e384370520bc9e137eda2afcf9763fc21b2cc21338af06b2c29f1469bf1b1d82bdbf034b9396795825708a0f7c26786d203a7abfe2f61e36ac8aaa165283eb851fe57cea4c000e7b8c13de1a80f0e39cf0b6006ac3099b70a80ded16f749966716b12967ef255bf84b3672f6740400eb2427fc6c00c24f71c2cf0550120f7225d12956124db64bc2262c012de846fa699be455b89947a3b68d17dc6c130c775760d569a1b76e5ab8f2bd6029dfca97ffdbe8a77ccfd884c3f1b0ce35a36f041292e6e3a7ffd3ca795137eb45afbdfa6a33f9c29b0c7ebca8cd72c904deee599c4513b0663b35540bb651bd68a198c0bb4fd9964514a611d4eb96d417d3a6c2aaddec8b330ad3826b57db6da58fb7cc9e5c94d2bf6219a706eb03976d3e80f7f16ab3d00f422f8f276473872be80ed20a714ed1c1c5ba1e5bacab57ee12e65e7de6055dd0831a3b54367804e319bcee536672aa565dd39f31ccb9a6a5cf6a7d064d21cd601e2db4f4d56b7ee2e859ce825e9b056758ceb028645a1f346734ef44cd9d75521d5ab767743eecb79f9dbe9e2a38ebce71d6f5d9acebf654e4f4eb3a76ddd4565e434d6f685d2794bb221884b4e2beecda67cf0bcaee4eceee7e9bdd7c30edc12b0f63f84af7c85b774ff76a4dd76ef9d1f93ca7f3804de74e4f59d1abd292eac4baecd6ff3e356e254dcfce961354f97471b63e62b3b5c547f9387bc62cdaa6966df1fbb91c3fb63dc4d976d5665b5b20b62dacfc16eaa917380b1fb559b8cfe3a929aa8e557dda42ba982053cb549e1f2d1fe6b47c934dcba605c400c88747062166bbe7f6ea5a378e756d244bbc4fefa2f9b1aa9bb3ea319b552716601574c3e6306238919db7c2d6b3f063cb45ce9637db6cb9e3c396d4b4d2795d22030bae2f61e570845376f8e17a89e3fab88d6b73464b92aa6f0ecd73a8c1149675b6da999e436fa30755a72f7396bdc566d9d59c9639fd98219f96159e130c8d2b1c8d6b361a07d8fa93f2326f2408aac5e8e1347dc2a669579e7d9b6e1c9d409c9ac6a519439ea8b5782d642f67efa0cdde46b664bad1a271357ab707701387d6c3d86a3a2d69764b83e8d1f471d65c0fc6cf6c356261dcfb394d8782d1f47a609a0e709a0e2f2c920511a31792134c247b84a33162a3716191690463f355cee6519bcdc7595f85a5ca7dca59d2ec583f6bbc75ceeccd4e203d6f4093831eaddd9262fd89c540c9b3184966f49997f10cd89a55095c899e54f93faa0ed79ec2a59193da8a41fdcb7de629bb049872e61e5c1f55de09c9853ec39ccb0a279ec2f9a36a903c176bb32eb74dfcf3dac5c6225796268dabd0ef354bc769a9162570adf8a1057a536e2d26e06acbec3ee47fc1bb23e0a28237db68014e3f6cd20c90fab5d461f33be795722d403d8202dca77c03786b03b857abd66f1887adb3fa331d53aa385e9484127852125331629a8f181ef807b1d023fc5c60d57161cf7a64068e0a0cd5b7b57ab017e40d7b03093e37f146d3fc291a08aa2d5e529da582a55a297beb9284566af23e6f4092d0804c01840e37de626dbf2159db5761995df38c518e7baf53c80b0e4ad26a7f693e462c24029c54a900795312d94a836c501f30a692b2b86aa4701d24b8a6257195195ccedcec1cce0c0ea197d5cb616b91c2d640b03d2d896db5c13685a77421341879c0f4f62dc49794c3572e856f05c13713465c1b4d1b7736c821db21856c2f41362b1dd79c61636a941b3d0f6b26b8e624715528fba31921c0bb2205af9dc09b0fa37a8e23289854bd2d1bd1c4ba1de504d9ad3090a5f7d404239a18b27a82ec19e98896de53ab8b604f6d17c1753b3c5c75b215520cd72182eb59495c7cc7f668043bb60f126c6f95c4b6c6609bc596735ecd907b84dd28269a0d410501f85c180d417ad756700c2ad6b5ad21c8de1646649bc5d3ea653d4c0c5725c175273c5c0db2eda618ae6d04d7dbc3a890e93d33c146402c861d23c89e0fc3c3523d33415c625d8d0304d70b92b8e277437e34dbc62401f56258a004639618a8a304d43bc20225380f2b06aa91807aa72428b7979f7abc20cab3156b09b6778511e09d2e4432a23dae0d04d7bbc3c35517d11ed71682eb3d92b8ec43a02822db4990bd571259ea7e12442f5881702fdc4f2a26f8de27ed71a9379b8530c72fd604b41064ef0fa392ba73fcd19dda7980207b298c6620352c3a11c161d11182eb0392b8f81958c1a6609b14b67504db0725b1951a6cde677d05ab665c0a9a22d03eb418d0043d4d0c5a8c40fbf06240131c718a412b22d03e22092df7ca9f28ce6cac24f83e1a0e3ee8e886bc704a0c5f09c1f731e92a3b4b4e09a1ab2b36b83a43a07d5c129afd0e4014ab699c20fb4418c8d287f0827701c4bc6c3f41f6494964b6a9c8e80eaad6106c9f0abf724671d2bb8e20fbb424b2cc71a8202eb171e81e82eb33e1c732c1a1bb582c3b4c907d360c0f4badc888e2eced5682eb7392b8b22f9a8aeefda8d504e0e7c3f3b78688de8fda44707d4112170c37dcbf8e13c208406cd0de44807d318c2620bd9321d8048855c95304d997c2a892a94ec6b1087632aa09ae2f4be2e227bb059f01105b6e7c8260fb8a34b6f43f2113423cbb2485ad8d60fbaa243678506f5e67f429e78d25d1bb9d729aa0fa5a18712cb5d4258a5dd9cd04d7d7c3c325fc948918ae8d04d7372471d9c79682c3713164bb09b26f4a22cbbdd445b0828a2d752923f8be25dd62da3b1a515c21b48a60fb76385ec7ddb613acb462f84a09beef48c7b921e5bee42f843e9a58d7b69520fbae24b262e3714f297857bd68f52c9182b58cc0fa5e18ed68fa003d8a7366cb09b2ef4b22cb1ca047f179e01d04d70fc2c325bc865b0c572dc1f5c3f070093f9329862b4170fd288cf8953e0e109c31131b075411643f0e3fe40b22130bf9c709b29f841bf2052717c52ae53e82eba792b84a94774546346733d613603f0b3f8a4511d97675cfbc70340993593f87628f9962afce98ff75dee0b9c6580763db6e35829303ce3b3e0755ea6d9e09208cefc7f6f396e0ec32c1b6ecd27e410df094ca6460a512c4eb436d96e6b68f2fe1b22ca592805bc6f7b4fdbf84722f36e55e948079ec585d00be975ba35f29fe85b5e1dc817fe395eb65057fad681a8f04350bf16b682cd2e54de075135bde983e1d9cedbfa6b1ac28b175a13eed5fa397257dda91368ef83db23bf3b0ce5e0e5e9b53474da33fd08552237879f89b8eb9496c8f41b3c84b6bd55b6368eb044a9d526e8115e35f65284a4228fa8d24cf3cded8792fd7123e42242142bc9256899250897ebbe4dd817af7ef2479e6f9c8f57dece1bfcff4f03f2c7978a01efe47499e793f6b751ffbf89f327dfccf4b3e1ea88fff453a8ae7715ff73ef6f0bf667af8df963c3c500fffbb244f1f2b4cef632fff47a697ff73c9cb03f5f27f49f2f4fde70eee635f7f35d3d75f5bf2f5807c1d3e95d875a67f61ec923e7e18e5c1bff8ff0122e2aa9d0ab70000 serializedProgramBytesString: - serializedSignature: 1fef209543af2d30b07c42f07f966b5b0178dea5b18a8144d97d081496b59606f39e2e37ed6afe27d9a3e7ad5d32b4e4d8d9a9eac23602d046bfe3960f3b7507 + serializedSignature: 92aa78861b6052e856a93b6ea0d5da60df5136c9ad05e4fcb70f9a438805167abd3a7499e6ca2ca7f6cd875dce9dbff2b5bdaffc85d40d4fc7519f043b334407 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset b/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset index 4deefab..f439538 100644 --- a/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset +++ b/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5adb721b45109d95b5ba58be2048ec0487e0708bc9c52b2754def105e214b99465f925508a12ad4194ac2892ec0abf40f1113cf013bcf315fc049f00a77b67a3d1ee8c56723c7262229576b473e9e93ea7a767b6a59427f0726ee0b22776c4865815155117cf450bdf36501ee01ddc85f58f4407e58fb8d6d076432c278ca4d755e702aedbb8eb8a1e461e8a67281bdc5e163ebe6f63ac8f3baaddc7c7472f278d4115b1291e8a0762d1399f20628f0775659d437639395cd7c52f68f559299ac4e3a6455cca68e972db01940efb3d163fb05907687b86311dd184cca72c31f73b8d659bb848cb724a96597cf2f2bb2bcb9c529755ea1c599fc1a7a0dc93ccdf2272c3725a9195919f19799f926d243be53a8cde5dd853136de151a3f3e518348723930926d19954800998a6697b80b20d011a942bcc614fdc16b7b4285f746614bd37f85a438f060b9d8d4ff1676c0a52ae89b7afb84817f5dfb287919334d0b22abe4349a39e883590fe3822650fd336e166bed8c5b5cdf29e40ed78cf2493c89da263762033f0f603d48480b671df640dcb7c3d624d7dd67e1b753d5e7b2dacbe75942f79b6b8ed1d7cd7cdb92b21d3eba8777a537db0b4429a36610d69efb19fbe63e4341821e833b37219a63d8e4cbfc69878876110645cde4c02196b41381fa8bb253c8edf3b3104c7b7316ea1debf03bcef88af86daa24786e85e620bfa0cfffd4ffdc51f7fd55d77d0b4dbc2a36dc3b99460da306049de8ab3109330dc04d74d9748d128fc8e0e7ede2acb13843fe8d7e07ee31390e19d69900087b6eb4d74a02e7751ddc2064a6ac6182965e4e16045b3652629668235a5833537695893e3c8305873afeceac34a2f3d82790382493a98109cd221c8e7afefad22183f7085dfd631f6272071c4bbe821c6eb0e68c33125afbc19c1548f6781f15cd61e1bc7d3c884705a837029274fb551e2ffc5cbcd4714253a0cc25d1d7dd3935e000fe1603fcba3cff80b607664b2e60cce9f34bf899a8c8e1a8a51f3ba5057e4e3603fc4050bcee7c7c4fea12fc65ed6cc5e56c71e3f28ed5b65af82bae069638b5b1b7c448de368ea1732779f9f370f5983e11cbf3732c745e6f89a1056b43479424ee709c4c4fb3ac5a31417cd14e77514f3f3ecee0417e83aefd02485dc77fc25fa0174bd1edda3f4fc9d63fe2ec48c4b56c1c4cdb48e1bc2f5fc28dc14ccdc144ccb7f41b7fc2b4697541d725554f17e0ed6aa1c207cf102c36b6c228da3d66429a3f5a90e403c08f0386168c684c3a2098760ef0b773e3555d20f8afb1c16c94fb75ff5dc82f70639b01db6c2875d47dc7b55dae37378ddc0546417c9ed8f895aac9e1aa36d7b18db80243d0e59bc1d87f8df62c91d8c7cc423e8ae2b3cda939c92f654a04f26d1dc07608718d885e54f9989e4d4122d14536a29be091c37cb9064858eb5558537d5ba649bcc1995acb4289405a4e7f4dbdddb6de9456255265145caa3e38473fd98de94acc58734db94de87c67fd60a043ce0dc370450a0adca85d13feb24ce927424bbc902c207f013c8a9926b7d0d78eabc6175f1a6172df488f06f4eccd78ef7701d5f15f31c875e423daa2579f5e82aa1f3d31ba7f992eae52b064fe9875a7d882c51a8bdf43f8f82258a821f110885306894c82b2edb5cd90bcc5795bb04bf390ddb5e4bd1f95f27b9961f58fdd9518c3b4e04e094931b40f9b14d2897249481f3b7d069b413dc9a3d508bb640cd29a02ebf89a05af4546ba0661550afd8047556824a13ef33a4a16c3a2d5b03ceb5059c5080fbe434a3a5aabc551fccdb8232ad40f9e9694239b1e53c670b4a5781f2339b505ed1c44852a2c769ea96b8277fb63e6bbe9a5200fedc26c0947caa8be0f7ad323ad2d076fc01e8e4202bd8826c4a81ec0b9b90cd1bb79896ecf2f69d241d05bcab36c15bd42c687396cfeae23d670bccbc02e68a4d302f6bc01c4c5d9a7fe2b30aadb5453e2dce4ccea344390ffa3f9f92623045e320c9509456b6d0729f37c11a7ad7b8ec271c3ceae6dc11e365e386cb4cce065c530d89b0d33c31764e22c3a1b3f475b21d334358f1e8e7b5336d3f657d33927676d345ce8555c07c209c9e5e3bfcafdd0ef771ff0342a4f4e6b12c0000 serializedProgramBytesString: - serializedSignature: 4578f8398127ed399beeb01256a853443f9b934b5afc21c5851b30fd3be5298ff99442ed2a9dae26077075848cfb57d2f98e847dd210a1031962481016de6706 + serializedSignature: 352beea6840f508d79c3419640270f1486909ae685aee701cea9decdb5709987876d451dbe3fa636401502ae8fb11fd80b8a6cee734af3f984e485aa861b460e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset index ee33e44..d3893fe 100644 --- a/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset +++ b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15ac0e108853e2b013dbb163028615603b97130763e290c2d805883fae14c820885c4210497699ca1ba42aef9157c88324799ca4bb77168d7667b45aa11182582aed68e7e8e9fefa9a9d9142168397710f2edb6c832db3399661fbec9815e1db329447f0b6ef9cfa97ac04e5215cb3d0768fddf01989afbbc6185c57e1aecc2a30f22ddb83324fed9b2c07df57616c0eeeb0f6003e39e86574c3a00c7bca5eb0759632467d486cd3a032af33502e230ad727ec145a73c4144e6251530a2e9bd052a6b62360dae9f78afd44621d41db1e8c29b102d07c4d14a3bb703548262aba79d9c54b9c2f0c9f417e6ff232c63f86504679d9c3c70c09f740d75873d176c6f5f2fec3c23d9671a14f98977d425d5ca8c3b29ff71b11ee71dedb2eba09de6f54b8c77280d7275dfd9dfa948bef88708fed631c9ffbbc3ec4db1097906990f67f007d64d909b3b0d1f82c80993a23fd0d14498743b64ec15271da0a98c20910905849866cb0c216d982d44ac68db8c0f7325db3d0234f44c7bd53fce99902992bc03b27987819ea9f9187a091e7a1658ead4189a376d93c18ed2b17956d98b6006e92635b703d217abbc0b6b7a79f48e80eee311b40d3f6d623a871003d81fb0271b849d777c4698eb85f85ba0ac58e22448f2750bea7d9bcb297e0bb6cce2d0e999c47b9d3aaeaedd0e0a8e9294883dc5be46b1f3472111a41e8c3e3dc0dbb2d8aacbf7934f101433bc898940c6d1af3763aaaa95b6016e59e0d0f82c165f44a28b76f1bef8710d0ebc9224706d53d49125435fcf73f7ffc75fdf75f6f99b5a22d328bd2db351fd1ea018bf4a68ca487427d114cb33b8d8cbae13764f053badb6c23fc76bf3cf50bae803065a65a0518338c9d25cd4df633349480d539b6024c6489ed02673243221528cde5cf7ca348d3942801564021b86e3ca4311e9da6c37c89302549ba7ea2a91413922926da6ec5f847a27a8a899ec955550cbee408c61408faf1a042b04b8620ade80a5a11cc409dbd645aa1d63ce559ccb859a2fe02787ec3f3b1b360578d71907c4e0f006f899bfa98f79c495dc5dca2ca3479845ede9c053ebd22a65cd17152743bd8519946b7c434d268ad7d128bfd175e66cc2508da9182b829b3bbde8bc968cdf92d3e4ea51af6db44dd8414d46bc332f4e2ed8e7ba2e105c70f1f23675df8c9b11b54c43cbff955e84564868db6372451293de5bb0d3ba136eca88af8b0ca5e02108fa9888fb480788f84b8459b095b6d342a6c3b262a59e81bdcac701763c68d84dcae926457631ee1fc59505956af0c420c14c69b8ec9a6adcda4a986bd788cd09e0b98d05a95cce232cdd04ed7c18568469f46c61bd6c8046964ba8e467468a24f16c350139332c6ddf16b421dbffa658471b66bd290e0a69c54534ea8285f3f2fe50115e58fce4b7950461933dfc74cf22078c7e5044ba04e7cac3b05e5eec0fb90e10efc0e5b6339527c051e16b15e1c535dca78f88ca8f91c52f17943c6e7928bcfea9c369fc7e0a6369765786fd1236db10ea7eafada96da941044be61957c3765f22db8e4131dd0ad93675c278dca20d20a22c1884a825b320932ca7022ce2f6a6b955a7f81e159bec1704aadfe541aebd32a4d8eaa70f84486c303250eb23457eb6559be0dfd0eee31d914d8410be548aae4b82d93e35b9745d6ce2bea11a5c50da453b60ead87f0ddd94aafcf7beb244ba924bb2393ec51131ab24f229704fd04936d1bdaf29022834835a692ea5399548f1b8a904bc0c33edfcc9369287884f48bfe11781b062e9057a827dac94b4203efcacca25498668d9f00e2ec47a021447b0b00784da8fb9f07de65eaf340ef62b0d9a3213f29aa9ba707e4efce96aa4c3a7f99d4c760112e91430b90a6a5c15593740ab5ca4fee59c8a265c54c93d6e4cf059e5487bbe436147c7bdb26b0cea38e814ff93bdc31aabbebbeb3f86d87cc1201e7d4a40507e1685a762029f10517bed0d15dc4bf6f99ad357722e2f58a04c5a1f7c01ed622bd7db797d0c2add3389f16ad7c4a6129d5502b0f91690cb533fff32898c62888bf8b0a0f3a41238d416356a7674f93be76a0710f3e3b30b87a62d6c8c256b630d96169379fe739398dd54489b14640682652f452a4b0219fd309f92487dc769222c1dec853c3bc3e50277481da27806a7522a81a2d551ba87101d4b44e50fb38a838f1010f0f366d7c62d0069ca90b38260037af13b824076e8fa7a58aebd12453f3d8a2d10663baa0ec16a05cb84828dbe6ce83baa00c0b502eea7667557e2feb032eae0bb82e01b8fb3a81bb29492ec844051029c1fd8ffcc79c57cdc94302c00f74029c50269a22efa20dbc882ef00c01bc873ac11b9558a76a874ce31a32a10bc89800e4e79d02a44677d606645400f28b7600a9cad997dd222302905f760a9097d1224d01c8af740299f2716df71989463093bac0ec11c0fcba93c0d4e8e2dac0ec17c07cd449602e5c4230130298df7412988b9710cc0176654e34d278a281c7f9c20142fd8754fb206190cb5a84dae70c9fc3b2403b4b65f550c1a29f89e0d23bc8895b7d9afe3bfe8f45715c3af2fe81e1224f3164929ee744235e472b16fd54e52acbff1dabf90b45c44cd1795706346f1347532ed1dfc14bd4c7fc0f028bcd320a3f0000 serializedProgramBytesString: - serializedSignature: eb9b4cb97bd65f520e9626ce171840a9e86be9ca00a639237ec57018efd1b9fa612f3d9d774baa585880d85784ec7044158d1285a97735c36b8759922ebed00b + serializedSignature: 9598c37c4ff325dfc969711144c46a7e61b796f349f9969b6ef17fe414033791c9ab164f63a53098c8ac9024654e12e2e931193a858895c61c17ef3d0bd71a08 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset b/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset index 7227f53..74bc12a 100644 --- a/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset +++ b/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1545f7f7e702a18b88285d4141a320a984264a09255285800a2a842484284d42b562efbd61c7de7befa8d8111bf6aed8cb63efe5dd999db9f7ec64cecdddcc3d9759de7ff890cdeecefef6cc77ced49d9d6d90c3bc9f582fefd71436910d63bdd96456c1e6b379de5fc3bced5cef9fbfa78e4f600bbd6d95f7bbcc3bd78b75ade34afeb363acbdf7bbc4dbab618bbc2b17b3726f5b2dce4f6295dedf25deb595de1e3f3acbfb5fe9858a35f22e9acc8ad978368eb58b6d5587c41471518d3c16e3f18a35f57e0f65cbbdb395c2287e931c71aa9df76b9277a6469c9beb19adc24d63fb8968cdf5ce957bd72c64733ccd9942b1e9ef1399f883f99b9de47667b9cdf6fe37937f37947f37957fc3f0fc388fddbe49c2f6046195264fa82cefffef727f177fbfc13172bfb7bf1f6bab6934071a39729b2bb779729beffd6fecfdf94c0af6273b57e0db306e8cdcef2ab78572fba4bccfb360df6311ab90fb7dfceb072b3bbac8f32a8e45fef9916d53b025d9b9be92d52a8d558b14d3b0b9dcf6ab237c328d1672dbdf42a3a5cfa7c17549c2f60461d57d06f8f117e194eff2ed5320cc5372db48a6d973daf12c79fc79ed7863e47813e47853edb8f295a7812d4f6bd73c23af590bf63d3b1b5da5693c2bc3bd006c867aeafc3aedbae7e4f117419ce075cf21d73daf5dd744bbee79e4bab5da754db5ebd66ad7a9e379609f9f7fc98f63c339f2f8407fbfd14b29f852b27383e4769dbccfcb609f6f5f90c75f01fb5e7a6415faf7cf52f97b37b97d51d379b10e9d1392d8389805cbc15d35b62f69bef292d494ac1a2bd68de4f66519fe554def654d6f7d50af4977b93f546ebf94e15e93fb4334bbd4f975daf93c705f785ea5c12ff2f8eb609f6fbf47eeb7b3765ebfdf309036f07cb116ee5779fe0d6dffcd2469b39916e757e4356f817d8f5dd31975b01b5e073b753e5dec941ec64e9dc7d88dd0c2d5879d8aeb6f2c510e2a1f553ef99ad4791b8455c7f9f61316f4fd4f7c8de6cae7b334bd5765f877c03ed4fd5d3bafda227f001b15eb3fc1b13fc031befd4aeabc0bf63dbb9a3d24f75579abec7a43bbafe2a8ec52fef01ed887e58dbadffbdafd3e4cc25f69e7817d50c6365d248f8f0cc9b2c4c06a0f704cb59d4683634a7b3d38067da0991f26e77b796c94dcbe0ec2af07e1d539e8b36343b287f1509c613cc619e2a1b4df34c4e3ad24f1781b847f138457e7603cc6cb6d134dff1d2d1e6a0be33121c57828ed770df1782f493cde07e1df05e1d539188f3de5b6a9a6ff81168f0f2ce2a1b43f34c4e3a324f1f81884ff108457e7603c7667c1b2e865b0efe5c1cd4ed0c26d60c1fa77030be643a5b33ea8d34ac5594ff74f355efaf9cfb4f39fc9ede79a1d9f6b767c21cf2bfeca7ebd8e7a0fd8a1ae83e73fd4ae5765d5cb609fc7ef362ddcd79a7d5fcbedce9acefaa0cee6cbb4b4571cbed138e8e7bfd5ce7f2bb7df69767ca771fa1fc2499d5775eb7bc00e751d3caf38e975e00f2c5807fea0e9ffc812e5b6e97a755ef9ef4424dc4fda7d7ed2eef3b3164f75dd2496c82b3fcb6d298be7add6aaad5edfb6f914b9fd5bf39bbfe5f62f166c53ffe5c7adb5acc7b660f2f85e72fb8fa6f34f729d2d54bbd764e3de2cd8369fcc8279e45f166c9ffc2b35e748db547f4ea5c57f2ce86b93c171a8b73ea8d766b5dc97ed4b319e04db7bfb04ed8a9f5fa79dcf03f785e7651ac4b66681f6a5d8e7db76c8fd76d6ceebf753edcbbdb4f35383e1c4101b685fc6f743b4cdf99fb06d2ef63d765b2a3fc2d84dab839d3a9f2e764a0f63a7ce63ecf60d86ab17bbfd34ff9bce12795ce5c719e098ca5b652c9eef0bce91c7f697f78d25c28bbff9ff9972bf010b8c9b897d2f6ddaae4a6263b9dcaab6a3b435d69005caf1980a5f69b8ff2c1007d52ead02c7a4b618ad6da6dd272b11d73c35de28c701628dc1bd1a81f0ea1c4cafd972db58d357e349ef80fd54e2a1da41301e525b8c19ebf15063b0a67880b1d55853105e9d83f1a896db269a7e0b2d1e6a5cb03ef190da3138d6a7eeb3599278b402f76a09c2ab73301e07c86d534d7f732d1e9b5bc443b16c6d88c71649e2d106dcab3508afcec17834d274b76481fa5dec83724b8cabc3fa5dbf5e9dff481e3f30789ecd3170989b884b7bd59fac6f3b40d9335fdea383b4e763b0ef8569bf3e89d63cb95565794716a89fc5bea7d1a1a56f7387e2e0bd639d58b07e9e078e43bdf541bd8efd647855c77465c1327f01380e75b795e13ed1f655d9dd4a1eef2c8f6f00fbfcbedd83e1d842b93d4886ff543b5fa3dd473fbf481e577d8854ea5d65dbb39a6daa7e58aca5cd9284cf741e2cb7dd356de5b35d346df93ca5a3eacf2dd5b49725b4bb3f8368ab7a771b4d7b1b5fbb93aa27966bda0727b4bb1ea36963e97e48f0de68fa7f5e47fa77d3d2bf9b6f6be78d91fe2abf6a6925f64dfd9425f29edbb160ff43f9cff62c51ae6c0fc2f26d7716ccbfdd7dddaeaa1f9fa5dd6307162cc377d07477d4ceef28b73d800d3de4365b639eeddfbbcb28ffbe5d566969bfb396f68782e3d0c65d5830cfabfd37a56f291f5169bf9366c74ebe1ddbaa678c870579c6d3615d1df6a9ebf2b4f3ebb4f3d07e705e318d5fdf534b7f75fd30edbcae7fb8e61f4a5fa5432f166c57f7d2b8e9f139423bafeea7da5f2a1d7a6bbed05bf3951c16ecd72bfd15da79a57f64305c2c9705dae5a1f3682e725ecfa37abcf2b478a9f451f152cfcadfd338e707756ba5eff6207d79d9a7ca77ac1c50ed8c749421074b1b0a98b90c296489fc5b08c2f26d1f162c43faf8badd4f911a59da3dfa6afcfa6abafdb4f3b2ee8f15011b8ae4b63f0be6ddfefebdbb9de2dfb79b1a1b547974a0e6d38782e3d046f5bce6136d5f9621ddd5f34a55860cd0ec182019c8b6323b2ac8132d4374fbd47579daf975da7955861c1c3caf98c6af57cfbd5ed2ae1fa69dd7f5551952a0e9ab7418c48265c8208d9b1e9f23b4f37a19a2d26177cd1776d77c65300b96214a7f85765e2f4364b8d8106657860c41ce6365888ad7502d5e2afd55bc8605e315e73c2ca85b2b7d0b41faf2ba4eb573325186c871e35831339721c35922ff0e0761f976040b9621237cdd6c758f2ced1ea3347ea334dd12ed7c89dc8e0436c8e772b13d5830efeee1dfbb8764b8839afba2d2688ce6d38782e3d0c6f12c5886a87d598664ab3939aa0c19add9315a3250cf2d8e0ef244cb10dd3e755d9e767e9d765e9521cb82e715d3f8f563b5f457d70fd3ceebfaaa0c29d6f4553a8c63c132649cc64d8fcf11da79bd0c51e93041f385099aafecc9826588d25fa19dd7cb10192e3691d995211391f35819a2e235498bd7242d5ea5c178c5399706756ba5ef7090be9e9ff6e80cfcadbe65883ef6a0c6783f06fb5e989d2624d152cf085479328505cb8c2952e304dfee9d5607ef1d53e3bcaf06f5627b697aeb837a3babfca6f2d7de9a3f2e00c7a1ee3e2c98ffd57e2a63ee5859abe23e95d59ef3a1ee3b8d05cadfd854709c6ff7d5b8edeb6be4dc2575b234bdfd353fdb5fd39dae9d9f2eb7fb011b9b689a65da35659ae68ca0efc6fd66ef84a60803b8c766ca6bbe00fb5ebc7ade160caf9e7da3e13f04f6c3eb8e65c17caaf2a38a53b916a7722d4e2afddf0beab3e3e47e85e69fc7cbad2ae72a83be20f6d5757c3b4bf3df597e7c7afd1d0c171f9fa992e1bf04fb7c3b5b1e7f5eb36fb666e757c1e3225cb3e0352a0e22aeb00c5571cb03fbd0cff5eb67585e5f6e79fd3e96d74f0d777dfc7e9fd511fe833aeef74e3dafdfc7f2fa72cbeb67585ebf5ff07a9507e3759ce223ebb89d950fdbd471aa6c3e8025f2816a771e28755e06fb5edeccbd490b77000b9401b10382f6c4e6687e361a1ce7db6a79fe6b4db75ad3ffca8f77eedaa04efc3e9a8eba5ecc17823adf68e74781b8879dab3e4be3389705eba9b93eb3bcd9beed79ab6478550ece0bb2537ab1799ade7a4defcda08e7856942c0eea7e0bb4345de0eb15e46ae1166a69aada858ab56a1f2a1fab02c7f976be96a6cace42701eec33550f7c0bf6a15e8dc6b546da9d1d0c1fb74fb5435f0aeac475176bf65782eba07d7af86ffd742c506dbe2a43bca00f2a9dbad227998fa9e7e54b8086badf5256bb4da5da32aa4ff43608ab8ef3ed728de9725fa38f6a1366697a87b060f97488a67ba8765ef5310f0336ce90c70e4f1c8b1d068ef1ad1a0f7a17ec73bb54fc1a6b761da1ddf708cdae152cd8865921af2fd3eef7be76bf5c4d073ca3528cd4b9b8df2d658132bae021702d0fb7bf851fc83e02eb9742d893e4f6448bfba9b1d093e5f6d444fc8bc6a4707d1b9f635185bce66279fc34a0c7b7a72774471427d195e163474ac6df817d7e9fb5f23e1f26d190fd42f1ee5533f0b7777d5ff9fcb76f5719b60712966f8f06c78e96d7abb66a37cd278e66c1325cf5c18f021a47498d55f2daeee038bff6152d9c7ade7d06abfbddb1f672abca0cd5277816ec7b9afd54597a660ae9a334551c8fd3348f939a6a5e6637cd062cbc6a5b9c95820d1a67b10fdb19ca46d577385ebbe7f1fe3dfb77d6f4bad6115ecde7ef288f9fa0a5d10932dcbebebdfdd51c88edea08afc6d6ce4e21ee3d81a6cadfbafdea3e6f05efc387f96138715db23242e5e773e5563de3392f61d78064ef7d6ae5c18045f21a95d6e7033dbe5d09e27b53125d193e76220b960727cafbbc2beff37d128d0e2ce8972769697e92af355071bf20055b95a6f2bb9335cd93a5a6e2a8a71b127e57d55652f34e4ed1fce814a9bbdeb767a09a73bc7df2f0bb2a3fb83085b8f5049abadfe9f950b5ad3a04cfc7ed7856b3e32a4dafb08ef0aa0d7c510a76eb9aa7b260dbe7545f7350e760b894f386f4ed4113fcfb0e52e59eaa872fae43472f4f4fd3e27c9ad47f9719e323f4415e4f7a0fe597a76bf738ddbfc76ef769f790fe113b430b7f860c5fecc779b7336478552e9e9988b3f89b87956dc27859a88751bacdc0dfa9f04b957392348c9d25e3a7e6e85f0a8ef3edd92c38fe7bb61fa7dd55bddf4e6e2f49d1d6bac225f3b72be47695dc5e05b42e97dbabc13175cf6b583c6f94a8fc76a5dc5e6661cf0d72abea3068cff5067b543992cc9e6b2decb9516e55fedf41a6ddf7609fa7e1b92cd8ff56e5c379897bc7ce0361f9f67c162c3bcef7fd60c8df9ab6ba6e250bf64f56caed052cd817bf40ea5c8584fb410ba7da805de5360fecc3beef79c1f3621ff45186b4d574d47ca81f3526e780f420e0376c5f4dbb9efc866e40c269fc86a9b253cdf73a47bbdfbae0f138bf73c2f11d5a9a82bf2a1b2e44785e04785e04c2f2ad2afbd7827d2f7ec57afcd47597683c2f91e1d45cac9f82e1e3f1ba2818af612abfa612afcb9078ad02f15a05c2f2ede55abc2ef7e335bca5a6adaebb428b972a23559beea760f878bc5605e355aceaa86ef2fca5c0ef95dd5702bbaf04e192d9bd5a6adc2c8f5fc502f54d4cf134b4abd53de2365f19b479b84aeb5be4be6afba530f61b68e3a87a623bc331d8e64ba67baba60ffacfa22fc3b7c726e2b853cb7ade47bd3b9867b8cfca14eeb35d8af7b95d6eef94db3b129a6307cb63ddfd341e99ac1f946a9d743533e7155557aabf5558bebd96057dee5adf9e51ab346d75dd752c985764bd1dbb9e05cbd4eba54e3f24dc0f5ab865c170b5f29e3aae9735d704d352ec03ff1ea9ae33f9ac6a4b7467b57d16cce165ea59f1dd72abe68e845927e81eb9bd37892ff434dc3b95b1baee2986bf8f05c701557be1062ded6ef0d3a464831f7e0fddffaface37e4af746a9abdef354fe7813b85e95c5b732b3efde96081bbb0d84e5db5b58d0776ff1ed1efd8da6adaebb9d057d57e6cfd81d2ce89377f83a7ba8f87fe36f47afd1ae93f93276a7bcfe17b00fcfdf25cfff0af6f9f66e795caead10bb47eeab7524ae06c7f9f65e79fe0f70bd3aceb7f7c9f37f82fd46c06e557ee4817dd81ed1ca45b10ff2d21eaabf728daf3b46f50be5367673c2a7c7c879d5aa0f1f3fa7fe06f9289e8ecf827daebf52b3bb2bf03f10be960ff2fbafd5ae2dd4ae4dd6df4d9687ee97d7ff9542d8074284ddd68ff3d81572ff41b9bd43c643ddf76f6d5f696f238fab7bbe0cf63ddd716d35bd0713e9a1ae8dcfe17a486a7caa9daf011aa6f361def708d30753efc2aafaaeb51fa73dd5731df54edbc35adc1f967157e33d6a5ecd2320ee5b826350e30bb0cfb70f25ae117f7bbae33b0735e2736d1ed23454f8d532dcc39add8f027ba41d717f55ef0f7fa81ddf15d8f3a83c36a876bcc45a24baf6ee2c9e4f1b7da3d9f298c6f031dff6092aae8ae1e340b72d380635be00fb7cbb1ad8bc5aeace086ac419aed634566b69aee2acec7e02d8a338630ce1ba48cdc0f53a4365d36e066d13c3bac6f9f87dd6807bae917152e3fc8ad3932c382efd24080fc761d5f52b93dc5f8e2feea99e3da836463b10a7c7355eb03d2c6d32b6875389ef5320be4ff9b64c54f588641e53ebb57d07f65578185f75fd0949ee2fe33b51951daacd02e3bb46f303185fe50775c6372b26ded51ec52a59195bc072f84be8311efb54970f5557d6bd70a878df9dffe23f3b8adb2e62cbbd4b2b4dab774e166b832e62055efbd4b47a6707f14eb3bafb30f1bbcc0b512d44ff89d5bac5fdb56ec18d9be3fdab044b8fd678c7478a954bf9e2a3d5de99de6c8cb7e557cdf0504ff3fe0555a678b79dc3167b7ba5deef05426f866776ed907545892f53aa5f33d1d3f457519deb1d51401778fb73848593c4ef25c2d24a617d89776c9158d3751eab6243bded3271b7da715fe8fd6dba67a94466b6d1bc982a76dc5fb2552553b1171b6e7d8ef0f3ff4b918d91221c7d639e3ff84fa31c51139d542b25fe8fa15fc8f08e6689d4c813c8628163f92c47cc139a588b60f838d68ea1d9bf7dde455e45972c2e66323cb93b89182452f8ad3b8f2f7a7887e5ef6405a356c0721af3a875ae236ac9c072bd6cb1ea4b9828646535cae586eaf86326fc629afaa40ce2f7c3558b70e113a0b1a8fc820920967128f5fe58e6fd9f038c9d2f2251c1a60ab3386a7ee32aef1f37be567ae572f1260279ed0ab52eb331e80d4cd0c55a1ea51bc5e7b1e5bc93636f1a8f45027b8e682db54fe29cd8bd44f3a9a16c43a9ecd36c70cbf9a7ecfdf9c56f8e2dec3b30b7ffe559e6f4692ed2a73e77c552a8a129859a673a5bd45d0f244b9f16f17825d287ff9819b6447cbc2e1b30828d4c045b6c1c1fe7b6d7cfc7f9c4f75d3486667ead92fa60320b3082592682a2c731398304c77b161e205b8ff563b879ca0c5b0b861d6ac52e151b308a8d0d147339c52d4c6635d3cce21621c24d30e13696c24d31e12d2d859b991c6ab34c67497e6ebe5029f3c28677273ef6d2532fd6ccfeb4159227eb3601f3a6e6a6b4e108b7365aa527ce5678e2b4c094dbd92ab7c494dbdb2a6f667228f1de6ee6dbeef5ab237959d32ee53ab2234bd6f40e5b43b632d113abc1ed4b4aaff69092fa6ba877ed6c8fc312314eb0d8bbde3404959c68a7944bfbce826657661a180b671146787393e773ec5db064d79dbf23eefcadb16cb58d6db6dac2a4cce3b26d2a1540675cb80d66725783c9b130266f6952e635643766e89b195137c1d5db62eadba5437d2b4c7dfb74a86f6dcae5c277e692e6f2c9de317fe076b8385b2d7abb89f1c06af1a1a785f1f614167e8297ff968b4f46957bbfc78a0f442d16f6242f07baa75c0ef410e5001f09a2b7192b29da61396307dbccdc1e2b83764c4319d40113cf4e8378478cc94eb64c3a61ca3bdb2a77c6947bda2a77c1947bd92a6f6352169d2653160a51dc6f8b99dcdbd6e4ae98dfe5a4c1efba61e2b96910df0e639267cb647b4c39df56b93ba65c60abdc03532eb455dec1a4ccabbd3ea938750f5c78474cb8c852381b73bbbe6970bb9d4ce2bc33d92f1e3821fe9ff7534bbc252ebe3366797f83e50d425ade13739101061709d566ec8531196860b2c264761226bb60e2bb1ac4cf0829de1b131f64105f15523cc7209e23ba0447b2cc760bcdb313468a8f9a560606e5120f5778038c5ba41e4f4ff4b6b38415fc38b7a2ee590dc91b96bbc5f980c70ea267339ca53ec7823e167c1e5073513b9b9bbd83196ff6ba6533d63cce35393ceff40c61862e1277d6e9725084df7f9e3835c1bb034fcd12d9680fd389cac34ab8a186122e16b284cb376538d1a19db751331cefd3f0b91d35e2ef2532794bc5bd13cf1c6db2d2302f7e5d0c359ba8dd8c4e5b2c9c363f05a74d87f5983b1660e5ef7043f9db3d16aefc2dc47c6d84c1d758485feb83593ed260794548cb8b30f15106f163428af7c5c44b0ce26b438af73389f346065f68c9aa1dda1f531e6dab3c000332c604a44138200331f1b106f1bb1a8513df15f3f07169f0f041a6d2540ce0559396a6c9c68e821564b291235532a63ecec5975d4d6d9c6b82283b79c394ce56acc4dccd94e4bcc2ddd3647e889a797753728b11d54c3ea4861371eaf7907a62cac93889991f52a76203963c83b1ec5e6ac8ee2bb3c265f72126f1964c7e71476f498bf1eafa3d82172bc73662fe4f6fefa7495698c7d3434d76f2b6e45e063b73798b9f2f99d54024ca3e22517a27c95ba6c673f8dc552b3e83f1f80cc38ad9a98662b661c862b618cbd07c79db5a2d725e259900746587786dfbc3bcadefbb5e9b43fc3ddffbcd235f252705f37cd9553c805be4f5ace77bfd8a5dbc23650258a577a632dec0e38a79427196c8b973c575fe143b8e969fcff7ce0ff0b605deb65ba8d26638e6cafb9a5c84bbf27e763e3902c3bcbf09f38cb460ae3fccae6c299b2d8bd3aee2b9299fe93847eaf239c715deb145e2ac7ffd02a15b25aca8f1fe854b8e9158b135dd506c5ddc3c5cb135ca54b388e734999c5c30c40bc53d7d793dea941929d72965cc3cb120f9ddb1daa4c4942c9cdc4c93417a9294e149b2872949c403ae4cce8ad44bf07089529e72a25430f38cc8baee8f25cb68133df1046fcf0cd24b65cebe995c65cae46609725bd58a55d269ed08b5312667e6d4c47710357326986ad159b8438fc50ab0d98602aca245b8026c1c6679b5c1f226212d1f8f597e80c1f25e2dc3593e01abf50e34d57acc647a925a634fccf43906d37f0e69fa444c7cae417c42eb70e2934ce2bc45c7070a6d3bcea598f8fc34884fc6c417a4417c8a499c77f90f329518baf0045c782f9330f7ac85a9082771c1bd312fa9317849e116e1bc641f93380fbf88218d54b11474fd1ba953314c4b4cd995174b611ba9bc3272b13f300d43bd1443bdcc0ef5be18eae526d433d3863a3a7d82fdb0ac75b0216b8d6a1b2e6bed8f156387a4a1189b8e891f9a06f119581979986519598679e4e19665e44c0cc711061cc6290b497094635eb2c254006f15ce4b2a4ce2bc1d7f642a4892f47f2a31e1a32c856761ac8f4e83eb5599c4793bf49854ac4ed2069d8d25e2b18644fc3b64225663e2c719c4d76c1d4efc004cfc7883f829edc2891f88899f6010dfbb7d38f13998a79c98064f998b899f9406f17998f8c969109f6f12e72313a7a4e2e315b8f00293302f35f9f2ceb52a7cfe90346c85bf88c11790c3b5aac255cd07617139cd14177ea26be0ae61eeb510bbd7e9a67bf18a70baf72fd7fb5f5eeb21183fc357225928c886b1a206b3e20c93156d80157365e3a74cb0afbf058b300bce3459d01c5830ddebfe2c148f26c2d5db8bb1e2e72c53d9d6315cf1b304cbc467a721132fc52c3fc760f917212d5f86597e6e1a2c5f8e597e9ec1f2e24ee12c3f18b3fcfc34587e08e69f2b4dfec9e7614d9365d97e5ed9304d96430364a7c33fb6b7d8eec276f37e0f076556b9109ae3fdc55fe358e01d9b2dca97656210b3521cad0859a61d8ad97f81c97e3ead2261d150ef448d2859559c06c8f8ec677830e397d97a076aae0851239ffbfa5d313f7e35cc1f905d2eae0c13a7c34c71e20e7261fc84d6ab15eb283761fe4f6fff275cc7f670ccc92e363859a3904e7604267e89413c2ba4f80a4cfc528378e390e24762ee7599c9bdbaa7943dfc7e798eb72d94c7fcac7208eb23c31679db300e7314e630ab3087b9dcda618ec6ee790576cf2badef790c96d457a5a1243cd624ce9b905733bb26e47118a96b305262e9e52c482a1ca7e3314ed7a581d30926715ed75dcf6ad77537f50957d79d6812e7d3f5f8cac356d3f54ec2946fb4553ed9a09c235e9e9bc132317f78122b66a3e395596f797c82a758262a9f856c88b84362be6df08ae44ffd6e3279bff1a91f5fbc375b9481e9b20c7b26780ae682b7185c30b7289c0b9e6a12e7c9796b2ae5c0cdb8f06998d5b719ac3e21a4d5a76356df6e69f51998d57718ac5edd379cd56762e2771ac4b3fb85133f0b13bfcb545085143f1b13bfdb207e5dff70e2e76089798f65629e8b597dafc1eac103c2597d1e66f57d96569f8f597dbfc1ea9521ad5e8959fd80a5d51760563f68b0ba786038ab2fc4c41f328877dd359cf84598f8c306f137438a5f6c12e7f5305f83daaa1ebe04537ed456f952cc47565bfac86598c98fd99abc0a33f9714b932f3708e78817fa33bb60a4dfe1e63ae16732f1a59cb73535838ded9a350c5bfd31b90d58ebe50a53d2f0ecf5a4217bfdbc7bb8ec7525e6514fd97ad45598473d6de951579b84b9473d8325932ebe0617bf06e3f1ac2d8f6b31e5e76c95afc3483f6f49fa7a8cf4da3490be0173eb170c6e7dcce0706e7da3499cbf1bb02e7e427b37e045a6de0d7889d5f5de4da97ccc52c36689fc3b97f8cd809b4cb1e14f645f36c586c7e11511879c2471d0d7c8a9effa38219effde8ca5f8ab86145f393c5c8adf8289af3788bf1452fc564cfc3583f8a123c289df8689bf6e10df1052fc764cfc0d8378bf91e1c4ef3089f311bb37532978920c50de8909f38fedd41a46e54b21f2b7d7fde705e5c235fd294a61ee79175664bc8d1519fceb4ff28dfd1099f96e2c6eef9ae2c62b88e96c84c88afcc9c1ec404cc3c4ef1ecc13de3378427149384fb8178bd4fba648b545136c1ce38f771681872e61a2781f16c50f0c51bc2b6414efc7a2f8a1298a7c77787c458330917800bbcf47d87dc630be82c39290fefe20769f8f4df7e103dbd3c002e903e28d73f3c2e8fc3145186b1ec2acf9c4640d5fed2af9fdc3dcfb61cc6d3618dc66f5f8706ef388499c37e63e35142b39623db2fabd2bcabf95d5584caef77e4c0f0026e1463e8a11f8dc40a0d19ee108acc6087c612a5839812f2da2f298e96ebc31fc15b36b0c3f8e31fadac0e8e7908c9ec0acfec6d2ea3598d5df1aacde30319cd54f9ac4798dc5bfbf64d5a579caa4cc9f48f12fd5da3e917a1a13ff3e0de2cf604c7eb065f2ac4139472c337860ad0263e3ac9450d73a9be1574bf8d1e4fec65117fe19d7ba7b3cf6f662a334cf61a5dccfa9e4e02405daf398f02f96c26b31e15f2d855fc0b2c06fb659601da6fcbbadf28b98f21fb6ca2f61ca7fda2abf6c52e6e5d85f6928c75ec1ccfedbd6ec574dcabc1cfb2715bffb09175e6f12e6d5d7bfa90827991ff11a06fabf34807e1dc3c1df94b4c1f10696bf63a90827c9df6f629c1ba4229c84f35b18e786317bce6f63381a59e2780713ceb2147e17e3dcd892f37b18e72669e0fc3e86a3a9258e0f30e16696c21f629c9b5b72fe08e3dc220d9c3fc670b4b4c4f189499897fc9bc52c4bfe0d188f5669e0f129c663734b1e9f61c2ad2d853fc7706c91061c5f60e26dd220fea5499c8fb06c990a922443315f61bed7d6d6f7bec6786c95061edf602eb2b5a58b7c8b09b7b314fe0ec3d13e0d38fe8789774883f8f798ef75b4f4bd1f30ab3ba5c1ea1f31f1ce6910ff0913ef9206f19f31f16dd220fe8b413c477ce080bf7299f9318d74acfa967c4463db54bc741f9cd8af98fb77b574ffdfb074ee968674fedd24ce1f036d978ad5495e67ffc3e440e24316b3368a03d139cef62652c6a130be8271768caff24f61253600f6a72989794af4482589c5aacb66e1bf4cc2e25b3bb66d82bf31e51d6d95ffc194b36d95ffc59477b255fe0f2b00764e4301c007338c66f7b4353b6652e666f74a83d90d30b377b135bba149990ffbf4b61cf6696412e6bdd91ccbde6c16063a370da01b6338f22c71343109f374c9b76c4137c5381758726e86712e4c03e7e6188e3e96385a60c24596c22d31ce7d2d396f8671ee9706cead301cfd2d716c8e090fb0146e8d711e68c9790b8cf3ae69e0dc06c331c812c79698d5bba5c1eab698f8ee6910dfca24ce1bfe832d7b085b9b8479676d88659fa61d66f1504b8bdb63c2c32c853b60ed8262db7641474c79b8ad7227cce946a4c1e93a63668fb435bb0ba63cca56791b4cb9c456795bcceff6b0f4bbae98f0684be16e188b31b62cb6c3dc6e6c1adc6e7b4c7c5c1ac4bb634cc6db32e96152e6931a27a4928c493ee1b903d68cded3b219bda34958cce3b51cc0c9c6204fb285bc13a65c6aabbc33960b275be6c29e983b4f49833bf7c2aaefbd2cabef5d301c7b5be2e88d35eef6b16cdce560164fb5b43817139e66299c87a1d8d712453e66f17e96161760bebc7f1a7cb910139f9e06f13e58c131c3b6e028c2cafd32cb72bf2f56eecfb42cf7fb61e57eb965b9df1f835c610b7900a65c69ab3c10cb2bb32cf3caae983b57a5c19d0761e5fe6ccb727f370c47b5258eddb1c2ee00cbc26e3066f18196160fc184e7580a0fc550ccb544310cb3789ea5c5c5982fcf4f832f0fc7c417a4417c0456701c645b708cc4cafd8596e5fe28acdcafb12cf74bb0727f9165b9bf070679b12de4d198f2125be531585e596a9957c662eebc2c0dee3c0e2bf7975b96fbe3311c075be298801576875816767b62161f6a69f1444cf8304be149188ac32d519462161f6169f1642cfbadb0cd7e5330e5236d95f7c2f2df5169c87f7b63a48fb624bd0f267c8ca5f0540cc7b169c0310d133f2e0de2fb622e72bcad8bec8755dd275856ddfb6355f7899655f774acea3ec9b2ea9e81f9ddc9967e57861576a75816763331b738d5d62dca31934fb334b902cb26a7a7219b5462e267a4417c1606fb4c5bd85598d967a5c1ecd92671fedcfbec545232c973ef6a93305f16ec9c5484cb70e103301ce7a601c781582a9e679b8a7330b3cf4f83d97331b357da9a3d0f33fb8234983d1ff3910b2d7d6401c6e3225b1e07613c2e4e038f8598f8256910afc1985c6acb641166f66569307b3126be2a0de24b30f1cbd320be1413bf220de2cb30f12bd320be1c7395ab6c5de5604cf96a5be543b006e535960dca43b106e5b5960dcac34cc27ccaf875a9082799327e38267cbda5f01158b3ef06cb66df0aac6d7da365dbfa48ccdf6eb2f5b7a330e59b6d958fc6946fb1553e0653bed556f9584cf9365be5e330e5db6d958fc794efb0553e0153bed356f9444cf92e5be59330e5bb6d954fc694efb1553e0553bed756f9544cf93e5be5d330e5fb6d954fc7941fb0553e03537ed056f94c4cf9215be5b34ccabccdf3702a554a9235c5cec64c7ec4d6e473b036dda36968d39d8b89af4e83f87998f86369103f1f03feb82df09506e59caedeee465c53cc7e55e23a56734fc5fd5fc1995d80a5c61adbd4b81073a227d3e0441761e24fa541fc628cc9d3b64c2e3129730f7dc632192fc5783c9b061e9761e2cfa5417c1526fe7c1ac42fc75272ad6d4a5e81a5e40b96297925c6635d1a785c85d5a22f5ad6a2576356bf9406abafc1c45f4e83f8b5988bbc62eb22d7612ef2aaa58b5c8f99bcded6e41b30e5d76c956f34d5cdddbcdd18ff427be6ebe629cc5f3080d7a205695edce0f5185fe42d082b673b1ed79e0c5fc6c0ce22ee57e057967931853762fca57d3a2bb0e5146ec272f09b69c8c13763e26fa541fc162c47bc6d9b236ec5cc7e270d66df8689bf9b06f1dbb182ed3dcb82ed0e0cf6fbb6b0ef3429f3e2e703435ecddd2e90976486d2eff6063eb07a1776b70f29ee76b7e96efcc3361fc5ec3f6c730f26fe711ac4efc5c43f4983f87d98336db075a6fb4dca7cd4fad354fc3fd9d71230933fb335f941cce4cf2d4d7e0833f90b5b931fc694bfb4557e0483f195258c474dc2fcd9d2d7a9082779b6b41a63f18d2d8bc730e56f6d951fc7287f6749f9098cf2ff2c29afc1587c6fcbe2494cf9075be5a730e51f6d959fc6947fb2557e06f38c9f6386cfa39c2276f9f791277bed4cdec6f7fb0373c5df25f1cfd2ccf22ef1fb0325f190892feff85fe8a9f45aaf4b44e8de6cbaf76f92385be1292e16ed78ae9bb8a698f18fc3f85f6bae6023c477d2e68a3bf8d726dafef09326c133be7d055e0ca72789056f592f66fc232889bb978afe8fd20caa4ef1aee2a38a61b2cdb318f55f4cd4873086c4c32737dfeb8f4df7ac3dc80b5e26c638790f41b713c61e3b1e3cc37b6ff3455f827f932e4cfc9ec3e2f7ab297e4568fc867829b950a4ba1f53d51b4a1637ec4c422b4c4c9ec762f29b2926fdb498c0e5f0ece362560b139bb5586c7eafbfdf8d11b9b0c6cb23b3859f6c4cbf7b018bdf1fa6f88d6258dfbbf6173dea977ae1d5c3c4761d16db3f4db11d14c2377959bc28e594844ae9281d5fc4e2f5572a790e96fff679ceac1626362f61b1f9db149bdd53ca73433ca215c2b3aa8517d9e7b9c49930717b198bdb3fa6b80d88b71e2679f5f9682f9f9779f7aff472c922319ee8c7c71f45e4f695787f4d91355a45d2d2307d25c82b588cfe35c568372db582f78529c64b8232cf7b968b2f1156b13234ed821ae98bd9ab58ccfe33c5ac8716333d2755c912628c28c1aabcbf67a7c9a7d66376b206063b47a7945f468ad1d132d93a5535d578efef44ab6963d65baf61718e99e28c2fc00bf344309de6c9f672b2f22d8cc5af6316373059bc6b889a36687715abbd6e365eb39a56d90e13ab37b0583534c56a58929ac78fc508f915e732431985f753cc3573ba52ee4d2c8e8d4c71ec83a61cef91cdf402a9b88ef1e25ae58558289efed4ae63d3dd4a780b8b4796291ec516e5c4c62c19dec662d9d814cb5c34967af93db2ce165e3acaf27730eb9b98accf0fd1420d6b7f7d4b8477b1183435c56052889219efb5d7ad905a9874f9e07b188366a9a462b2f678d854ac6f99f73e1683e6a99415b5cbf5d4465cf0123e78265de9f40116cb16a6580e4da9449ce4059e29ac2d135eb571fb1b1f62316c698aa1dee34de689e17abcc9d2af3e75d94758bc3633c56b60caa57cb858e1a9559f387d8cc5a9552a792e4c7989b732e8fb8b9f60b1dc3c95de0a458b31f558d7b734dd80c5b9b529ce4342d78925a2473047cc29aa66c9dafb3469fa2916bf2d4cf1ab64b4cf4416b109a2455d259f794c11e308d5deef992276f5f512fb1cfe19c6a98d89d364624ef8b3a3e484ec397c8e71d8d2c461ef8d5c0650970e5f6034da9a688c48b1ad5522f2bb5bedad2fb1986e658ae9f094da5b63c5ec3ddece5225203e5298a956d757583cb74e6554446f930c1331ad9d7a70a42395e3e96dad7c8dc5b11d56a7258f63621c81dbc9c371ef2a3794d7a5dedf0bc4f1d46257bfa710df60f16b8f8dd7258b9f5f2f252e48bd1596de54fb168b550753aca6a5d933b1fc17367c7a997c8731e9686252c0cccf64fc6313e2732e167ab1e2b3be83a3b3d55e583eee576e1c41af7fc9fa3f2c0e9d4c71d80d89c33861e552519b1e18a853124f2f94ed30a63c4418266162f63d16b3cea698f542dbced8b8b93fa252fbac3f4fa6b49ea5c70f98d55db05148dc6af8165e30352ac5530abf555bfb795ffdbde947ccfa6db016496ad6a77b4e80593b4c4c7fc262ba6df8a732b5d3a9a61ee9948e12ed672c565d4db1ea57af12cdcf37133ceb6ab4e7ea6642c17733c2c4e6172c36dd4cb1d923641a0df38ecc17f1ad91f1a98ef781528909458c7fc562bc9d29c6fba3310e5a90da28656a71de58647ec3c86c8fd5d5a99351a56a8dd76b5ae8f52bcabc23feb58b85c7d4ee3df935a4787728441c7ec7e2d03d5c8d3656b497677bfdffa0fdc3bd14ae11f3434c7da0fa5afd0766758fd49ef426ee1a665e0ebc2ed999f4c4f14f2c8e3ba4f6d4c31cc7bae6fbd52f8ef5afddffc262b963b8b689f97936f553ecbf31ebb3eb37e320553faccf4849dd23424dbc7fb1580befcfe1a2d6e1f39d1275500dcbd9de3b25d2c0af8d7bc747f87a07460313c7f9fde77accb96f94c65b1dfc5dc8e40a3b35f01f918b9f1d631cfd22d9d1367cc05bd5a595a0f6a8115f6daf14beb1508cc4f4f67ca25a5ca5de68ad2b16a651cdde605c13c6aeee38a9375df9dcf47251d6f3da7fa6e73f4d648c949647ba3b27bda9c574679eaa9d64aa36c8e9c1e47bbcf5f1a6baade8c9efd6d0ec43ed6a9185b9c364bb2f304ece508af17732a6cbe16c9ebfcbc5c09f3f64c43baecbbcbf1243d875de5dfff0ba7ef75d84801a6baa536e32e8b498e43a0897f38b9985b242685fc25893ac06b93c557a51a2db42a04b78dc3cd9839f2f244b64e91e0564fce554856c174a649d05b2e92c974d37a09becdda542fade2851015730fff5fe1a2f325100b9ba7b02646f4a902d04c8e1a0073c558eb24401d38261094c396efa5b5e2440f6eb9c00994b0972f30048de72e52654c9da99238b02ae15ad13b8f2e8ab06850b0ef670a3a394557fde2d812c9f12d996de8eea6beb7568b57cda7a30e3237d51c0d6af41025b017dfb8dfb13f4b252215125802e949da0a864d2464509748594e83613e846880b7839363bd00c8e02aa39a0a9db8712556381ca7f7cbc30228dda73fa24e01451c26923e0989fe145adb8cf1d9480d697125a3bb4868c72d9550ccaae7e94f89ac57dae4a8c8496892e7a1410b51c9b40d49f12d1d6297bd8b2c874d44b0724e00d70b3e35410099087764d801c48ddac4de67d1385419511f1bf0dc313d876a5c4d692e1c3925100d5726402d420ea8eb9ea3645b7bbf4331880dc8ddeaf8a457b3f8a2367a38a13a076cfcc00638d97f5f8eda334a0cd1fed294c83e9fb90aa9ee4e555d4c6c436344aa01a4289aa55a0a4aa11f5207f44a7a6444601d66ad0a71c4a09ab03c31aaffadcb0a8f53057ed9e40382c535da468f5223f1c9340544c8968fb7a7959b0011b9dcc9b3b3881753825d6b62c9531d9e8f43adb8a5e67932c4d5c7f67aafeb33ac2d1c6e79ff0c63007bb401c5d249abfda7c941dbc20ce593e02ce27c94ed2f6ca4e71d241760afd82ec108f5cb2eb68e864a7f08030dbea69accdd5055657e77b57ebe3dfd975b666b2433e99c9aec7886876a892263bf4885876ca43dbd9293ef1ccae67c3263b8d55557692c913d9493b88d921467394927908233be4bcabec3a1e566523ad9d6c64a0383141d23cb13197e31ef9fff9dcc5dceedea1511c025f9d98fff86d8712ea018aca7894fd171cfdcf69d4aadc3bd7ba57f02b29aa4d60ba6bb340aba1632a11a9d75c3c966872ed41896d1b593cf8337ce7b1392cf5554fa7b3223ab413a8d03e0a86cc4653a26d6f409bec45abbcda8f00d287732b2a9c0ce01ce312cefc48e2dc09e01ceb12ce8248e29c09708e7309676124711e0d708e7709679f48e23c15e09ce012cea248e2bc16e0dcd3259c7d2389f331807362267056a140a1f9bcec246c77b6a4c2f9304be09ce412cebc48e2dc0fe02c7509674124715e04704e7609677e24719e02704ec9c4643d0c6630a3f789e050c87f00e55eaea02c8824cac5a046dfdb1594f991443916a0dcc71594859144792b403995fe951fde1ce76b20a94704dc603e48bc4c9c5b201e54f10ba20772192829a7656292335e87639fc0a8f57668fab0b6a6c23a1c60dd3753ef8a722facf27065c8272ba8e01d0be0ed4709af358057bdc964e95900dffed4f331cb59704532fec4c7e7113d705d01b8e9997863b9aff0b4e0229419f0bc9ba9005e0500ced8980d1c28475a8134a142f93d4059463d5378ba80e4572019f3c2322a749500dd4cfaa987d345107fbd676c9567420f9c4585711cc0589e090fccdd643cb004a0abd8b8e5a02fe5afbe974b87720d15cabb4147af321399392fd0d153a733e49164d5c95ec023676ddc6e1e14cc50376f1215d6d5006b1525d6ed4019a9bc34f599993c2c3799b0514ef644f14a80787626ca52ac360fb62909cb52b24200bea8579d496f0d378f38cade7a19407c00f522314bbc93e572ba71f4506d0b501d48ddbe5cc2d427c5d5d4693560514387ae0715ba1d01ba39d42f26cf0ebca231448c31d65a20320243b24d01b4b91b035a14c7b19b0068f332d16e0cdb6a247d1248d66e2c03bd9af92e62257dec4f86b505c0ba807a1532ff02f532d210f9260eef3846790cbc1bc8f007b9341f9274c6195923a723f0c8852ee1249d2245867300c059e3124ed2097c6438e7029c8b5cc2493a5b970ce77100e7629770f68924ce3300ce252ee12c8a24ce5b00cea52ee1ec1b499c4f019ccba8c725f94dd5ebe7b50730c6b37942d4b85c70045076610994cb5d9917994739c841d67cff11a03cd81594059144390f64f0435c41991f49949d00ca435d4159184994ab00cac3a847316789d37c1990248bf547a082e90e4ac5c3dd9ce45c18c1c1e1c300d623dc99eed73f828f667340b65e41bde44df0e14406462b5b51616b043cf0c84cccd8cd13cfa6cb18ffd0e6625693a979416ba8005e0f001e45bd406870c4dcb05c7604aa927600d8d199f86647aaefbc12967a646fbc0e06308f710966bf08c21c08601eeb124cc2278964308b00cce35c8249d84e2483d907c03cde25987d230873008079824b30a3b8e4425f00f344976012ce152283b90b8079924b3009e7ea92c1ec05609eec124cc255a9c860160098a7b804937004920c666f00f3d44cc0c426e4ebcf1109b3395977b22780799a4b30092b203298270198a7bbf1e2276106277bf1f32680f10ceae517e0ebef89a5d4138bb1476f28774b80ef4cfa4fe1fa6fd7cc95372f13836b517f5bf10e80f0ac4c4c55c9157576b20f7844f9a5a47e00e7d999f890167f4a388705d754c1e75944ef21ec12f0b4e61cd780123683c880c600d0732981f29780828fbf08dfff227bf09a0532f47999f8d243f045ce11d20f831fef2961700125e2b292cc13f70768cf77e77563c23174b25a7c5f807265669f69d7c46bf1e8d5d62d01b60bdcfd8c0be13810d9675c4a403573a14b0b16937ed9816c24e876e0a917b98493f4ab386438f704382f760927e9675cc8709e0f705ee2124ed28f0c91e15c0a705e4a89b353cad5129c4b495a21758f11413d1c544897b9089570fc920cea6100ea2a17a1120e799041fd1364ffcb5d844a38ec4106f50f00f58a4c2cc8a4c691f86fbe0053a5ec789a014f9170b96c012de237a810df090a832ba94796f8f0c74c8f4015f5a24c9da96af96d80475ee5ce947ec2b94564c31f5d81e75dbd311fed065192aea34106f35ee097d7b80493700a2119ccfb01cc6b5d824938b9950ce69d00e6752ec18ce290f1dd00e6f52ec124ec0791c13c14c0bcc12598843d75329847029837ba04338a0bd12e02306f72096614bf1471088079b34b30095fa22283f90080798b4b30a3f852f38300e6ad99f8485b11db343fd2763000795ba6be26a65433048f6c3aeb6800eff64c78619f4dd40b970090776462150d355ac9c7229782750a36adb96f078171a23b29b17665b587dca6783c867942c55e3619ea05e443c2fe31b85aff10cf826a5abc64df243b0be0bd8bfa6b786ae6db2c0157695753ae749045058e81ec7e3775a5c3d7162a67b3199f6acd337ad457e8df1ac0bb877aee9b5fd1705463bcc38be220a337f76d3b80edde4c9485890762f385b165426253ad6a6e0265e17d99f8a49bb92c24ccd0cda9d035009e793f253a9ef8dc1761fd5bcae0c23989d7a46098e8d5cc2703a40fb8f81104d2c516c93e82301464f2075dc44a3a9a4e86f55be0ad0f6dcc1703a2bfb6c14e00e5c3eece7027444b36c3fd7780f6119716f9261d5b276b8ffe03703eea12cefc48e2ec0eaaa6d52ee12c8824ce2900e7632ee12c8c24ce2301cec75dc2d92792384f06389f7009675124715e0c70ae710967df48e27c18e07cd2a5b7830a23b9c4e33da0a1f4944b3849271592e19c08703eed12ce8248e2bc00e07cc6259cf991c4b91ce07cd695cf79904ec5261b916f06aaa1e75c4159104994e70294cfbb82323f9228a701946bddfc5e0ae11c62b2657ba68172f3854c6085cb9a4d60f3856009dbd49637eb0fb0ae73e79db528ce72df0a64fc173331fd957f4f25b874cfa6335f6e2ef0cb9732356b137a6706e0913d1c7e0cc07b79e3666a5f8a7b27e97a086ba850de0b32f52b99f8485281c8b889a90919cac864beb80af8e2ab990098cf36adaf4c5d0d00aea704d885e9d3ba923df085930c491ff7be4205f67690b55f7367b5c228be2d3902f8e8eb9968fac0c67962bd6b38f530baab686603986f64a2c42cdac4aa9c9500e09b995c61b83c85a9af51fc6e6e312829df720d286157910ce80100e8dbae018de2e4eced00d0775c031ac555da0b00d0775d034af8dc870ce8a500e87b99a8d5fb6c62b5fae9a0567f3fd38be8a532aa4e58b3938daabf0ba07ee022d4283eaaf81040fdd045a884353c19d4f500ea472e4225ace5c9a0be09a07eec2254c2e5f6c8a0b60435fd272e42257caa4e06b53580bac145a8846d5232a88d00d44f5d844ab80c1f19d4a600ea672e42255c5a8a0cea6c00f573972670932e2e4536eb631b80f30b9770e64712e76880f34b9770164412e77280f32b9770164612e78900e7d72ee1ec13499ce7039cdfb884b32892381f0038bfcdf48a0b9beea71bee0258bfcbc413f9d4e675e6477261d3c701ccffb904338a5f237810c0fcde259851fc1ac12300e60f2ec18ce2d7085600983fba04338a5f23b81fc0fcc92598519c5fb73780f9b34b30a3f89ec63e00e62f2ec18ce2d708260298bfba04338a5f232805307f7371f539d24612d9ea734700acbfbb8895f4f56b32ac9b03ac7f5062ddd680d5dc731f292fc9d8c76df7a1823b08c0fdd365b884cd2932b8bd00dcbf5c864b588991c1dd1ac0fddb65b884cd2d32b8bfb004dc7f5c864bd8ff27833b0e78eebfee2ead4a381a40b6b4eaa100ed7fd41f92487c3fa69845fd9bc2ad4086670d1d7ada44ba3618d9d3a606c00f632ee1241d3125c3d907e06ce0124ed2a5d6c870ce02381bba8493745d45329cc7009c8d5cc2d92792384f0338b35cc25914499cd7039c8d5dc2d9379238d7009c4d2871f66270c120b5855f93f1570bf3d709e30d771e99a9b2091ffc1a8d1aae8eeefa61d7b204f6a694d8b7377871aa7d2638d64a3847ea272ac88700df6e1605c884937cc820ef0f20378f0264c2c14132c8af82e2a2451420130e1292417e16406e1905c8840f68c8203704c5c56651804cf8a0860cf2ebc0935b450132e1d82c19e41d80276f1e05c884dd1332c88d01e4d651804c3823810cf22800798b2840269cbf4d06b92f80dc861272b80f1844714da09f41f5b6a52b284987cec9502e025ed9d61594a40f75c850ee0a506ee50a4ad227106428af0128b7a64459ff6f4144718595a341b9d92e13f5bc5a9c8e07e6972f607c22c6148fcc302f0215a27657dba1de857c55fe2562f477315b48dbc1259b79b01ff0ddf651804cd8c125833c1240ee1005c884838e64908b00e48e51804c38e84806b90780dcc9955603e9ea2c64ad862d00caceaea0245d4a840ce5850065175750922e724386b212a0dc261328cb99f97309199bc55d4185723e4ba0dc9612651b96f8264af04b51195a0d986c42f10c80b0ebc6ccd8508ed41bc9de3afc12a0ec4689927f6a8bcf9259e4059a2dc64b39853962bc7491f0cae8cd7fe904e06d470f6fbe17847f7a104e371a2fbc727904e1b501f0b6cf443958fb8b79512f07a70084dd2911b6ada3565631252d036751611c0330f6d8b8d5892fe57f318fb0b7bd860ae53da09db8037589e87be32cc6a7542e162624be065513c112b135f0c31d37ee803114ccd08c28b257d51f0158b329b16e25b1167aff13afa195b04de5b3acf300c89d2841aae53e12436995b5aa1cd8a78ee2478b6e0625e5ce1bb3471decc344711db483805ff6a444c9df2f5d20b27585bc6822ab948df2f20856383d00b85e99c8d0b9b59ae09b4ee9580a60ee4209b3a9b7c303f3f946c5726e51f47caf39c0d59b12977adf5e552695c62f866e4a55cb53006d4e26da91615b91a45363c8da9193408d9deb2256d2797064589b03ac79992c08f8bccc1a74eee6a6b00ef48d006d7e26de32c53b949303a56a21e5e0464b2a4fbd1594ab052ee1cc8b24ceb10067a14b380b2289f36c80b38f4b384997e324c37920c0594489537db295f78d784dcebb968b45c59491fe10d950f0e500605f979638205d7093acbfd419d4e5fd5cc249ba2c2c19ce1100677f9770164412e7028073804b380b2389f3788073a04b38fb4412e79900e7ae2ee12c8a24ce3b00ce412ee1ec1b499c4f039cbb51e2dc91d57e12149c97ce4744e77afff8df7c3064b1904c3c552f15d43230dfad980a763e4bc0dedd9539c1a4fd77b261e61f00cac1aea024edbb93a19c038a8021aea024edb793a16c0b500e750525e9782719cacb00ca616ebec01ac56f841f05cacd627766af47f1db8cbb000f1d4e3ddd500dd2558a16e7dc4c0dd05550c1db03f8e108ea09d8b3c4e972e62f8a324704e4f33e167afbb345c63e30824df7ce00e1c84c9490ead925f7baaaf8e94deda59419205b8fa2c4dacd5042fa8bb1f2f9c4f3bc2cc27b400b923ede20044cf670a321f0db1277261f46f1bba15301ca3d5c7aec46fabd7a32cf5c03708e760927e9dbe46438ab01ce312ee1247da39c0ce7cd00e758977092be554e86f34c80735c26a67e4198a97f7389706d19b25703fb8126d47837272b127a2cd964c5de00eb844cbc4b54c036cd7789e680acbfa74b2569216576272b496f033827ba84332f9238c7039c935cc25910499ce7029ca52ee1cc8f24cec500e7644a9c9d98feea0cafbf7d914d6dcc695b50b34fc944cdaea05627796e4438264f56b35f0940eee50ac8283e7efb0d64f3bd5d0119c5f7e19e0620f7710524e1aab064200b41d69eea0a48c21a9c0ce4f600e4345740123e4b2703391580dcd71590515cac7c3800b99f2b2009677392813c0780dcdf159084ebbc93815c0a404e77679a0c612949d6b7690f50cec8448731ec60701487823f6509a8652e4225ec3c9241fd18409de92254c2663b19d43700d47217a11236e1c9a0ae05502b5c844a38e44106f57900b5d245a8515cfff0390075968b50099bf964503f0050ab5c844ad8e42783fa3e803adb45a8848d7f32a8ef00a8d52e428de2a2556f03a8075042edc8122f1e24b67005786efc54395f899ff3e72f9321259b4b7f09407a6026fafbf843e2a83ff0381ea09c9389d762f2b48c9f8199493753c17b02c09b4b096f5b161cc02b172fc6249b98085f9b21ed8abe4205f73a301235cf65b8845d5232b85700b8f35d864bd83525837b0980bbc065b884151619dc9500ee4194703bf0ace105860da8522150e5fde37bc3d932811986885e25760ea8c41652bfdb195cd17bb2a75cc1ca84e018e6cf5d9e13c146d46600614d269af82ac3f36cbd54f69082edd20c0def9551219d0fb2f922775e3b247cfa44f648af0678e76217dfef205d3d84ac5fbf3bf0d0252e62255d2a880ceb37c05b97bafba217e14034d98b5e4f008f5de6d2626ca46f7e908d42fd0b3c75b94b38495f5520c3990dbcf360977092be484386735f80f310977092be354786f32880f3509770f68924ce5300cec35cc25914499c97039c87bb84b36f2471ae06388f70e92544d225aac95e427c14349456b8849374797f329ce500e7912ee1245d8f9e0ce71500e7512ee124fd5a0219ced300cea337e65cfc60468fe26b0d59a01a3ac61594059144b90ca03cd61594f99144b91740799c2b280b2389f23680f2f84cccb7f3a7848df102fa5f22de1427875d0c2aa0133231a389df7896f04ea53d4f0689deb3a218807722253cbe64f602e07dfcf16f9978009cf88444f4f0b505f84ecac433a1f0cba013cef9205b067d08c07a322556f5813d5ea540efccd0126a64733c2e05004fc904c0bc4d0ce07900e0a99978553bb55e4df49a3caf0190a7b902328a13b75f06204f7705641457aa790f803cc31590515ca9e62d00f24c57404671a59a0d00e459ae808ce24a351f019067bb02328a2bd57c01409ee30ac8288ef87c0e409eeb0a48c249ad6420bf0320cf73056414d7e0fc1a803cdf9db593081b4064a33fbf02942b33d1cb2edcc47ad9d701801764e2516cf05569df98e1ccff669b9ae94b3e125e46857314c0792125ce2e12e72236db3b5dc3b089d4a5c233f95b16fe37dee6d2f6bd5fa2027b23007b1125583e9e0c337829f3bfe6c6fd718af8bbdafb3d53786cf4cacbad00c68b2931b603d9dd8737dd33b746fa23ff9ea0aa76a2fbd8eb4400f312775e98221ca324f3cb6280f2d24cf8656a4da2bc487e77753c78c67d994b30a3f82adf9e00e62a976012f6c5c9600e03302f770926e1081119cc3100e6152ec18ce2874207039857ba04338a2b1a0f0130af72096614873806029857bb0493f0c92319ccdd00cc6b5c8219c58f32e50298d7ba04338a3da07c00f33a17d736209d3a4db6b64139c07abd8b58491bf264585b01ac37b8bb6404614b946cc988e900ed8d2ebd584ada16251ba4eb0070dee412cefc48e2ec0f70deec12ce8248e23c10e0bcc5259c8591c4792cc079ab4b38fb4412e7e900e76d2ee12c8a24ce1b00cedb5dc2d93792389f0438ef70e5ad48d26111b219493fb104ca3b5d41591049940b8157dee50acafc48a2ec0950deed0acac248a2bc1aa0bc8712651b9698f7115c79384333e5c8fae583401979af9b2f9a123ec5247bd1f43880f53e573239e9bc0fba35b14126bfdf1594059144791e40f9802b28f32389b202a07c3013af0d705495f1150d4a441554c99665aa022203391994940f650264de260a721200f9702640f6df44414e07201fc90448deaaf42f541f0449cc22ce0048b2a18c6b00c847dd99491cc529860b00cad59428f9727efe101acfd893189fc33ed60bceb376f4b2720780ed319796642ca49c1a43b624e32d00e7e32ee1249d6944867324c0f9844b380b2289f32c80738d4b38f32389f30080f349ea2a874f70a991ad483e09a6584e78895ea3a705c0f6942b7d6cd2f291acf6fe1f40f9b42b2849cb4632945560b8e219575092968b6428b704289f750525697b920ce54500e5739428f90aabfce5e7455ea0d962a625a730072c161abd8aa623281d9f7767bd8d28be73b633f0c3b5d4afe1ab119fc4d0993a9da1f11ebad7508047be9089e9d3752d1331525e009f2c922e14b10f15daa100edba4cbc9492da501a690d4ee6a70f01982f52c2ec6a2839a7783c867942c56cb497aa659e40a53c06d7501fe25950cd48573d205b7ce72a509abe448937b818bdda4e1462f3e512e09bca123c15c0675fa66e2a2998fe1a313599aa98e8beb00be0bd42ef918985e7f9db3b8ba5ef1d28300e0dac1333c2dbf22f955744b0f1be3980fa2a25d456422db15ed150eff76cd16caf161791a1eb4c856e0b806ebd8bafef91ceac24cbe61340c5f39a8b5849a75193616d02b0beeed2b87a21e5cc21b271f5c741e67fc3259ca4d303c970ce0638df740927e91441329c37009c6fb98493749a2019ce3300ceb73331b2149c26b8a98c2c95018cefb8fb623e616f9dec05801d41edfe2e25da66de0e3f3d479ce6f389168adb1301eb41056c07e08befb9f4be23e9435eb2c7187f039cefbb8493746c930c6737909d3f700927e97373329c9301ce0f5dc249fac0970ce7c100e7472ee1ec13499c27019c1fbb84b32892382f00383f710967df48e27c08e0dce0e6701c6197926c38ae0dc0faa94b3d74d2c575c87ae8f7b104cecf5cc249ba301919cebd01cecf5dc249ba921619ce0b01ce2f5cc249bace1b19ce1300ce2f33f16a1f368d2698d1a3f7f0370f80fcca1590519c02bb3300f9b52b20a3b816cc3000f21b574046f1ebbb8500e4b7ae808ce2d7770f0720bf73056414bfbe3b1380fc9f2b20a3f8f5dd1500e4f7ae808ce2d7778f00207f7073d52cc2aa876cd5ac7d00d61f3331cb3dd50138c27122b2e1b7af00cc9f5c8249f8bd3432987f01983fbb04338a03c34f0298bfb80493b0274e06f31900f357976012564064305f00307f730926618f9c0ce63a00f377976012f681c860be0860fee112cc28aeb1fe1280f9a74b3009fb4264305f0130ff720926610f9d0ce62700e6dfeebcd41fc56f9fb603cfc9ffc9c41b937c6151a59aa109d7b3a8e055013ffc3773eb0d8e89afd15149f94e2459f6dd1e60fb2f13036cc18524b8c19bc61aacbb0290ac1121c88e12e41c2f102f03f964fea572202d5822c2c135c25e771915d26a501ec628912adfecb789fae631c0371b5082dc0264f2052cb138448600922d10712a00d8901260b87581a3f8e5e7090065234a945d98bee48ebf68c964cf180e576d832fe72f16de4a38ac46f68afe5d006c96ab6009ab2132b039006c6377323fe1131eb2ccbf10a06c428972336f27f8d9a3c4122784aff0913d676c0cc035a50417fe15be283e69ec025a96cd5cc249face3819ce3d00cee62ee1245dd1800c670dc0d9c2259ca4cb9790e13c01e06ce912ce3e91c47936c0b9994b388b2289f33e80b315254ebec303f38521a287a91968006d4e89a9fe0b9011f66dc85ecdcb03ded7da45aca44b449061fd4c786b932c4d7c442df161cc5f5ec49f0d592d3b7ebdd948d157f13fac55eeed8f113ded456c8607649af72f5c5aece7fd331d8f892741c3d932b6401ce57a15427bae77965b56c372f9ea215b70d768255d235b5ce577526731fe09b0c522e2b087951dab6b0dc46cb9c4f97c4fa9ccdbc2b564c70b0759ee85e11d2a3890385ce807fb73b54325164987a1da6aa14a817553c4dfd5deef992235b2c5639ecaf8dd829f95ca8e25fbe854760a8bb7e3611231cc8ef18ff8ce12b4ca5965dc57d45234c3c44327be3467b6183a5828f6cac483013d6c8d603a49a608a7d1d4bb829f9be9a55e9567d97cef77768cf7339788fbf947b813c7c4b02ef78a79def1b122ae65deb565625b1a6796b3a3172c56e4fdf2c7837ac747827acbb587e6ca3d75bc6e4deeb5c9d5da70d78c994bad3969cb6f75c5a8249e6ab3589948ad1a71b4ae98d61d3f3cefb64c922a39d93c2d36e5f86fc9d35d26bb70d37631fe219bc95ecafbe27c11f585d2fdf94fd6ff0375a66a8aecce0300 serializedProgramBytesString: - serializedSignature: 056f2e77e62a5e6368752131e01f02daa7d005d91106087820af9eb7656dfff747d81fb6085d3d5045afe9b8998be10771dab8dcbd510fd39db8c513f4b4fd03 + serializedSignature: 3615bbd9ea09ef6d7fe2bfd47e512b3e9f4c2de4da0424d88d9b255047c0c921e6c69d09611bdde17186ad09723657f39e091e74d4537fbce2fb77f15107b501 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset b/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset index 901bc4e..7342ed0 100644 --- a/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset +++ b/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d777715c7159f1508213a02213ac26078a6e83d15ba4180240b01a2a8611b6c21d043c8960446a239c5a4278ed37b6f4e777ab3d39dc4e939271f22277ff99c7c819ce3cc9d9dd5bb6ff7ce96f7f64a6f154b476fb4b3b377eefdcd2d53f795a585fcb176c88f3ed1255a449de81583e29a1893ffb5c87454feda574efe197143a643f27340dedb216a039e849fadd64af9d921afc6c5847cf2a6b82cd36175bf5b64e5ff1df2d9acbc82dc2bf22f2b4b59b3e543bda2559c16a7448d551d40a24f3d34aef32c90cb9a2b3f8f8abbf26e56310595a4d5ad1af9d12def8cab7ba39269a7dc79f198126b54debb2c9fb9214624cd4b8ae2dcc172a1fe1176b246a7ab743a4ba775f26f8efc6b47d720cd317dbd56fe494ab3ffabafcbe45f25d0d7ff63daab753a5ba7694dfb18ba867bcfebeb751168afd06946d3ec40d792a695d1d7353aadd7b4e0fff53a6d4079f5280fd33deea27bc745b756a71b74f913aefb1b75fec91032dd1741fe4d11cadeafd346cd4ba7bedeacd32d3a6dd2f74fa1f24e3ea4bbf4fdd3e81ad2c53aff8cbede5a006fbb358db3aefc3d3abfcb95bfd725cb1e44c7b90fe93e5dae1b5d43ba44e7f7b89eabd0e97e7dbf175d439ad2e9017dbf0f5d43fa804e97ebfbe75ccf3fa8f31f46d7906ed3e9417dff11740de9769dffa82bff90c8e9b09357a5cb9e77d5b143a7cdae3a9a0d7538f987511d4ede32571d8e7c4774fe0557fe519dff982bbf45e73feeca6fd5f9fd88ae43c779ce2907e9525dfea208d639c736dbf43303e85ada78f9195739277d08e1b053f8d875b965d93e332b695f1769c5006846d850e53c191ca480f41cf8809fadaada09190eae4b0244a4e8557168425a7603192956590b10df2dea7340961856442f79ab78c953053037227fb328cc8dcbfc76152521d00dcb3b7512b861f5d445e97acfcbdf7c2a7db2da11192ab3d2406fcaaa80de45c9b6b76490481012ddcf74499a76c41e95390ea0d7e5f588e2b05b7dde529c6615f71d326f42f51fc6640fe2a84cefa8dabcb2df90ff5375f668c8681ee9c06dcab7bb074e33b54a6980fbb48ae1afb7c874b408403fe79236c3d969d5e379d6d312af63683b19d9399075db34ea1564565e5e8348c3a5d5e54130ba8c5e0969fdb6f1de2d3b3b7eb2d0c84073af5112e45af8e5eace57ffbde3d5bef27cd11a451ac286b53640343f60815eca5ae1a1e02f4279f9ec0c30ea86dfa2e057dda0ee2984df2e37acca456f80392a32e53780b56932e082671b1257d550eb9aba3daad9a3ef3883b5019982209e36cc408515aa19bc41364814534394510d3177aa1b22d8f3f835c4dc49b9720d013f348295060483783021388b4250f5d8b2ac08f6ca3cbb8bd4a6ee0eabb8ea445ee01ba4f02b05d875aa61fe4d55bf3fcaf3a434b35c28a7e7399dccf8b9a915e25eb3eba39c6ed2f9aa4979d83035fb6caad9e74fbd07b34d7e24201cd24d0afdee0d1ec3913093282f34ba1e7f1e4c08965308024b56cf142208f7ae292ae078a363b848f2badd8d210de06205e04a8f70c12c98209c434098010897905c55bab802860c942ba8c6010db09e9816af7656d631a06abca14a5cd348c5e7df9652fe0d5ad7aaf3712c71f0550bc12aefc3e8e9aa940a71336452b7b9945280125943d3a21430870dc34b90a02966755846a9039895b5dd07fde238f22a82b44f5a11962b45e063c5a4029594c70115a826f0ca2cf1caa38572bba2e5665734cf54e50ab62ae79baaac61ab7281a9ca956c552e3455b98aadca45a62a57b355b9d854e51ab62a971055a621be58c3623afc64a78a08303cbc235dc19dd87de55a02c934842a0b66acf9b8da60c1e06b5464d44ad9bd66e7ba5e5d8bc9fb0daeeb46d775464f08e59eafcfa3d7e0badfe8bacea8153cfc7c83abfe863c7a8daefb19b5ea859f6f743ddfe8aabf51f87412604933c50cbd293e2c3559dbfaf0d6068245b0b62acada207c9740afa431664bdb40591a6013ba2b109d238f272495ae5644e99044e7c2a470cb288583cc8d94c22df72a9c57d76acdbab69caa0d42372ca31735e0aa3651de542ce51526ca9b8ba55c43599e12e402abe57957279dff8eca67af4a616ea991cf4d3ddfe32eef6f63b0dabfd3050badf35b94ced70a6a8d351a4726ed5e696abbadc5b6dd2a8ab29a1ba5ec669ee3996bdd1372ee2ae79bab5c4d5509e561e68e9c8772135f6826be86220e03d66dc23b3bfc9afcf110af34135f6b22be9d200e3b8da2105f6722be8320fe7c44e2eb2913551e612aa7294f8b4be209edfea34fb1ed0c6d9075829ea20caadf647e1b28f494d77bcb143b387acb46bbda5598cd93cfa9f79a0aa6c091b366df25d32b8a0bc8072e82b77af8b74c7a121fd41d513eab8d748ad3250574f7e781b736745eea95de9416cf269daca5dc054cd7c298c2b31e09a6de2f7f33f26f845c7784bbb0e1c6dea1eaf12d1566dfb2d1c44923c5c92ac44987eef80dabdbc3e26959805e158dc2cf7d2647da4439522b9a23dd6422be8b20fecf88c4379b22e36e323212c47d22e3fd147170627b08ebcd80f5c23ec6326518fb44d050b247290e2c5d5f514e61b4809ebd479a7ab3345b4c50ed27a07ae195ad7ba240b5d5d4c80788461e298bd6c8298a3830035b253d3d2e982903530f1e1a5799ab7cc004d64102acffbcf64ca41ed7362a38aa6ee5d46fa1296ce300ec63ada1ac8b0c12cdc26f074cd46d03db4d4d73380693df411187a63942486c51c49bcdc47752c4c12dc336598fdb87113384bfa7d425a0d62bdb7d50af51e56f8d89e2eceb282e6064049b748b1a19a54d945b8ba59c31516e2b96723d658b6abc7585d5164d7ededde18e6f060cf643871b0cb42b7b052fc5c1a5c9ae1ba8368696384631ee6ee276731337528497a94b8689ae26937b3a1e837bda6512e5048728bba9da80bb93546d74dca5aaf489bb7ba82a41c04e0e01f79a6a3bc551db3eaa3698f63f4dd55625846b99062f73c4b14c839f8f6399063f1fc7320d05ef3a33bcfb2978415bcf50f0c6a2ad07a82ac1d6cf8ae26dfd4193ba74bdae2e31a8cb410a5ee8287453f0c6b2ba7dc854650f5b95cda62a7bd9aa3c6caab28fadca2354956087e744f17678d444fce11888b798883f1203f15613f1476320de4611872e399c312caa4bfe10451916c7606d2cb023b8c54cb89d220c232538e6e8197f750953ff37b727ba4e4dcc5d9363007b6ace1eadd95373f014dc0da211a6447f5e9f3e7fdb6b94b1df3113028f53084043e07af17ee530929b9ef5bb1397a41d2649fb29490fb924cdaf17cb0a6d0553be77651f312bb91e10ce213d7fdee393ecb849b28b9464bd462dc663b8c2f518530957262e1c4e987018a070c80a6789c25934c04b06f64c148cdeafa813b4307aef982cd926c7f4f6b2449792222be5baa54ad76979e0bd10f92face8535a02d3f49748cdc6c78ef2eff8a105b33ec392ab28389d34e174c9a42f9c388dc9b22db22a9008e8e69ef147a8781c3a4d385ca670d867b41befbcbd2ddd90d2827ee5b3c7e5ef5dc9f1654530eb633ff97b7ba2c873ca24cf20254fb3511e7b4bdb55298d2d075cdf89c97fe37b51643b6d922d1bcdc7e5a38bbd5cabd24d38429df3de6168f8cb1e771b9f31e17085c2e158281c9a5cde7e541d6d1ed6ef0d088f4398724d91a43d6b92768892767fc1160a7e7ac215b9694ad499902812759924ba4a49b4a76089ae2b9f331c42a2c275b1db24cb3025cb6880bfc15b686d597a245add11f42f7c8b15abd15e8ea3e0d663c2ed090ab7bd91717374004ad9d176dcd71b15274daf499a272969868cd250ed84fd52a75a2d007d06efe4d7038dd2e274592eebef3361354261d5570056adca93f16213473c3f674262944202e62dc28c3b4faafee7b8b4b0abe4186baac79c0f9ba41ca3a43c1ed9d2bb26e3969f7d47d3f1e2bcc1232689af51121f8a2c71bbf26d20f76d4f3be5760f70f4451e3549769d922c15a9e735ae3db657a642edebbc89dba7a6b79fd8c4d213b96092f60625adf96485d9af3a31d57f1c1485e7c74c3c8fc7cdb3ffdc5b149e1f37f13c1137cf4fc7c673bf89e79b71f31c9ff55e34f17c8be2f95224eb75ae0b8d8d85c5d3b8bdf18009a1db1442fb853387d52d7b482764441f503eb757f52747f438c9dea1d3af7cdbb87e1ce694dc48153b7b59217f2d0b965dda54c482b9e3336afe0aaec6455a1dc0c84cf21cbc851a3818955c41cd3d93338cc11ba3e16da8a6b70f7a773b15fa22ba2029a839c43a348b88a50bbfcddefbd2bd0a2d91434b22ad4ea3cc3449ef42ab56e8562d4bab4331db0bd4a6602e9e86da66d13a14fde55a368153fa48807af5b2b3d3dd9e54ef56d542b7f7aa34b611614f20db04036b0f3abcb2531170dedd16c3eb38a1158e48fe06d5a637189afccb12a2a2bc2c03adf2064ee8ecb7afdaaf41bb213f9300ce8b2207ce1b39c1a952e080fadacb322d7ac038a4c2556ea13509a00904da9b3841b37789e4761c7be7209300d7bdb21c5c6fe684ab7252c720cc3b413909103d877cd4339c10adf03543275a8ee999ecbb8900ef0232c77b9ce0cd9b04af55754392a4612f2a0dab28771177ef2f89ebe5c741c89afb8ce0f3da643ff9baca057a83ee3ea43a175c6a9cc3a1dac93e602a74bc4b4536c994a7a3913278be9451635311fb79a910a12837c8a20747191864bd55fc7f8f7f3230fe791b80d0ae41b0fdd6dbf99d7ebf1eee8ec9427e53071977fdc5bc79b932cfb32d0c235c21dead09858077704209664d1ff6ed54e630a0ccd6d38d8d0fc22d5c10d62008df3915da78599bf384471bf1a623466dace082b21641f9aee98532e986bd0541f96e4e28376a28476421f08ff60695680b7c8c00577101bc1f01fc1e4e806b34c043c63084d9ef972e9d0dcc4a2e30b722309f2d2530eb1308e63a04e67b4b094c46336703732d02f3b95202b33181606e4260beaf94c06c482098f72130dfcf09e63657849ff08c60bbfe4f62fe6e04f90738215f23bc03cf30e75318c3553b17a80d08d40f9622a88c9aca066a3d02f5439ca02e12f644d988da7d10380f9e8091d36a04dd8739a183c83013009b8d00fb0827602001ec5ab9a92658c725b3b7c46d7de687d1f32de7026e2102eea3d3051ca37763036e0102ee63d3051c639f910db84508b88f7302077bc98c7b13e2036a3e1750b310509fe0d6b07e356d062f0bb5bbd7366dd8cfc7065c3917700201f7494ee03608efbce36db52a176e6b7712fdde4104eea738c1851114ec2cedd0c3367bb9145694e1bcca0de5116125870dc2c55c10ae44107e9a13c2a02586e44f8dad41507e8613ca6a43140602a7e58397d55aa2731a3a79663d1f01f9594e209dd7728ee803c470e4327730cb86af4bfb5136186bb960ac42307e6e2a4c3bdcb600c67e22db90ee0882f2f39c502e11f618f8963ae8f0a40a316e8d4cde3c610582ef0bd31964f2b704306a22db96809d08ca2f4e2f944937eaed08ca2f7142b996f08fe1de6290c4b0b30bc1fae5e9d4d0299bb5aee382723d82f22ba513c119e716d98cfd0082f2794e28e7097ba868573f3cd9af4cded0700e82ecaba5e71f9b7835916d747318c1fab5d289e04934ea0710945fe784729170bae5e774a1c1bcf75cb041b78e0bba2508ba6f7042b754e4ce07c0c419f844989cc8ffc6a5e4e9de6604e0373901ac9ed4bd93b290fd16c236c908ec0fc7472d6c82c9f3878b1190dfe204b25247e65649644c65c2a18fe4c5e57204d8b7390173b632e3b80c4c4c08f806cf31715c9d58b83ee32672cb10c02f4c45840ed7ed66dcc8cce6255b1094dfe184b2f03136e3d4452d17ac7b11acdfe58475b1302dc78ee922c99b42b31078dfe304cfb45b02082471e4528980fbfe740197c475eab908b81f4c177049dc9f330f01f7434ee0d68bfcdd13a3c6f0e17dbd216b27876d00f82082f6479cd046ebe4301ee360ebe41c4550fe9813ca751a4a7bb8376ed451ef997a561dddc705ecfd08d89f7002ebbcdec0deb59de48d7aab10643f9d0ab30eb7d4cad8dd61eb276e4450fe8c13cac2c72e8cb0d672c1ba07c1fa2227ac7667c8de453185dba2d8e67daa11702f710367ef76f47e413de31e5c36e05620e07ece099cd38b0c36e499d28bdc87a0fd45e9f9c8a46e6c3e8460fd2527acf4aef1fa190d6e3302f7579ce0c21a5bd0f6d2e4c1b714c1f7eba9d04ddcc39ce927aa5308dcdf70825b4d808b09e2351cc65e663317903b1090bf2d15201935920dc86d08c89739810cbf193f89a39e6508c6df71c2e8ac72e32f984962a77d3902ecf79c8039ef4631cd4fbabffb95d188d9c0ac4360fea194c06434653630d308cc574a094cc6151e36303308cc3f9612988c0b116c60b62130ffc40966b4359d5d095cd3694550fe99134af7cae3b84e67ee01914604ed5fa6025aaca5f9df87eda44765717859f62dd5cf84dd6dacd0b2bd7bf72104ed5f39a1f5ae44ce6c60378819f3d6fb0c98c5df40395668e548b95e4f9232bc8a2965d8429b321e7a49853ad09a0ad8f0e37fbf3ee07e837e497df813f3667af60b82fceffbf163bf272715714f772af0fc412ad45c632ad281f728a5eb916ee40f3c5301cb70a980d5a654e837a5a742bfa5c3fe8281a5da76c724479d22ab78b6bf946040e4be6c200d966fc18b0ea37c07973f4db05c7f6a7f07f3b468df3d129bcf89e3db0d284983e533fbaf053ead92862ec98c96ff1fd0eebad9959ad6a8efc1c0df97715a161e544cc14ff9ff0011f861188ec70000 serializedProgramBytesString: - serializedSignature: 525094dd194065b5412dd193560e105259dce99246f3fe11772060885419e1816ae4b758899a65cfbc170762d58ca39fb02bd118cfe723fe27a68eedb84f4806 + serializedSignature: 30c6049c6115dd4c265074a7548da3b2eedf6a1a6af02e35199407b13ee73a573f63e4041c41cee870609072ed908be7ba71cbd428bdaba66ebcc766e1198b0b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset b/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset index dfe03c2..4286d44 100644 --- a/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset +++ b/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5dd95b1cc711ef05964308a11b5d48e85e9963179090641d884b12922514408a6247412b0eb13697019db9e41c8ee338b79d3887733ba793388f79cf431ef21fe45fc8631ef37d49574d0f5b3b5b3dc7eef6b2430c1fdb3b3d3dd55dbfaaaeeaeaee69cae242fe445ae4c72d312cfa449bb82926c4bc9893dffa643a2b7fad2b3bff865894e97df99994f75a4493c793f07334b2437e0ecaab25b12c9f7c20c6659ac2fb2362527e1f94cf4eca2bc89d927f93b254a4423e7453f48b21715d3444b67990b8850f2da9bc08f015a9969fbde289bc3b898d824ae278ab417e8cc83b4b786f5636da2ef792b8836ccdca7be3f29945312369de438ad5972b057e1156b255a5db54daa0d2edf2af46fe45e5e53f545e99caab56dfe9f33bacb2b27eefb2952aad5065e0fb4e9546499e1b8d5d2a2d27e5773374f73074ed729524afd107ffd52aad52e95e45e39cbadea0d27d2affbcbaae57d7dd3ef86a52e97e951e50cf5ef0f16cad4a0f121ee0d91e75bdcee37e8dc7fdf51ef7ddda16b5e452f6ccfa5ef6b6cb33152a6d55f47b89aced7c485bd4fd3e8233a46d2abf9f5c43ddffb1ea2edfea28bf51951f2074213da4d2b8ba7f915c4b7a151f38da5bee682fa77b4e5db09f3dacd233eafe25722dcb94ffdbd1e6cd8e361f51e951221baabf32ad78d751a7dd0fce3aea3cabf87ba6ae632a3da6a14d75ff3991adfb906e21eda56db1ef6f72f0c3e9852d7fbbefb7ab672e936b48132a7f905c43daa1f2af3870e874c8ad8e9487f4b8ba7f555d9f50d72f90fb763ea45d8ef2e5a41efb3ed5976b1afe4e3af86b26f9909e1299faefb44ff6fd730efaa755fe75720de9f32a7fc821533bdf9669866ca211f47297a5df498a0511476181a6f875c7f693de8e184857c207fc1cc56a97a5cb5b9004186f78137dedb244bd83f5863b23eb49bbfbf033294ba490e88dec2afe9a5505346e46fe4e1257be24f32fe148009c794ade69938a92c2a7ee4a157d49fe6652b925ab9d91c38149312a3f1790de5dd9ecec925e2c81db773e332c695aa39259996303ba20af67b08523f8f9105b3a89ad1f9479cb38469a93a3a45e993ec6dab2795f94dfb93a4715647c1bf9c1892edf1a02d962ea97dc40ebe3a8cb1f496435248266eb86ea861571b4a26f6649e2230c2d2313454764d16847c82219791d220e9791e12c0483f398cd21afdf16de5dd271b9f1c22303e2de8d1ca425fc622259f7de9d77ae463359eb14711ceaeff160cd0d58a0178b6ccfa2e0ce42345a9180863ae18f70f0a3bb1c2922fc56b914960b2e804af44c990288d4a13b9f976e6b1e092fcb07af6150098dcc924ba2520d13628ce3f46a9e0edc320edcea6283eb6d4ddcc0ad5ee12b0d2efcf008d66810f46a830ec1720ec19ae2aba725fb190f5bc7230841e6be2c04ffdecb2358abd541f736e810ace0105cb73af635370d8441698303bf09ad06d6b99ac7a0fa17e5d0c35985d122a207f7e6914a52960d8e20842dcd4e0de4e1ab47f8766431e7dd041d84950c840950c08d8c5cd1b2d4381a0622d510afe28843e626ce27802d1b935ee089b828b3e6e58de5ecdaaaf4b55573da807340d346b5e1a6ccb382b001bc9bc2917b9be424a9fc590a9904b1e8cadaba700da74c1f602bdcb50626545a1d10f24ab305950626894cb554a75c359cfc41225bb9c63b45bd452fea753ac2dbf2245cab23bc3d4fc2eb75841bf2245cc71106e077b08eada9278b78ad9ef806ae4b618d778c76a951a95ed6b2479bfa3e26d3495962d9a19c6d2bf9d790eab47acebdf3ecf4dd797661e7d92f3ff36f93ae9bd4732823f433ab62b87a641d1338193122ff1ec8a7c7d5b0c6fb09ff066cb76f19ec4119245c0c58a15aac93d0464e4228b6975759427de8df170a2e9d46dfd2d98bd269f3259ddc5bab93cc26cefc8164f6f9b1ab7bf5a66fb38e70539e84b7e808efcf93f0568e300c8a0e88ec20f1bff2278b788d9ef8361df1830c71186b0421be9deb5ed8e72657a57b59b3b2d0110a3b668305ba72075671d4e0632edd27f7d680aa3a3fa27c2f3e8cbdd84c33747db781d32910fb1106a704e0d4f4f4fd96f34daf7ed0dcddf4d63f6f774b869e7547b334edb05ed376e8d4f828a3c6b703aaf14e8e38ce1888ec082f9245b95e4f791747195a020263672f020cf27673c461840d6ba36c681f2004dca3c3a499c1249bb20b268d3a51b6701629124c947b7580b7b28033c45d00dfc71187c0169c6856580c936ced22217f8304c34d9c49459ff69a5193ea7715f5126e669a1443e29e785958cb5f76bdf3684ba045f632dab04ca7b015906f8feddceb7237c5f1157c882946d73c20fcaf059be70246bd6568a1dbd14237b1adb3bff54a9ad3b2ae87387e7aa06cb5b37c54e3033ab086d2e25fe73bf673fa8d23a0a7abaadfd64426d09bc2d5798bde75014b1b8f50f75e911ef3a1426654965994754caa18321f8d86dd1a8d8c6542ebc4cafb38cafbbc0f799be44a27e1033a2b7982b392e0af86b15d932aeeb6da1bc4661ed4d5d8c5d50801fa98e47a1697e6ed5d90e95152909a0fe9dccd49dedd740771378775fefd14e3df595fe6e2df8fe8bcf069c60bffab3c98173eca11870122ecf0e10788c2fa78d69dfe16688018d3f17386e1e77245307e8ee9f839ebc24f9a955cf8794ea7d3e7389d86f5e6db8134b759a7b9e759cd7d1648735b74c4bbf96e116814d6aa237ea100c4db38e250be47e439ec8deb28f7e64b39a103a4af0080b4eb88f7178078878ef840018877ea885f2c00f1e33ae2970a40fc848ef8e50210efd2111f2c00f1933ae2570a40fc948ef8d502103fcd1107670b9b6ff375b6cf73c4c138c38e5ccfa943172b7e86230c5cc296dbbc8cca591de5a17c299fd381616d85757836b004fc9c9573f1b34d8eeac6d41b2ee985682b2f3deea69b8e9c77d25b419c4fdd12b0dd6922906cceebf8fc18c72798c2f44a95739dcae2cd1a238f21b5c79ebce5cf41b78e83618e03fd1c24bfca63cb6b59e62d14a4bd1774ed1de1dafbbab0e3273bbea1d10d17390dae944cc74c10bbc0dd14e62c122d9c9365fb64554bc8e1ac36ea82f2c1dae1277e33ab193d3aa44739a40773eac3e988cc5dcf79cafaa773e1b757c7ef4d8edf4e913993d18792b4f4c3eecba3d81bf41627bdb12a9bfbf4534178e8d3f1708be3e1a283075aabc581d56b4764f17b288f24d90aefd666ff5637574efb759c7e9ce3f4444e76cbee6530877043924aca67f9fe95b9c72b081f033a3e6eeb24169c0fbbed435872444ccb12964df2a265af0917a27f5dd471fa098ed3ab3e75f305b4964bb2af4d23f64392f301f1aa2402a40aa3a3b94bf7928ee717399e7b1c3ca7ed03e538cd9d253937abe2cfdae4cedf651d7f2f71fcf5f994693f7adad4cabcddea5a9a411d8f9fe478ecf2f083d3d2c75bbcf661af84b9ee84acc59dc7c2707245c7c91d9d87f3c7c988d4c84576ac5a781eaeea78f8946e54e247e3aee16af832daba195c6b4896889f7b41c7ef18c76fab5666a32b2b2cd4b3c10900c07772e57ea1da7d4dd7eebb5cbb477deb1aec5d7888fccccbd1318c8527645b73959169e95dd7a190e45038e51b8561f4f1107d000e832b31865f7ed2be200837433a6eee71dc1cf2f066d6e8581fb3d07b7c2babe46f2402131603487b513cc97869298e1ba312c2ff9a29d43f2bd9016f0891d63d61bf34e24e615ce8df269e12ce35cf5c5f2ccd6d257090e5ceff8a66f64bb4558a239b96441a7789ad354e613f4d6595926a591cb74435e7a84ddead8029c7ca725e8782bf586711b8aef600442ad1632ca1a90757ed499fee1ae0e8b72201fb6dcb02bc400f38f748602670c11c86f4f053152d4b00b52993e058ee145e2c9e5073156180e76e591a9efb26e1819d37dcf27de614156c3f0b036c6f44d2b04d9b844db7eb210c207d48ba5ecab46e81e34f60406485f03038cd9c1e7c1012d8fe4674eb6593b06d4002b631ef53a3c165f42b8fe4b73080354374ec1593606d461d0317dbafbaa33d159d124f49a01706d02e206855510771e74c6ea10e2ff1425a3f4684c5c101f118f71a2e22bd09e79811f77b975acb412b57c67cb1ac7153ccb736c53c3b694ceb2262017c6e2c800d8d31439d7410c5073f0908a266c5ff777c9380f8064e6fac3ca740b0ecd6bc49bbb55dc9d50a67e7703a5b1fe0279cf5e773524a4d8625abf5c35c2ed6ac95b880059350d66305f6ccc08caabe07f5f211372a2b1c787b4d81b79980f76a31f4705c7564f78567837a58650aca7d04ca45d37a08a7c2c1ea9ca585ced57163e06d3105de7a02ded2eaea61d8ede12e02e5b2693d4ce1bc251459549e3adcf6700b01ef8149f01a941eded77a66dafc3171dc1c9835a6c08c11301f961298ed2104730701f351298169d0461a03731b01f3712981d91942308f10309f9412981d2104b39180f9b41860ea064299fb798c76f37a5360ee24607eba94c034e8808c81b98780f9199360422cb0206077fb82b076c23e59b919beb0b08ac0f65993b075323a6862bbb8414370dc9410f613217ccea410603216e623d313b5d6a3e1ebee5102d9e74d42166c86f2640823f25304ca6726a1ac535042c55308a44d3b95bdb05e38e0a2a6801304b8d78aa1833aff1dfe88672b81f20b26a1040eeec90b58741a419acca68e1074da3a02d8174d020653f0e96585f42a5df827756b08845f3209e1c60c08e941f34008c6914b219c8bdc44e0fb72e978608351b5b1cedc49a07cdd2494b05c0f0516d1eecdad814ebc8e40f715d376704ed00884c61d23ea518321609d29082b09846f14a323fb5b6435d8918d45d30709945f3509e52e064aef17880d8e0c0f9b82b48140fae6ea6a67d8ddcc2102e5d74cbb197ec0d38b36337c839d8d04bab78aa185fac14ed837a23c4fa0fcfaea42493bb4c1396f631dba9d40f90d9350d622b5b531dca920a07db3741c4a18f56f2f81f25b26a1b422e8198c56a6b0d8ec1a885d6a097cdf36095fa3d2c419dc923786075f2c6187b68ec15d6b7bcc5a08b0df3109ec7ec6c52ca28584ade873e28ab0fefdea5a9bae2d23007fd774c7b7f7fd8f0b7a14d202ba232816be98663b81ef6dd37e3bc99e9a630cb43da640ab27a0bd530cbfed6fdc6870e7a331fb788240f93d9350e6364d6130b636d6a58f1148bf6f12d27aa15b449d0bed26940801ef5d93e06df3e8da45f2cbc6629bd304c81f98f6cbe9191e6b5627fc03f26a02df0f4bc7c518dc756bccc51c2750fea81850fa5b543018651bb38e0708943f2e3d6f6d105263defa2881f4bdd5d5ceb077f46602e54f4c427948644e622c215dd8bde33cd96e12f5726d4d697410987f6a126618228d639868fd9ba4653caa72494dbf3d11d62107c6a77f8d01594e80fc5931f5754ecd5bdac7286402b9d6f4354160fe79312cacbfa1545708a13c49a0fc85492861ba706945234785753abf31c07699026c0301ec97a66da59b77a7e1a4c16192b170f23001f257a5026418e3f2dd04c8f74d02d9e0610dd7c26b736d04cc5f971298617c6d2e4ec0fc4d2981697012d81898670898bf2d25300d0696c6c03c4bc0fc9d4930838d204f847004d945a0fc7d31a0f4371967502b8d4dc63d47a0fc834928ed3d1b70243ac4dfceb765f5ff72d9a8576f37056c935833a73e26e030940f4039362ae588b9eca08b69dfca8df97ee92016717b2b3de66bb926e6fb55af98e77b24315f3bb6623ece0a8b69ded88b69a2d598cb9e8798e7c6642752fcbb5a311f67edc57c9c3f651d4bb949693894b46a4b0aebe0ca2439a2320e8745e07f5e097232bb3b4dd06f776a7f04258ef0166ea6603db3106762729c7af3a7efe5eb5da41287998b35cdff9fa8dccbe210be46da0ba07bde2dfab3d09fc2ba5aef70959ea46f382c7d3e9a0ede27935e0aeb8def294d2d2f1cef1f666a7963ae5a1ebc457f31a9e516356bd4e8a07dc90777bc1c9c3ca74b2da03ea40f85b6fa3cfcffbd091f483462cca0a7d623afee23af29a43a2bec9faaa8fddb803effa6481ff83c24e07f26013df889fe0f5c3b2b47f5aa0000 serializedProgramBytesString: - serializedSignature: 0aeed4e6e4b174eb67c4022e258912feeef0a5ce6ad76d747a212d13e6940060f8dcdb3ea8a93194df44e6b3559279a8ad391c8a7ce717496d939a59315f700c + serializedSignature: 9affec3cbc74cf1c81b53536fe2c658d81d9684777f9a89426dc6441b949172e02b429f8c815cfa1e458612c248429d3166815e4e76c3b85d6175e93c2ced708 programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset index abbcbe7..975b1ca 100644 --- a/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset +++ b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7d6c0e702c109ee50a0a59052200950a01429105c4b0215da420809a424902641eb2d2d2d757777777d75777777f75797c7376776363977ef9c7befdeddb3db7ddf233f32593b33e77f66cee8ce36c815f25f6ca0fcb540cc1313c560315f2c15abc44af9d7441956ca1febc83e3f5754cb7099fc5d2caf0d14bd533c09fffac7bac8dfd3e4518da8954fae1625322c57d70b45a9fc7b9a7cb6541ec1d932f9bf54de156b241f9a2f0ac41c315b748e754c2162817aa8469f8b815eb1a6f2f704b15e5e2d5589824872d5a5cef257a1bc52a3ae55ca44dbf72d147b29b52ae5b512f94cb5a890329728894dbf6f2fd41fc20a3e95ff1bcbffdfebe3d774f8a53eff83e3fc57fafc8ffab8910e1bcaffcdf4df0dd039b8f7dffaf8231d66a17bb3f43d3fe9e3c63a6ce278f6751dbea1c3a6fafacfe818d2f29b3e6ea1c396484e16bade4a87d9f8fa962d5bfe72a4b5354a6b6b1db6d1cffce2b8b72dbaf7631db643e7daa273f0fcaf8ee7dba37bdbebf0337def6f8e7b3ba17b3be9b083bef777740c61471d7eaeafffe190d519c97a45875df4bd7fa27bf0f9bf1cbc3ed1613724ab9b0ebb3b74f9dbf14c4ff44c4f1d6ee548f37f1ccff446cff4d6611f1dbea99fd9e278661bf4cc363aecabc3b78878faa167fae9b0bf0edf26e2d90e3db39d0e07e8f01d473c5f08956f1bcd74c81884640cd2e1601de65a325429865fef6a196d1c32862119c374b8830e872319b25c342a703c3b023d3b42872375b863fcb359c2f16c1e7a364f87f93a1c42a4fde9ccd39e107fba69c7cf8c42cf8cd2e14ea2def7999e19839e19a3c3b13a7ccf6ce7ac6b1c32c62319e3753841c7a7fd63d6eb8e6726a26726eab0403f03be1797cbd7ad781b8fd6c793517a6c1953743855c4fbdc693a9c2ee27ca89285e398619069e7e759c2ec5fbfd0e15c9dee8628bdf6790867ebeb8dd0b1fcbb498e43ce170e39853a2c72e8a4edd0a4b73e5ea0c35de37554d7b3743c38ddbbe97077875cdb97ee8118ec21e2ebb6853adc3309934656955597ef20fc46871bb48e59e818c2fd74f8be0ed7e9fbecba74ad0ef74669db1bdd0be122fd4c13742cd3d2e2047dfca50ecb0c32d6a073dfa073102ed3729ba2e7edf3102ed1d79ba1630817ebf3cd5dc6bf5887c58e73a0cb7297b2ecb4941ace2dd5e96b818e212c11f1f9b044c76da7eb2b1d2e4f11b7cda71c9db3d35d93e6b3b5e85c8de35ab5837bb50e57e9f32dd131842bf4f9563ea4c59659653857a1e3c9f6319e7d0de72a753c769b6e058adfbe0ee14a1deea3efb7ebd8e58e78edebd0c6cbd2f6ce4279ce4ef37a746c970bf03376fbce2e3fefebf020115f7e0e1289be01aeb7d3c787e970a30e3fd0e111fabef6567ccac760df73940e8f44ac8ed4e126fd6c07742cf374b6ed0bed7a69337af6531d9e82ce9da2c313457c1e3b5187c78af83c669261df7b92e1dc71223eef247bfe64c3b9e31d79e25824d7be0ea1ed138f71e489cd3a3cda71dd6e7f6bffdecad9d6390da5c5f60f67a073a7e9f074740de476b26c5927cfee739c899e7d558767a17376bc67a37367a2fbec6b1087ddee3f4787e7eaf0431d9e2fe2f255f6c1fafc053abcd071ffc5f87e94ffec727e134ad34d3abc413fd3451f5fafc34bd0bd97a07b21bc54c4d767975aecdb9ca18fbfb58e5bb7b1d2dda6ca918eab44a2dfbdc910dfd5e8dc55e81c84578a781f7ba50e2f17e6ba2d93382fd7e1158e73a0dbd7846ed7a419cfb5e8dccd3abc0e9dbb06dd675f03bdbaeae35b106ba7ec1bd131f283d98febf3b73a9e35e5952790dc2774f89823af3caac3dbd0bdb7a17b21bcdd91576eb7f8b57f591f7f671db71d6da5b1fd358e74dc6de0f98421be7bd0b9bbd13908ef72e4957b75f82ff4cc5de81c8477ea67baa1e346287d0feaf0be34d3773f3a771f3a07e1030edbda7eeaa134653f2c127ddc0be8dc0b3a7c5187cfeaf8baa363089fd4e77b249165dffb9ce1dc53faf99e693cffbce1dcd3fa797b7ce24924d7be0ee1333a7c44c4d7110f211ef8ba3d36f492a8cf732adf237bda2c1f47c7a8ecb4b1fb192f3b6540d9c98aa93ed454d99a2d962daf5c354807a313e90e9bda4fa61e3005d18de117fcebafa2ad950d9f2a29c0306a395f8d89d68aa1628871d4b2ab6a27d8b14f54bf8be51de54a2844e688e2ce8428207115f2a7140db9d6c8f353d4882d0cba96cb2b8365a7b55c3db558e4cbceda4287940532da0ab15a1e15c9df554ade6299ecc43b53a904c3b3ce67e64999d6e871a53c6303ad92c7152a8585eaf71a95d25295fa69f25cad1acb5e299ba11364b84ec596a87bb5fcdb14679146664ea37910993a6f0d55db662a90da40ea73553fe87f1609c3226af8bd57cc2a868d72d508cae6044bfc8fa1e5646050659a9691af90c5e2ce0d11b96adc655e0241f73a266a68cedfa978ef95840c98bbb3d2a0dec2f02f2b5eada122570d13f548a15632a8202f47f546dc243f2bab511e24d2893e66409f674f1319356ae6d0088e08e10d4c7655edbe4358ed9a6e253b45cd49968a3912d03eda3bdaf1ae529e1152647bd979322c53a980f325da3cc9e34a9e6b9ad4f1a9679cabc61e26b9682af06b01496a90d75837707262bd8da9b3ff9a20652e9771ad5135cd6a19932986acac84b2a16268ae62f867e94f159e86a6fcaddab08501fa2debbe72759f7bcf0543aa831c79d06c9996ca32894dca54f153f41a995c0fd06ba51ab2f14952cdd2457aea7eb56e9a562a66c5893ea925ed93b24c3653630365ac369b2fcf598de849ea6ab9ca9983e3f4007af47d96bd66a96509ab550a925b363b6dcbb656968549538e5452f66f6cb23fb8c43606b798073e08ba6dcd551f2bc1e2cd698b3731c50352da99f2596b95cfe64b2b2f9527e17e2bcfd5ea1c5ee32ab73535e536358b5114a087806bab94946279af7b1f01c387db3bdb02e6acd44165a52e09caa54e02954d9a99cc07083b1a53e5344e07da38cd29c99dbc4a6e4165edce54d6ee9251d66e4965edaea6acdd4abbd0e592fa5a595dd6cabfac355073a0927391ad5b51fa75a3f4eb9e917ed9947e3d4cfa652bfd66a96a1e17e0992aef55b9d2b0b5296648694f9357750a6e4d0b6e63120cf9652baf99ae2d95e45e1e93dccee4c454d6ab6475625425334f35dd962a4945f2f73ad524a8d64d39ff2ad0de266e46afd747793de8c8f2a799f293ed29f36fedd1fc1d4ce6571e20d856ae55ff5688e4630d6653c202b45ee9f4cf9539fb0aaaa59b3c0d94693a9a4c0304b735276be704f3f4a5cdd389b27b3f8f76ef4c09eeef517017936035ac21bc8f397435e556558f9487e2ac664a4dd62b395031d588153e3b29985468e81c4350b5d7a024eec87baaba28c398cbcf00557e78e3a7ca5a3793fd55a5bb3c14fbcfd28d10e821837dfcb5fef669575103954d0626b189d7945216e96e2aeed088830c423452717fd34a17a46a9dab265c0f534e681b9e27c07a0c53fffdcd0b834d9ea05d2a4fe03d55bdd4f2bb4a91a7961f8bbae37cc7f110c7f150c7719e9e09a87f3edff17cbee3f97cc7f3431ccf0f713c3fc4f1fc10c7f3431dcf0f753c3fd4f1bc754c38c1dc944ed03b7aaac8f5341539708279267fe12c5303e932b5155596f34d65b94542598616d406539c49ca712f539ce0268608a251e7a2f5d49b2235d423a93e14a9612652d6a8d35c7968d78b05d2ccb57ae6160cef86d8d686b87355ff00008531c6696be1afc7835714123c9eeaae6c97a4d8659e1ac82cce5f44e91fae4a3f4f32a852bf0d95974778cccb7da9bc3cd29497b389bc9c49d9df962afb3bfa50f6fb51bc4679e4d59fe2b593895747c5ab7e380e93abf1e407724ce9003f30da5070f23a24666e9dc39d510ea7a3dc8e623ac623d30114d3b126a61dd2609a497edc9eca8fe37cc88f034dc2a10edd59781c1a1c445965bc47ab0ca6ac32c16415ab3d601a807663835c539c70086f6739870f62261b24193ec8a348157824954f919ac4476a08456ab2819431b726213594caad53bce6d661940da67ab4c10e940da6996c60f544270b6bed1cd8017b113776184ed961ba0f397604456b86475a23295a337969ed48d19ae543ae1d45d19aed91d64e14ad3974f9860ee03a47dde486d4688ad45c1f488da148ede291d4588ad43c13a9e68ad41e6a0aaf5266bd52d917299517dd701a678a11322c4c6078adb577360907fbc20cbf273f389eb2c07c8f16984059600195570ba5ef9d2376556daa22f9f72469ac425736984829b3ab47650a286576e353661265f3ddbdda7c3225790f83e4981bc9534c9261ce7e61dd05c79c3dbc39ed7ece7e2a658fbd4cf6f077b9cd344ac7bd291d1765a4e3744ac7c5261ddb8a649d914c5627cca07249b1d7fc379322b88422589211c15914c1a5fcb9643645afd42bbd3994e432af92e75292977995bc0b2579b957c9f328c9e55e251752b9741f2a97aec828971651b9b4823f97cea7e8557aa5b780a2b792a2b72a237abb52f4aa4cf4fcf792bb517aee4be9599d919ebb537ad698f4f46b21f31ea6582195b0298397e5190b296cab296c6b32c2b627856d2d7fe1da8b2a5cebbc16aebd4d92e110f6a2f0da275b44257b83d7642fa624efe755723125797faf92971824e7aab556412e4cc3af9db85f987680a9b01a67940e14e64569a9e2a7668b4a28bb1ce4d52e4b29c9077b955c6ab2b85a00b798d5e2f6eb4185b2b739435e83254ba5ea754e388f6baaf12a86fa578ae29f489e170e493b2f1caaf2425f217c4b19954bca4cc4d5cac025ff28e2f62e9ceea91f9636f58d8a7abf0ca8274b1d457e1955911cee4345b2dc6456b52e339cb5510bb40303930cabc3e5df4a8123d236f226916ad98ef7b452262fa74c7ea40f26dfc76472b55a76d93fc0e4fe9a1bf6d74a5818a256866e9fb6611917876c56798c2f2954fe5a61ca5f300e0e7b68791d07afa0841fe383f04a4af8b13e085f49093fce28fce0716e84af3215bbeeff8c6237d4e76277bca9d8f57053ecdca728bd127782ab12e73e155489ab32652db0fe890654793d4c1ec499d74ea0f3dabe546c2771c4566d8a0d1ae3b0db5fca01884369c13526c1d0e63c251dc11b69c1b526c17078aaf05ebfaea6849fe683f03594f0d37d10be96127e860fc2d751c2cff441f87a4af85906e16e17566ca0849fed43caf7a3849fe383f0fd29e1e7fa20fc004af8793e083f90127ebe0fc20fa2845fe083f08329e117fa20fc104af8453e083f94127eb10fc20f330987c1e44bea2e3806932f15990c266f34c503522e1381cc351c4e41bcdc0788471884e7aa773ca0e91ade3e4ad02e829de76ad4dfb02e07622e5271d7ef07e3658724d868b5a7819e22686ce9c1b6af39b1214204927aaaddb7c9941d600814769df534047a2455a0aea60a146c6869edde74ad62036b76a9b6ad692f25f76d613705f7284a9feb287d6043e2e6d7ba75109b4df1c0fa23d8c3d8cbfaa3a329cf73a3c9f358cbd9b0bf992bd1b99bbc3ac614238ce4c0b6c209cd7c18f6e82d127f25d2db4c4779ac294ae822c34ec55efbdfc751c26ff141f8f194f05b7d107e0225fc361f849f68120ebdb9db4d66f6da9b3b898aed0e8ed84ea662bb9323b6534cb1414f15f678f6d2533dd52418dc3c6c1aedc9cd9f66920ceeeaee74929cc45d9d6e120cee0af6c64e705710a3c95d958bfa7d64ddb8ae334cb1c3bcc3bde9a8b589167ca64170ae7a5b359c61b622c1b72fcd7d2656c6c6d0fd22d5b097b77452cd9fb34c66866cf1403a66ee439bf96caa583ce8b1589c63120ccd908704d10c795864d24f39972a7e8f988a9f9f3b5a9d678a190e61d37eaf3d94f34dc2a18702bbfe930d78670457d2115c40d9e771ca3e4f64649f0b29fb3cc96d9f8b28fb3ce5837d2ea6ecf3b44ff6b9844afd333ea4fe529370a866e13b019eaad9cb28c9cf79957c3925f979af92afa024bfe055f29526c9b0a00abe1391d2bb1e480bbeca241846f45f4a47709211fdab4d82e1f0651fb2dd3554aa5ff198ea6ba954bfea43aaaf330987c6ee6be9a43a4963f77a2ad5affb90ea1b28e16ff820fc464af89b06e16ea7096ea272c95b1e73c9cd9421dff668c85b2807f28ec181b87ac7e8564af2bb06c9ae5cd36d9409dff3217fdc4e25fb7dafc9be8392fc8157c97752923ff42af92e2adf7de431dffdcb2418aa978fd3119ca47ab99b2a829f782c82f750b9ee531f72ddbd14e7cf3c72be8fc2f1b9471cf75338bef001c703148e2f3de27890ca765f79cc760f9904c360c6d7e9084e3298f130c5f91b1f383f62120ea3c7f0f1379ed1e347297dbef3419fc728e1dffb20fc714af80f06e16e5b0e4f50e5f4478fe5f44993601896866f207b1d967e8a12fe930fc29fa684ffec83f06728e1bff820fc59aa58fdca56ac9ea3a2fc8d2dcae7a9287f678bf2055394e065ff48a79424f1b22f9a04c3e19fc2bbe378c9241c9a67f0594d4f6dec9729c97f1b24bb6af8bd62920c435cff3119175ec8eb62b6e6003a8e574d71c0a8d89674ac996464f835ca9ae0969dd69ce7d29aaf53cc63318fccdfa02437f02af94d93e4f6ca92d4e66f2d9a361edb7bf5750f8cedbd65cb41e37aaba5ce095126d9fced2d5394e0601bc5bc2fa47e9bd2278bd4e7ce9be68c555ad4ffe54a9f77287d1a1bf479e6e999aef47997b27c1383e55d7988f7a86437359ac1dd76f3ef53e5ac99a19c357259ce3ea08437370877dbdcfa9012dec207e11f9984c33c43cb98b7b7b13fa61c66ab74042771989f9804c3545a763a82934ca57d6a120c1db9d6e9084ed291fbcc241896f2b5317900d8f9fa7f5b533bf1e6d2783f37e105b7d1d6ec365c358fbf3009076fd7ce6b3df7a54932f4a2daa793dd92f4a2be320986164f8774042769787e6d120c03121dd3119c6440e21b936038ec64f070460b26f170df5216ececd582df5192bb7895fcbd49b2fa3e56cc309b3b56d88b46e3dfd09d2d60a389b56afdc30abd3474b058247f96a92b8bd47c6f89128497cac01d2679d45bc26e668b7fa034eb66d26c26a1199592f1f2af6a75ced2d37e316a91dab9a47e4d4afd3767ddea5a1f831bad7fa4b4ee6ed2ba4050eb5ee25fafcc4c5b7792dd68f96f4acb1e262de7d7d9d65ea28c17285b6906ee65a258af679a567767fdb2e7792adda5528b35eaeec15a7bebab55136554354aab4af48c930ffe10a8f3da02f96cb994e486c34f14879e260efd486be31d762cbdf0d7b8fc48e9cf544ab732a514f63ec331c67f1bd14a21ac1e59a42c09e9049dace5762064bc3ae74c77bc94e4d7925d75a3f72f94debd4c7a8f7261a11aed594b95ce4b54ea52ebecdd92bf521af536693423038d6ae5996a5d731409bcfa8ef62af4d7e3fcd0f9374ae73e269dc7bbd0d9ae1fd7eafd6896cad4af223fee43eb9ff8a51437fafd4ee9b7b549bfe119e807dad5aacdba97a9ab55f26f583d6a6f319fe829eb3f24e746933f284db6316932cde16770acd8cbcc52ab39c1c354890a95eee23a7f932ce5c9aef8a3ef9f94be7d4dfad29b76247e6e2cde7e6bea84d075be9b74ff45a57b5b53ba4767e0454a94cd2a34575babe42d16af7ee26f4aab7e26ad66935a393f3456dfd6a84df00774fb225d4fe187e6ffa134ef6fd27c52469a4f16b06d7a71ca7655ba652e133db7507ae650fec5bd9ef59f32c9c4bef4d399e80bc37c467db733e93b21237da7a5d156e62bb3314ac301260dc7b8d470126a9dcd90ffd7eb9a3eb1a5e677dfa001a5d7f654cfde8d5e05f2a82624cd1a529a0da4344baf2f315fd9aa5ade0be319cb92d4f15cbd8546946683a8310b2fbda439061f11461f298bd27a30e563ccde006b5c286f5ea2f25db11a6d30db117b92f43c4c66ad9dc69486b9260da7a7288bcb4599d675a21a35aa541abbd78c53e32694c679548f29b54de1d31635f2a7481230e540f7ba659e679b52fae59bf41b97967ee36509c56534acdcda8cd26d8849b7c9c2dbc8e914516aa8fd331f3775a369734ad3a1d4e88c2925f395c52ab4e5acf72121d5d3e45fd6e3e5865a116f20e05fbe6c416934cca4d15097b68bef1396eb9d40ac717dff746849e9b08349879119e960e53ae7abbae98d5a0f75a54d2b4a9be1266d7248df1f9f82784b987a82998d276453a91de15f6ad7fb96dad6546a47fa97da0dbea5b60d95da1d4da95d92566a87a598914977342ab311ac74d2e786505b8ad02877bdebe4b35785296b9c74a4fad1936947e9bb9349df9dd36a45cc53d78a559acdf33741b523da53da8d3669774c9d1f0f7a96ae4094d6d5124bc56495572a550c998d49d05ad46fa864de4ec98f3cd581a23ec6447d07b20c99363a8af78c76cf0a3429540ccb7c6c0574a4f4184bf585dd8f3ce1129dc9589bff1ea113a5f53893d60b3c6b5def1bbdeb4fcbca8444678ac4ce2612e5495b8153e2e69cecf6f904dd66a76bb222113f93e87eee313debf8c1ab0bc56b3c55eebdf4daead7f5942abd6054c29f5aa32ba5c704931ebb78d423755bc08d743fecd88dd27f223533e6bef73349ec2b1f072189751c4fbfb43ba55581bbd1e8e42dbb74c612fc6eb3f6a0349b94791f64185bffae2795dac9fea5d6bffedd56546aa7f897da4cfa774de44f4c7d297592ca5b30673057957538aa11b9bde4a5585e5dd9a4b7d8b4cf43fc95b2e441e92aaa9b5749bdbde65409a2710361fdeb1f0388a07c15f02813ce7dbdacb9c10a4dc3de9e6cb02a372b757d54228f67aab19ddab4b73935b5ce07a3f639d62efd0d4f9ddf698ac59a688d6c5992746f20fddfa6e934b06a0b6dd506b9f08e82daa32c93dc943a15d321b686e63c94f8352ddc2e34a5dd12305bf71e526e009532be545fef1aa40414690129c5cd47d581495c5795c9aca1f86a614d38349585be4956833cb0c30c4e58d627fcc026b8e69eae3d0bf44ea380ebc8ec7a5c33397125fb506414404193dd06358b13542b0d0ad6dfad45bb7ad7c8bf574602d5fb59f5a866f3a3721641e8e69449415140754b9b7a547338513556a8e0f162b5ba330a70e09f0d672ebf2b4ff635d628e09adaa01ed72efcb8acd15b682ad8232885aa8db5321dfdfe01b860bf4d1bd73c4e5c6d49870ecbc797e9ce4b1490ad6b5c8fac901f59aa2f5a4401d931289715f1b7ddcdcd8632f9130558052a7f35c972089f9c203cd31ea33bc274df163ce024b14e26cf7a57025afb8ebeeed6f2967f5ccae7e3be6a4e42a32027692b3d278d7a322745f33527653ecd49d35fe6a4510de5a4e948ec54d13ddf9c34ba7b3929daa3f50351e601a43c18885af0ff7c8c28afb73cb52b40f85e43b07ce76e9cbeb389b21b580e5ce022e9b11c31f44888217ed77ddb2b9ae26a16e7370f4c27f999f84ed88ed2ae68760f12567e04615d8960ed1124acbc08c25a82602de4efce2f520f5895d24ae57ba0404ee203770217b89310b83dc30257c007ee502e70a720707b85056e720473dcc908dcde61811bcf07ee5a2e704722708bc20237318239ee44046e7158e026f0811bc8056e3302571c16b81df9c035e302771802b7242c7023235854f745e04ac202b743049b23d508dcd2b0c00d8b608e5b85c09586056e4404c15521706561811bce076e2317b81a046e5958e0184744d8c0952170cbc302c7383ac2d61c5988c09587056e281fb84d5ce0962370fb84058e71a497ad39528ac0ade004d73209b8e815d4c6085b4510d89c5b70e4738e8c74e0c2762bc256c989cdfa38b35ae3aa27d5e60af84a71495db64f585119017cdf227c2b39f135d7b90ebf4091cf59a3667121bb1f215bc589ac9d425685a66af1d42f241cde135b174184df208455e1f83ac68e3e5b613d1561db97dfd72d4af26e1a631f82ad61f200c257cd890f566b58af6197eb351bf6eba1d6a285e88d067f82d0d584d3a6631c2769cd85ad3dc256cb89ada9c6b6529f58c439e7d0920bd758846b75b0b8180793d8700d46b8d684538b3276b4d86ad112846d2d27367b718d5515b02eae616ba9ed8760ad0bc7f14771f6b41bc2b63e1c6c8c13326c6320ad10b60dc156008c631f6c15c04e08d77e9cb8c017af12e645ca05ea8ab5d2771567e3763817c6b711c6fd3931b6d6b90ebaed16c2f80da2186b53b60ae22204ef8030e131f648d9e09d87e01d1826bc28364d0e47f00e0ab6b2601c3c62ab2c06205c0707816ba98ab8963777f5e1c27516c27548389d2bc6f5966c9dab3b11b64339b1c1d04a8de11dac0952286cc2082f06591fda891ec43710c4c3382166e9bcb781b790f6e5025589406d0c0a146343830dd4f108d4e14181626cceb2817a1a813a220850eb230aea29046a5350a0a258f48e43a08e0c0a54149d790502755410a0d645b4e83d89406d0e0a541473d40a04eae8a04045d1471d8b401d1304a8b51105750202756c50a0a258f4562250c705052a8acefc1904ea78fe61998ab8d1fbe8ade1f914e13a219c6119c685286c230a97236c277262cbd6d84c5f7c60f5646caf5e1f85d09d14ec3033232eb661e6ee08d7c94114d0c4996fc62d25d8160cf446d84ee1c446bf6d92cfb98909db9281dd10b853c302c798e3d8c02d40e04e0b0b1ce326266c8b3af740e04e0f0b1ce37215b61c370d813b232c708c936a6ce00a11b833c302c7b80c8f0ddc4c04eeacb0c0457113932908dcd9618163dcc484ad1d3711813b272c708ccb53d8c08d42e0ce0d0b1ce39a5936707908dc796181631c136103371e813b3f2c708cef9db0811b83c05d101638c6d90336708310b80bc302c738a8c4066e3b04eea2b0c0316e62c2066e0402777158e018a765d8c00d43e02ee104d742587bdc27ae648cde2cc31708daa5e18cfd32560b6c034a5908db65c1ce30300e5cb2cd309c8e705dce8fab441dc2773c378884ef8a446082f97384eb0a7e4f963863cad88d67f3643310b42bc380c63868c4066d3682765518d018bbef6cd08622685787012d8a1be1ec8ca05d130634c66e3b1bb44908dab561408be2c299c908da75614063ecaeb3416b8aa05d1f0634c65e001bb46608da0d61408be25e2ecd11b41bc380c63828c4066d2082765318d0187b9d6cd0e621683787018d7171161bb4f908da2d6140635c5fc4066d2f04edd630a045711be03908da6d6140635c1ec3066d2e82767b18d0a2b8c3c12e08da1d9cd0cc3b2647719b9b8711b23bb99155ca83758e3daaa287ec3584ecae60e70418c76bd9e60446225cff0a62e629b1c719c5c1c74d08dbdd41e4324b4015efb8065ba15c8f70dd134e2e8be2bcc02d08dbbd41d49885fa910ac13c25cc3669d71121bb2f889c963893ce98d3d866d23b236cf787838d7166800d5b5b84ed81601b1b8c3d00b6c6c6d108d7839cb8e0655afcf98fe86fb5fa2642f710273aeb0b16f048b12aa265ead64af539064b10e3775372b9f07d86f03dcc5d93c2c2972af9d86a157d9160fdd44c1f2e641f23648f7022b3f6485e19d7f3b4bf1405df868af6be0b37238c8f065b45304e1bb355113b205c8f85d35388e21c6831c2f638273658ae5ca9fc1bfea4d63c1d46af67fa2102f70427b8f622d54ef0d15d29f90e82f86438bd07c6a997015cd8ba226c4f85e3eba23837fa32c2f634b7af036ca5628dfc0fc99c2da23cd6bb2b02f74c58e0184747d8c0ed8ec03d1b1638c655466ce05a2270cf85058e71a5111bb86c04eef9b0c0457117ad8608dc0b618163ec41b0816b82c0bd1816b8287e4c701602f75258e0a2d8d52f42e05e0e0b1ce3e4331bb8a908dc2b61818be2977ca62370af86052e8adf97dd88c0bd1616b828ce789d8bc0bd1e16b8287ea1714f04ee8db0c045f125ef0b11b83739c1d91fe95d234f54f3f6160ee482f52082f55610b02ad540392b2cb69d3dce46b0de0e0a16f31734d8e615f647b0de0976da2f8a03457d10ae773971c18a9d627909d681ac957aad9202fe1b7690791d017c2f9c2918c65786d87c5a3f84ed7dfe628ad72431e6b28d5cb8be44b83e08a2559698cb8672ce596de602f73c02f76158e0189bb36ce09e43e03e0a0b1c63076a1317b88710b88fc302c7d8656703f70202f74958e0180789d88aeab308dca76181639c5e66ab55ef43e03e0b0b1ce3820636707723709f87058e71209c0ddc3508dc176181639c7a6103771502f76558e01827fbd89641df85c07d151638c6e965b61cf70402f77558e0181734b07d89e31c04ee9bb0c045719cf73404eedbb0c0312eda622baa372170df85058e71f497ada85e80c07d1fcee025637e63c3d60261fb21086c89ebc7a3b879cf1d08db8f9cd8da89c417db66cadf65524cb45f6abb1721fc37b7a74b7c9137ba6fcabc85c0fd144e918de20ebc97216c3f073b9b1ac5b5bc5b215cbf0481cb1250c53bf9cc3657ff38c2f52b27ae361ad702c960625c15305ec650cebbd481ad32b80ee1fb8d135f5b850f6ad499ca9fc182adb9f2e655aa0d074981d7c5a3e7ddbe43007fe70498b839c14475890d19dbc62b1f21647f84d363602caa6c3d860608db9f9cd89a216c4b45a95ac615c5aae13604ecafa0814571c7ca4b10b0bf830616c585827b2360ffe176fe89bba246b150be88906d0902d91ab56470b58a9e3597b12d6a380321835a800d19ec69803bec78979089f2318bcb5c756db2a8d68f452f0fbe8f80c63881da8ba14b959f8b662dfa1882d520485851ac416f40b01a06092b8ab5e73a04ab1127acc481a1286e64918f706571e2a2871fa3f8dd97a5085b634e6cf6c41e446c75d1578a05758d0f36706cef577d8dc03509a278d60f4446d1f5df887035e5c455bfdf73fd63d1dcefa31142d62c1c8f16c5cfb45e81b0350fc2a395a871dba5f216a0b04a44f563739722702dc20217c54f1b2e42e05a86052e8a5feabb1d816b1544a550a3bae9d5fcc3dcf773213b1321cb0ea252489c1d607cf3856de15f4f84ad3527367bec160f4532bed5c7d65ebb16016b133430c6b7f9d8805d8d80b50d1a18e3fbc96cc0ee41c0da050d8cf1b5473660072360ed8306c6e8f4d9801d8a8075081a18e3f25136608720601d8306c6f8b2191bb0d50858a7a08131be64c6066c1902d63968608c2f97b1012b47c0ba040d8c713d2d1bb0350858d7a081457164368680750b1a581427e60402d63d68608c734c6cc00e44c07a040d2c8a8b0a0e40c07a060d8c71f2970dd84108d8564103639c246103568b80f50a663ace7ac4fafc2aa3dbefcb85ac0342d63b9c9157c69cc6b69cbd13c2d6271c6c8c3d4b366cad11b6adb9b195a9695f6bdfc840dede649b517a1761db86135b0b61bfef542a6fab55370ee3f56c6cbb5bed83a0f50d031a63b7890dda2308dab6c12ecf8be2871dfa235cfdc259cc12c5a5058b11b6fe9cd8e0608342c6f8ce1c5bdbec3d842927080fb6421eac97b525dcc8bc1a9bad48162068db85012d8a8bf226206803c2f1638cb3e36c7eec25846d7b4e6cf01e3af5924e743fe5fb01c23730d8c646143f31d817e11a14c47050fd5b74acab7dd8eacf7108d8e0a0814571b5cf68042c376860515cedb30101cb0b1a581457fb0c47c0f2830616c5d53e4310b02141038be26a9f1d11b0a14103631c931dce056c6b046c58d0c018077dd89a15bd10b01d8206c6b8da872d87e52060c38306c6b8da872d876d8b808d081a18e3a04f1f2e60ed10b09141038be2086c1b046cc7a0813176be73b980f540c046050d2c8aab7dba20603b050d2c8aab7d7211b0d14103635c83c1564b6e8f808de11e7d8dff14e05c7933ac62b65f5465fc3420db0e535f217c6383c86fd6f2956ac1fc395db602ba16011b1734b028aec1be1e01db39686051ac331f45c0c673af5fac54b7978b596a7fd922013b3246afe5ff2a42362188259ff15da5282e8c3a06219bc8bdb143fceec53345001fd31dc005ee1504ae209c459f8cd3706cbb146c83b04de2c4d65ad8fbe3c146e390cc2245c112c05a875ec905ef7c046f7298f0183d1d1bbc2310bc2961c2636c8cb0c1bb58c16b92e5103e3941f844bdceda5afd6a7788068b290a45a9e258228f67ca109e5a2c0be242f9e38ef85ef2c7743ea6e04f928d972a7516e42d55b22be55548598dc883398ea99001daea0c9093a272ca219b48f69562f9375e550ecf80f46261af392f92bf0bc572f5f71c19cbf2bafbdacbfb6a0c572648590502be37542cd35421afe4c4b285e9833a1673d03727c5277772623088b8aa2e96f834274a6b9ff2ee7ac9c956d9e7a86c632fbeccc9709fe19cb4963e590c2a9595ccd7a90f2998aed876ce4ec80113549eab5532ab55e188299b436e831a7a962855b5b5157fb194542cf320948c5ca8046330c3627d4a048ae4525552acf253297fac23fb7c6a99501a924b9b06593e66f67915be95e3541a59ae079e877c6d7df903cea6d234b57eb44f6899c42ab93022f55fadff74b0bb36bbcaa69dd56a555c34e60858ad0a89827f59ff07d254a82d81f50100 serializedProgramBytesString: - serializedSignature: a77bebee237725979a89f44929dfd682919e6eee950f696b90c6eeb9a96320f39c749254ba31993857da9c0f66fbab094b760f0e5c0a768880194f984631400d + serializedSignature: 7d68afa4ed39b746138b2953e2a13fafa566184ab35b45bb060470a52f4f438b78d01f2e648f3004796f866276afb8af56e9431961c872122a2a3bf18664f60e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset b/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset index 0e9c273..e741e6e 100644 --- a/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset +++ b/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ce9521b47109e1548422004e21287e340ecd872c09200c7b90fae24a4cc515c7f1c179661c14a40102130c913a4f2147983fcced325ddbdb368b43bb30730c222964a3bbb73f4747f7dccb5a5489ec1c79880cb165b63732cc736d92e3b6265b89b83f410bed6939dbfca2a90eec3b50865136cd4a7257e1e1a83705d84a713568596a76c07d21295af3313ee17a1ad094f98bb073f136a19add06893cdb315b6cc3246bf0f892d6a74c2f30c94cb6883eb2cfb0d4a4d620a3bc95351062eeb5072426587c0b45def397b41621d42d90eb4a9b003a0f98a28b6edc2d52099ac679eb6f034c67fbdfc39ced324cfefe3cfad8e7cbb7e047e094e37e2e823cad34e5ec710d29470df29e461dac5fbe8179ea17f63d5c14b37af37203c639ae6f919071fed8ef24147b99df608bc75f0ba43421d7c1e96c91f35c8027e009d14d931cb13208f4298aaddd2df4891742c62e915ac15bbad82391c030189a56c921d56d9349b925aca909114f89ea36b116a9488e888bb8b7f5c5d207307f03505333f81fcefc94bd0d04b509263cf20c5562fd92418ee7307952de8f6005cc5641b703d267a2f816d774d3f91d0259c6dd680a6e5b1879063037a0ccf07c4e13a5dcf885393b85f84bc2ac58f3244905948cfa937b7ec15b897f5b9c12193f328775c55be151e6c35cd8334c87d9e7cf99d466e4223087d6c84bb616b9e22d39f2e4dbcc3d00a32511a102d1a93d690549737c5f21483d75c088697d12da1dcbe2dbc9fb2279eb2c89141758f9004350d2ffef1f7f15fe33df7a2f5a24db33c0e1bc61d1fd1bc80457a5963c045c15b8468b4b5808c3ae13764f0d3f0bfde40f8ad7a25aa175e01311a99ea1560e0f0be0c1556e15722b64fd80cc5be37c4e61ae4bf612efd1490589c20760fa07e6caa408ec8406e6b34c8fe51c50be4b60bb96a20e3478e604281a01f0f2a045b6408d2ecec85560437d8125f39e4f8fd36a426d4a812ff9bd0c69a1ee52ef29788ea6bdece1b559c8c3e76a02a47b483101d83ebd57952a1dc2a41b9802827656c261c6c22870ac25199fa6822fe9356f5b967cff6dd2cb47d0db29cd194e814dacb66dbdecaeb0cacbc14296f54ba0608c7914a753199ea308e7505515d5cadbab84c751d37333e5f2e72e18230133872a53d87d7b071ab4da616ccec9184d37fe1e3524d42ad9a844c35c9460f2b2b20fecfcc5a5e84574e6f601fea530c297efdab54d3aef2987ed97402f585cba52a4c1a90f62f105a8b90ee53de3aef319c6b75a8381890719022c9abd46b95f0b334ba4b139972a89e93aa9e33578c169d3293a4cc3dad26591bf316a8b444ca721b87aa9e6d8e4bb4d9764a1c781bee6060c31d22c3fd88312d5caacc3b2553316a6238888a87d42aee92a9987adb6860d4c1b223a25284bae1e30eaed6c79d83825c7f77487f832ee1fc5950e9a65be57eef5dd1fdd232c21866eeaac64027f1b49a788f8c3846d1f783709d5213ee55c1312a8b83534c9c023b27c039b8df06356054de266ae774b75da73c7121e72cdba205e36e28dcfb54128cc924b8ef30a5dad4c2e27e0338f0e2502c0bc365bf8acb0f645c6e2a039618ae2c8e8fc0a7b7490e93fd0acd8be400d80e4bfda904ab538f42bdfb85c1614085c33d190e0f02d8db7e087b0bc36946c5e97d19a7391fbb5aa5b903fa46187fa85109c3f9a08af30f659c9bcc5e19d9eb1cf194c3e200478a3d3a8fc09162f1a2e6028c1fd611dc1a598a09729c51ed1c970575537ffcb7454894e0fa8a2cc81b0fb1c4cb222f13398654383d50f9a44e9cca50770eba4289906ead8dee083aacc2e1a10c87671a7158e331cc2479ac194a8947b4df21b50f51c2491d87af61e050bc407d57a0a5b83599a7695581c97608e4a784d8f7215823c6c08d0b4bf63f33cc32f599a17b927ed9e3233f29643aca095a12a5f397497d5416e712d9b400699a7ddd36491f895a8de46922387e496bf2e7021733b116b90d85df36b7082c5364e60b5d74ae029f5294481db6039afefdf9ed083c2602f619cb351c9ba391cd0050bbb4b438812f7ee2d14801f530ae132c34e615a8ec3eda58bd60a61900db25c0e25107f1efaecd4d2f77e0e40e285d14c2cf81bd23da883181754780a185d2dbc6f9841820b2be4e960d6459b5514d3e1a1568f7f97f3ee01410499c9bc77aedf84c7121af332e0c70fd5af38b3254f29abf4d3afbbfca0175a22e5ac48308779988d12d84d8824e2871d3acccea4f9297685181d6a40db8942ee0a20270938db0c11deec4554f1b2c34a10db60b504ee9847244e2ce41b64c343af6902e505302a8d36f23a81a2d551ba89d02a84f74474b04153bde23486ddab838d6065c5417704c00eee39b8c9622f35a6d30a10bca3601caa7370965c3dcb94f17940901ca4f1a0165b07964338ee14901ca4f7542392681b242f3487cd9a7cc7ee46f72df36b78f08007fa613e02ee5d053e6559acf3a0d01bccf7582d7efe3e80db2c2b42e20d302905fdce4e0d3fc2bef0e01ca2f75429966b54daaa2b00d8579c7748487159b0fc09800e0573a01c4986e57302fceacb501d6a10bb05601b0af7502860b7ad1d29a17b21601b26f744296f11938eadfd3d03a78dcd105669700e6b73ac1ec16225ecd711b14efb48dbd7101be199df0dd95d862fd7b02eab7edb55aa6b6cddc1e766bcecd0a28cbac681e59653cce2a86b6accf6ebd756095e6e894a1bd5556046e8a94d60eaff2f45e226e54843944f7a6e97fb23487001872ff38b836ad5ec769994cd2ab9c9c253db492a7372c6fb3fcf3ccfa4b01faa09966e85c7513346f11c75de80afd134485ea44ff03768b256a05430000 serializedProgramBytesString: - serializedSignature: 1a6c5798d187cc2f9d30b694f0c532655a9e7c00ad8ba5aa557c594c74a8783dab1d17ace6be12eec1179fe59674421e1ba83e29e873db8a7f8a7571998fc608 + serializedSignature: 7ead811e68785a38821c05357d08e0d30e39d688a5e88a8455af5dc5eb7fef04b2f2695bf71c646f386f9d04113465d97f9934bb7b3705d1f37681748ac2ea01 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset index 0118da1..32e241d 100644 --- a/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset +++ b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b53d35010ded3362df50678c3bbbc89a33601479f1c67145199f1365078711c2810983a2d302d32f8e8abffc8ffe60c7ebb3981f4e4a4a1952822cd34694e72f6f2edb77b3669ce257cd47dece6698626a94273b4421bb48e5f933836b10567e1f8076ae1b8867d0dd7eed368ca4cfedc5157b09fc6599bb630f30b2de35897ebb3e4e3f734e6fa38e3d1557c7ddca50a9834472fe83dbda311752945c4bc4c6aeb31c57ea901ec9fd3575cf5c52856e2caa511ec6671a52dd79a303abcef237d12b79ab8b68c392d6a40e692481cd8e1b9e2931c0afba75436c6f291b1bc3ee6f02de2eb44ce95fe16f53794171d2ff19cdddddd9f8e12545ec3ce1a6d922b02eef610be70667ae0c4d69c36e68ea8dd02449b1060416f4e62b3450f69c28ade55752662f7a4ec6bb8a32e425999a1e2474c051bd7c0e64742dfc6f82b610e07bf8e2b157a8323cf5aa47104f3a321651e6a1ba08f4f55ec3745de22cc8edf99e612d3c49c330399018b9b180901ddc479432c9c95fdb658ea8bf5d318db929c5a47563dc77147b4c57d6fe1b74d67554366b7d14ee6a4f12065c230bd80376cbd2bfc3d89c8df8808435f1cd0695870a5ba7c8f45e204c3a0c838b2480432c68332da313641aed4de6f31047bf731ee61c8ef8316e357b286fa58e096e8b3cea250ef8664105b1466e30c8eab62058f2f6b6cbaeb0a91b2e35ed8c3679f3faeac41533d2c29d97bc116e65c5e04d58d94c075a30d7b36a62ad255aceb95674ac25717332b56575852d2fd21906fa5b7f82254711ca793730fc92be9357ceca801eb143c26819938ca96385c845435d3c4313bb20d5960d8bff5ae85c04e6f36f89e416fb207a72cc1b962690ad34c4882306781d0638b4e59ad2a1b56b1410992f336c97c7ada92ce1e939e5baf53d277c6f49492f51492f49c4dd273ae2f3d8e8d6cd239cffe41b205f7d5e5bedea936283d722724ea5162a5b165768516b0ad113fcb2c486fcc6e6ee39c9d6a20b7f97a547d2739edc41e1262c7fbf5347793685db4918283356c43e0a9a1b7d3e2c0e30d846f4170aa41fb573cebf9b0a9b6d75076f73a0513938643c9342c257976dee6d9933e621b3ca73e8b44b637dfe671ad8e3a6ef7aa844d29ae015392228ce50799c1676d72b9f028af87f5877537e1055b5485454b6259faaa72a1cb93e3eaa13d44a47911b4b93c7f55b2296c4c6dde1dbc918a3f3095b447a12c202d85f8b8797a91a31abe9cc8b9bca6a87b7db229dd0a7edb53ccdb39d47b350b04bcd399a9b8885589df62ad493852e59bfda029ff8108087bcf437859c2a47a06605664756963e30fa7b821fce5a1b1acbfe5309e0f83528176a4476d89bc15333fa481386a965f8ef27b2cc691fdf26a2f8b1e97d791ffbcf2798c0f77d145272c141e178aab5966f39048e3e621689e6c0bb0a1f3779e22cb1db95e3c8843fde47b41f23d80ef5a96f0b102ee34eafadd7a4d3f3d2e806dff1e6cf9086cd7b384edb486cd6cd9bcec402b67055a2e02da8dbfc3b50c61cb8c6b1481ed6696b095356cdb7bcf1fff26cfd4f1e9613cee616e75b60c075988823662587bccec7f2bf7d6a0a126c7fd96c2e5f729ea31f5d663779799bededf8e3a6544aa71a47a189ba7bfd3cf9ce91215972971acfd1fa5e0bf665dd64ace88ac7173887c209c89dc92bfd05b728ff30b1f38f2c93e200000 serializedProgramBytesString: - serializedSignature: f55ad88497f697e9b71de33f04921e2172a89e4e1ed53e7cf09c25aa5f3a6daa6c22e5a1859a57e0099d27eefad8af8df9423738c6b34845fbcd5fe589929b0e + serializedSignature: 9a0d5bef38dc25fe998e535a7c5d0d3f6fb0122489cad37bd60cc3796c098b73b2826e3992131bec78105ab3b4564eb40ddfab6fc1820bac6ab5cd9ea64b2107 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset index cf5c8b9..4885867 100644 --- a/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset +++ b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9ceb53134910c06703210984f026e00b7c82a79228eadd799e1e0f514e544e1e5f2c0ba32c5eae8250095a5c5dddf7abfb8fee7fbb2aafbb77d6743633d9ddb0138c6728b2bbf3e8e9fecd74cfcece422c27e0635d85af4df15c2c8819b121b6c59e7807670b70dc851fe7ca4d5f156538be85ef02e45d15933e35f133658dc1f7325c55c401d47c2fdec0b148f96bc286f365a86bc315a6eec0af0da5ac4ea8b42116c533f15464ad111f119b54a922d32cb4cb4ac2f7bcf81d726d520a1bc9515616bed620a74279bba0b45bee85784966ed42de1ba853162590f99a24264b314127c2390c8a4f9722c5cef1989547fced82df71760d96c516e5f9a83cf630193df29892754f786477b3b2299686c798ac73925de3b143a69f62d7a087f597bc1e63ba7a6d49b0b42e96266da1b4d30dec51e9edea9554a4c5a5cc33ac0d9e3ee19cc75c5b5cdd338a36fb585a86a5e131edd1ddad33c0eaf4b3343cf6ca3a934c064f9ff0c81a66d7987f56da81e9f18f1f3ffe2b6ac7cba82c77cecd8f5be4098f606c16c4bec811a4cb22b8cbba35fd9d95c64e4c2a3b45cd1e805bec830085c76c903f1e88597143e931e3569ae9bd40df05285124a1d898a7897fea9a40e54af0633377af40fa438a16e8f045c899112b70c45aafc47570e0171e299bd06c0942862dd6e17b9fe4bd02b5eb4bfa9984a1c15be739c87422d72ea4b840f7e1ba441aaed1f707d2d426ed9721ed80e2e83b88a4f3703ca4d6ea6d2fc3b9aacd75894cada33a80e9d29d30e976d3225883dae7303e7ced9163e9110ad5e7a51b76e628fafd5dd7135f193a410683e9b29471dd09bb356937440e2fade77504c3db586fa17a7cfbf17ed9800c7677962ca8f6307ee2b566cd8a1c4dc5a77ccc6a0415e54d5ba375121aab1f8f77e651492f7a4b859e6e13d65b881ef3f6484a01ca86c78f50af78f1d7b1cf63b104e11bab33ce5f051dc2980a2186676bad85089f8186bfc9081f1e20aa7bcd0350cd2f45fcea6f2cfcdad7d1eb50d0cb6327752bfb34e5d1094b6a2477aafa85ee10b78cf6cb06a439b74b0f28b74873ac13d1315eda50d661d4a864e3feea09dc5f69ea2f9c98a2d14bd78f7115edee567b8153ae48e5c27b416f60aa198d17f8b5afa3d7a5a2472bcac2673056dde575f3e3b52f30d97e227b31f0780da29b8e7a42157bf07240379d7bc34f5c1f7e92aa2ea585e72ba35deaae16d76059f018f20a50dea65b4f4c5f058905681be5cd510bd515666d8dc61d3a18b84387a8432f08119966baee4ca988a34f5baf3f2be2ee900d4f7d3830f511a27ea909ea8db4d391efd639d268048ed4a3128edd9a55d1f00a1ed10b4eab04e3201a0b2238ad17dcab128c8cc68308cee80567548291cf892082fbf582fb741d7832820eecd7e1c065d09447b885197c544e8a3f445efc198ad380aa450cc8a783704ae9050fea389d8980d3904ef84404c28775c22715c2ad90c24774c2cf46a0f9a8ceffcf1dd1ffb33aadcf2bb44e86d47a4ce7aa178ee8aae33a6fbaa8f2a639513bf3559f12cc882df8d98398bf2556688eabc04dd5afb4fcc51c752d7d7a6d4eed723a8cef9ed0d9774965df4b219433956e7673acc6079f0735b9154a0f23690ececa94d67ccd305c4eeab84ca9b82c85e452d589136a340ec2d91cc6d2533a4ba75596ded158ba417777255a1414e53d1c6abd0c674ef5a2d8aeb3903fc6886e4c9fd659745965d15da15bfce062c65df834d363fe52c358754667d5372aab6e37e5a96fa555dbb435b12f4b3da58d6cbbce5abefc0e63c984ce922b3a4bfc493afa57a4fe0732b591c6debc4d186d3846c35832a9b3e4aaca927b9ed9816be3e8bf442b8f5da8e2a77b502f6ab68fceea2cbba6b2ec7ea0796f0ee86ecb08b117c9bc57cd0963db399d6d332adb568e18dbb157b057a38bee7e335a027e2c0bef7e1e501b6528b94aa31baf2a22470b9bbca8ae56fdf6c751ef5d1865188fd7a1e5d71497fd77cbf1e519dd6ef98e886ae3d4cf0a8734d6dfa1dd7577334e659dbf4dfa4de284b4c89505a469a5f7a5599ae7bd1acbd182f34a93a3c95f0bdcb0ecea508fa1f08f841d01ee8c66e1e2734b3a864d4e851de2db8adff6cb3512e0ee2b46f09a080e2d277c96e5e2013f89782c8ff46f9844d44588b07a018ab4079c9518c249c43dc2972273c4e6f641ea43461f05e943506f8fe0da60842784d0d395cf4df3591e02a6356e345d3776aa33937a46c9e3cc74f37f3e69e47150dc4208e36e8c252fbf6dd2cbd3d4534e1f3afdf58e8cde02aff3b47594d7295235bedf1fc49066fcbf8b05c76f4d62eb96d89c86df4321bc05cf9b43963085ac8321fbee7846da4d73d8d2a6b0a519b6ef4d62eb91d8dc45b9fb18cde0581b3105ad8741bb733c63ed7a1b8eb54e86ed0793d8b0e9da71d67e636c94c1ba6b7a0ac02736879e27dcc690c54d21cb32643f9a4496946ee908d8371bc58ce11a66b8ee1d4f149b35876dc814b624c376df34361ec5966863a204aa18744e63b7b4630cdb4fc733dadaf15623c5b0cd99c49662d8f08fe80edb34aa09066cde24b084046613b0f68435c4602d9884d52b61bda1a709b59b28edb8dab418b84593e0dc05fa5ecd1e9941642953c8620cd983564432be416570b964cc39130cd852ab81b56334eb66c01eb61a98c15b5963c04618b047ad0666f0b9ac31607d0cd8b24960ee0a13b71dde8233b667c81f60b87e36894b7fcf7fab0d974a1986ed712bdcf2c3a7b7458cce941953c07a19b095560333e898c680c519b027ad0056dd426dcf5b8b4106eca94960eefdfe8ee06fd2b5e318eb175fcc3b0c799cc89e899a5706748fcda71b3eb7735e2018900c70927a226cf28d6deaea027b9920477f3e527d1136d88b498d65faeff4afa299967a749722ebbb28de5e50597a943719d20d7a25477f6df325dbff8b70fe29117d70986669cb76037ade116e830794e9d16099cac4ff03d9572e3e5b4c0000 serializedProgramBytesString: - serializedSignature: b96aadc513c15a891fa2f703541e5b7b7b10ace6ff9458d65624910ab5b0081532be66ce586327adad495aba51a2bd3c4b438b44d7edfb7869a87786dea8120c + serializedSignature: 5303abe11696dce8771624c559eba0e26898554883d8c7e0cd4483c963ec78308e416c1aabed0eebaab165c143d22c39c78d15440947ec8b6ba9f3f9133ba703 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset b/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset index 7709590..20e27c8 100644 --- a/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset +++ b/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a3d501b47147e2738fdf02720c640ecc4729cc4474c381932ee9026601b93f14fc2df4cc664b0309287b12408120c4e951469dcd0a4813629525127451aa7c533e9dc6426e33a699d3aefbdbb8345babdd3c9ac132996462bddfebcefbdefedeedb1f854cc097368cc902ccc0248cc03cacc01a14f1d7247e17f06d3d39f99fc2067e3fc0348365c390f06949af8bda00a6d3f8548232b6dc84fbf8bdcae5b390c5dfd3d8368b4f949bc34f166b69add8681eaec21db80dfd5a9f8f88056e54b2f334b24b8b623a018fb034cb4a1188c945fd98cc624989cb0aa8b453ef2e7cc16615b0ec3eb6d9803cca5c668951a60b3fbac6daddc0fa1958073344f9430168745afa1348a2c321009b49822da3aaeb28c0c58a79e6a80c6330ea6ac5a0d621e83dc969066bacb2d0de6a889fab2048b93cbeb3820b4a983fc51e2427ac62c908dcc46f6a750f2e23a9772ba42c206c1edd9885394cd759de3d54bbbaa69f49e4aeca363328d3ea4d05cc71085dc7e73c6b38cbe9166b9a65eda731afcc7dbb88bd7b02bfb719addaf60dfced86396753e6aea37ba792e55b5dd771d355b486b4375ba89bbdf6c8bfe111a23edc6b0fc35693c688f6b8ca13af39b426199d276b4bc665a64c3b96370a263d6a33550c06b7b1da42f7fe6df17d053ef2b4c59d1972f719b6e0c8c3dfecff31301dfded4ffdb869636086c9b4b33ea679114bf20ced7495046f1374bd35498a56d2afb9d11fa1ccd95748bf556f95eb0577409823d371076883f838873fb6f193b72b176d75f2f6ac48cdad354bce36a2ca5f49121e61caab03aa9fda32d2436ea4475f35e9feb38c17e9d143bb8e48076bf5e3c2604cc2a09f0e32065bdc1824102dab94c179ccb39643d7b8749563e888d09fc80aaf5ac4dd2d5e6e6e32be37cb6d684d4b05cb669bb3a03c796d12005fa785e4e9c1cdb4eeeed27676a91a35646e6f75717b92dcdee1c25392784233202d244f0f0e52ba1eab30886c9140ea32c84e2fc8432211726c6c2c1d08322c83ec9242e672b9b4836b1b1d083222838c4b21fffaeca7f1c4deee602ab13ff57c9ced0d04199541764b21b1378e5bb8438b3b7540c664903d52c8a1c5782ab1b833914ab43dbb900a0ed92683ec9542321a02a512e7be7d580764bb0cf20d29e4fe54860cfc3e9578fed577754076c8204f49217f7df1632ab1f3e4452af1b7f17b1d909d32c83e29e497e38f533c01247e58ffa50ec82e19e4690f5f3e21c88ec3292820645c06d92f85dcdbfd3c2d248121bb6590035ee3322d2481217b649083b542eeedeecaa6f508be358d7e5eb317808f70d1b7c6f1a78c21d7e4f19284dacf67285417707142d16d0ef55ae698e57f5af326c84f6b7270521b773f2bac0517b5cff1e98eb31974b3cedf26f92145c4b6c891854cf334d16c969e21afda4e85885ee1d7eb27666d7d3ba66abfc479246ca37a944bf2562afdc473eb7f4df3b3c7797606b5fb604c52d15bfff3f196a4f1f636086753219363d8a53a273b7ff5ce115a8b3be5c1f7cf9680db7c9b8002a8e72e33870ff992618d37762bc23ea302f1658e59622ccaa9d15e8b39fee7ebe4a38f51e315def194f01de1ce1c4a925f122ac93b25216f8e3765d4ed1b99c6a840e3799534d2d4b8846f02ce6195a543d9aba88e32e27455c48140dc3baa895be1a9d399a31b7be0b60ac45d50495c374bdbb0872ec591eb7c74956f68fa3a05fade55495f1fcf7b9bd8a8cc116aa2c902484c20f23dd503b8800fd4c03a582f373471dd0271efab248e76b75b4cd42667dcc002ea758d1e733b04022faa24f0bc1d73ad1d7b91a32e2951464636f0f913fb0a7ce9188c68d21224d5111c5345704820d850493079b284d62f37c5c0ee11681b52495b1c646bc1a25d4519791155e46902791fa88ecb252e5ae1454db3c5e53681c84baa7ba1185e9a6175d82e9037ac923c02cad8073e5b0d1e8f7581b40f5592462ba707e09c8a65f8e0adf1c3465ca06f44257d5ddce7cadcdc6280f6258d4c5d58a0ce543d5c8b5c5ce07ed7c8a4b508a4255592d60b950708cdb203e902eb26a009ee5c92b4bda67f4386e37637303c7abbe1739c66780436c37702326a386937021d281b018f618c80cb43a386559051e346dca8e9c4cda879581935c54bc3e77cc5f0dca459d7613d76bf2fa246b780f6c719d426c3df47576326ffa7e00a04bb02f296e97f31344a5d5b739fe1f227365e4fe22ececdd297b997ebf0f08ac97fb66866fbc7a0e2d6b69fa7a679f4bc253c0b77b0b235c8e9a5ff03d785863578340000 serializedProgramBytesString: - serializedSignature: 50d97536bffaad4dda25612835beb04ad43b4d645cede2b06ddbec25c386b0d77e88e837635d3514be785759884f4b8df5f861f6c3c7ef3845a352192f67c40e + serializedSignature: 723795e609ff1d8813c201dbe44c48788fd084c0d6fd3483a8aa483fcadf3bf71221720b165a50da519b11aa9fb886f828897738aa547fbceebb55232e2f5401 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset b/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset index b3a6535..6f37048 100644 --- a/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset +++ b/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c163796c0f5118ce91d0c04080408a6d9a6431ac5a6183010174802048c0b186c635ce82190de7bef3d9bde7bbddeeff6eef6faeed5bd9eeb6def6eef76f5341a7fefd3e87ddf8cc7eff38cb3f887e5d1cc3c497f3d3d3d69349a3e8542fe4bcc95bfb68972512c0a4495a8158744b3fcab58864df2c73972e3b78a5619ee93bfabe5b9b9624a863be1dfccc438f9bb541eb58976796787a89161833a5f21eae4dfa5f2de3a7904b1f5f27f9dbc2ad157de54254ac416b159e425c66410b14dddd4a6e31250ae447ff97bb5382ecfd6a94c412285ea549efc5521cfb4a9734d32d3ee753bc42e55ac2679ae46ded32a1aa5ccbd4a62ffe7470af5877082213a1caac34be4ff7ef2fff3e8184ab14cfecf91fff71bd70fd3d7bfa08f0713f1c37578a9fc3f40ff7d8e0e47e87085bee745740ce14a74cf4a1daed2d7be84e4baf109c5cc39ff2d742ccbd1e7f789b44b8cb44b74b806a5bdc648ab58dff3b23e1ea9c3be3a5ca7cfbfa28f7374381ac95ca7c3313a4e5e33e4611d374a876bd1f563515c42e9536a1aa53a1c979437d42d4b9e0ed72379eb75b801c58dd7e14614b701c541b849a7fb2a3a06be6f19722718ac5e33ce9fabe35f37e227e970a2719fcb7e323a86f36f68bea7747c1f9df7fefa6faceb6edd9fa7c332a3eecb74b819957fb30eb758386d45715b501c849769d96fa263c9e99cfbd3e4d3cc5fb991bf721d56a0742b7478be0e2b8d7b2a755885ee19a8c3293a9c8aae817bddba0cc272bb91ee761d5e8ed2bd5c875758585e89e2ae4071106e33586e7358f6fd8e53f739ed449e761879daa1c39d28ad9d3a9ca6c35dc63dbb747815bae72a1dee16a9b668b748b5796ebedf4ecd778edbcefde8c01e233f7b74588df2536d9461af71cf5e1dd6085a07a6a36bbaaa03b546bab53aac43e9d6e9b05e7875601f8aab477110ee17a93ab0df61d9effb69f21924ef3344aabd992152db558351b6061d1e4079ee8fe2e0da770c5917e8f0a021eba00e1b91ac01280ecbeaa7c366916aff9b75d8aee3df15a9bad8816476a06b216c13a97d669bc3b6ff5b866cf7be23fafaf7d031844775fcfbe818c2c328edc3fa9a0f0c9993d131b2ebb93fd4f13333943f5787b88f75f39dae8f6d42d7e7a338085b8c345a74383b296ff84a1d374b878790bc4396f2bbbade6a3071e3707dbc8a8e657d0c5c64c89da7c339225577ddf3053a9c4b9c37fb6037be5087838cfb5c5d3a86f2eeea76910e8f8b54dd3eaec313e89e132255575f3264cdd7e14943d6491d9e42b2dc7ebfc390d58ee221bc5a9fff1095c18d87f0b4486d03a71de643aed7c70b44aafe9d1199f5ef8cc8ac7fd7a0eb17a23808af35d2b85664d6bfb348de591d5e27bcfa773d8abb0ec541788348d5bf1b340bb7af34ebfc46a39e6ed4e14d288d9b0cee37eb7b3e22eafe1643e62d3abc15c9bcd590799bbee763a3fcf38c345f33ce1718f79be7cd76e2c653edc4cdcf64748c6cda40d7d7b5f54f6e1b1fadc325c9ba1e79b18e5bacc3db118bdb75788748d5993b4452072174c7679f18f78d42b2fcf6a5e374b854877769d99fa26308ef44b297e9f06e1477a70eef11a96dd8b537f7a26bef45d742789f486db7702c7575785f43b67bdffd2275ece6fae3cb75f88048d5bb07446abb79509fff0c1dcbb486dd6d5cff90beee7374ec961bcbf9c290f35d235f0fa3b2bbb6232f435db9659d8c8e91fe0d75dbdc789ff26c71b38dba7fd4a8fb4775f808927da10e1f43718fe8f071a2ee9f40d73e81ae85f049a3ee9f7418c2703c45b67bdf5346dd3f65d4fdd346dd3f6d707ac6a8fb679cf446dc6e5cffac51f7cfa27263395f1872dc390a375fcfa1b23fa7c35919eaca2deb64748cea7eb8ebb38df729cf16b74424ed10c8fe32e0fd6eda175169e724d40cda7a395aa8965e57a1ba1172ea77aacfbd33f3241f88ee07bfe0df4c956cbb745a5aa400cb4c5b959ac76b973df502eb4cdbf8c46094ef62f5bb5a5ed1a0847ee54de2634f1290b946f95387a609db64fc3a35cb0813850df24c81d82443b86b8fec3277c89f5429db64b28dd2f9a91395f2778b92b74766db7b65a622c194a2794fb994e9cc7836c91817688b3c6e5439ac50bf8fa89cd6a9dc97cab87635ffda2c8774ab65784ca5e62d7babfcdb9666a54666cfa37de2938a77a657dd6a2a91a581dc17aa31e14f6aa4276a04d0f7fb4a37c3be85aaf7bed553133f61e8181998f02cd532e62b648994b805a250cd39977b08062fa3b78476fd76782f910e6cbab2d8c940759fab4a90ace17b3f1afabdf62f1a37e6a4166da1285443b089198a960e2cc8cb4f8cf548485f849c9cbe459051137fc2865f0d072bb288dfb9ae415d17bc02faa99e29b50212e0476d96176c95ff1b54b6dbd40dcd3a4b8d3ad39e1a2a0271b90ab2b70bcd94510a731f1be6fed9c69cd9aea4c3dcbfb35c49ccf0cf4e70004130531e2882e7d8082aff6b272b41af03e6feb55adebb5f9238a27ad50e79bfcd614bcf1426b2e7194ced3c07299e53ac6e64b01c5184fbda08ab99f603ac84ab649ce362ae51671b945f021e4ab592be456ac501edbf4079a8eb5da665ea817387ca497afa837dd31fa2e8c3540b676ea99ac9b1d44c11d4cc505b0106180580bc1382fb51828785149c4b091e1e52707f9b9242db48ec6255d24a5951ce128c02fdf76e19d6c92bcc6a2ee88c2f5352f7ebfbd2abe208dfaa3852a9e25421ba214f94c20db0551f501ee5a7fa46d2d537d02618521bed47f0205af0204af098908207539a3c36a4260fb10906f5ceb3f4b33f92ff3cc207d0c287da9a892acad92cf796f6290e9bb574d33da42c24e4c81de396cbb05ee502e26bb4639c3eadf4cd6d5c279f24e34255236bac3d6c4f9502269b062a25b21b8309ca18442bcf94511966d349a5a895ac3a692e373ba4bc7f285f7317bc60789c32c7f482ed95335155ce384fe13267814238dc865071cdfe60b96b8308582195e77b103159a41beb061d428cb0595cf054601985670009d6f5b0fab34d2427ce3c46389736c223290b3fc562e11f9723f120167e14d52f4d0dd92f8da6049f1f52f0189bf22a8d6e60555eca03af546b69a152eb95f23475f3e8629a8d9755cda72b358707bd7c79a51ac5584a49675894f4eb804a9a67130ed75fe04797d27865e36cba34a2e774c9db8376af2ecdf4ad4bf91975297c5e295d1a6fab156505b339cb658ec0837550b37c939e2dec335c99d2a7e84da0baa739b6ee09ecff6ef95324ff9bdd14c4c3a33be75d81205dd6b9541ee6daf23014e5a154eb4f833add204ed85a749a9427da52561334c2ebaa17413703b33103958df0a433814e671255c2425b09a1dfabb1cd1a0728d9645b8ae0b4c10a24d31782f9788ff0c9b4f0f3a8e2ccb71567982a0e4c0cb6eaa67f99a13a410a36c5d6dc955f7282b5b9671aea38de21c8ab57cfaf1d799b05bcad725435c483d2c81dd1042a5543d9a7ce861d56c23abb4916ef16fed98dc84265442e159907709ca5a24cd2544abb16d9b46b84aaf5fd52e2518f5e552ae3d018d0289c4fa5bfd8963e1805d314762ddd6954ba4b2823e138674755fd404d819b1624c5e9548a4b29c3eb925e1532e519b694c14783c56e617cb40ba8222db7156994a5f24ad4518d7ae2d6d2251335d39607f06e2f145eef163cd920de6d3e25fc228bf0ad0185cfa2aae5e290d532db26189aee257e04e7d382e750f57da9adbea1289ba5af34452af066a9ccdba5f12a0f54b7736de9410f076fe099fd2abccd11a45f9d4715662565f95c47085b82ae3b620554faab6ce90f47e9bbce665d88d40ba9d4575376b759a43e6a2f533d4f5057a9884ab7d88fddad14ce338e2029cea7522cb1a538d84811973848aa0b28cbb1c66239ce0c0a66391652c2d75a847f3ba0f04594f07516e19f0d09267cb14d38d4f27a3fa629cdd4d3124a706948c14b2d820bd50c1abc3299ad11af9f7558768755bd406b945ff51d5667155ea3cd572f84fb4f9f722d97d9aa040ee19d5c7339d58a413f683cfe75bf564fd5e4d055b39c6ad965940d037b0950ea65e46ee1ae726d907d4790b67d2155b0cd968295defc66cbd373464e0b52b08b2865de1252992fa6046f0d29f8129b60f061a191781fa6989227d2922fb549061f009e87589f3304f00156d8848f14ce6bcb1979cca605afb4590d353d7e90d56af89f11743763e8be19cc4a1b33ab95a95256a6500499c1ec4a7e29cbb48ad2a96ddda053aba9a6b03d6c5328b64986cef6723fda9a66c0504235832b4236833536c1d00caef423b88a16bc9632643b421ab27536c1e07ceff423783a2d783d5579bb42565e2995e3ab42e67883cd86a98749f53d62c3f85609eef66db9f628cb353b8de5e2581db8d156c55013d57eaa780f5dc59b285bb537acad2aa34c4a4d4893b2996a47b521dbd1160a725d48c85b29c1f521055f46d5debeb0b5574ed5defe90b55741d55e43c8daaba4727c20648eab6c82617070d08fe034a3886d54ed3586adbded148ba6902c2ea76aaf3964ed5d41359143219bc89594e096908277508c0f8764bc9362dc1a92f12e2ac76d21737c954570a15a17026da7275e30a2369a4bef05b4db3858bd00d8b4233f31de533a3f79a0faf8ddb6ea813109ec5e13764cb287aafba321ebbe9ad2d66321b5752f95e3e321735c63130cda7ac28fe00e5a702d95e39321735c47313e1592713d651caf0e691cf751824f8714bcdf2618fa4cd89226549fd940d5de9990b577c02618dc82b37e04a7f11f0e5239be36648e1ba91c5f1732c74d36c13068bfde8fe03483f6669b601802dfe047709a21f021aae9dd18b2e9b55039be29648e0f534defe6904daf95127c4b48c16d549bbe356c9b6eb749862e1536520adba57650c26fef06e14728f5b823a47a1ca59ae09d219be0310ac75ddd80e3b84d3898babbfde43a8da93b61130ccec03d7e04a771064e5239be37648e4f590417aab5d2d97cc526f97646d75cedfb6c14acae36ec33657bc326730e2847fb6a4a531fe8064d3d4d19b307c31ab36ba896fb50c8967b86b2350f87b435676d82a1f37cc48fe0349de7b5548e1f0d99e3eb6c82a18f7bcc8fe03db4e0eb29c18f87147c03a56f4f84d5b71b290bf664480b761365739f0a69736fb6090677f4693f82d3f8adb750289e0989e2569b60b075cffa117c3f2df8369b60b071b04d5b581b773b65899e0f6989eea0daf50b21dbf59d36c1f018f2453f82d33c86bc8b12fc5248c177db04c321ec25682e3171ff055962720fa5212f778386dc4b097fa51b84df67130e260fb6830d65f2eeb749860eeb353fb599a6c37a803220af8734200f522cde08cbe2214a01dfec26057cd89600acb27dcb0f93348b941fa1dae4db21dbe4a394e077420a7e8c62fd6e37b17e9c6a8fef75437b7c8212fe7e37087f9252f00fc22af8535463ff3064637f9a6aec1f856ceccf502c3e0ecbe2594a013fe926057c8e6aec9f866ceccfdb04832b077be07a968096a843784daa4294888d72885b2d078d75c62b56cef39b02b558b4549edf22cf38fb68428c7d3d876dcf0db81a0f5a53378508e280be4095f2735b296191a7ff5c16e87c0281557a075178c52c7deecdb3dbd432f960cb685fa44af585ad545776d69dfb821b7ebdcdf6ea5c69e795c997e6ca55a9eb74195b75e9d7a9d2a77e7f0b926e55efbaee55a5364b8c9ff599e730df20445ea2887c69233243a44e8aac522f7d56abcda02047ceab81bbc52655f67df2effd9e9c26a75182e4f35b543ebfb2e5739591cf649a4e3e0f89169dcb36f953a9f6b7f36a58f22e3abebbdadbcb54f97eca56be0546f970ed9b75b24ed789df327455935ea14af0d3b6125cd4058be16a57bb67df0ada4a7af7b80852a657a932fd8cad4c556499bc657134b0549d853714abd51422dc479725d5d2fbb9a6bbb4f3358ac3cfda38d431dacd8ad07693d2f5eee85f5ea738fd1ca52f9c9c9ae5b5c532292811c84dde13a467e90a8737280e3f6fe3b0c297b55e25f350ab778370f7a30867adbbd613bd4995ed176c65ab086c13d6c4c01ebc4531f8451b83fbb2ace7d4f605707db07cf8d908a1a76ccddb541dfc52d73d229beef59447f40e55be5fa63ca2e4d6a5e6c6a54e19db3afd072796db0abe4b95e057a812f8f56152fda11ae9bfc203d65aa5cf1d560bdf355bf71e55825fb5956075e01238be697167fed37ba91c1edefb54097fcd56427a9ceb7d7b2cb58ef611a375ff3e7090527d4095ead76da5ba30401fe5ec9ee13cb2f7df37856f4b1f5225fa8d60f554262f825169bd2e4f998aef295fe223aa54dfa62c0465afc28efab0ac2025f8982ac16fda4a5044f64261f3df35fe9f50b9ff2d5beeb706b66fee68a5ba736bac20768c7b36ec53aaf4bf6d2bfdc6c0b6cfb5eee6d9364feedd77fd693a5e29498d0952e6cfa8327fc756e6b5829e67f1338ea7fd3fbf9e61d7fda7cfa992fe8e1fdbe27cd5c4f1b4ddb256cab8e40761d297cfd63ae1ae2025f8822ac1efda4a60f77021cde01eae533e2abebb6ae84baa7cbf672bdf06e18ea24a95956857e9397b23c2ddeed303dbb9e04f11c2fa25b9f227918067566b84b3cfe1f1948d6d0ad5b69e459d65cabcc738306f92e902ebcaceb99eccdbd0c12704a9cfd979df2aeeea97cdbab6d15ea9b574fe370cf47ec52d5797c8952549ab2d407b5b49ff006a3547d76a9f42b5c5e89c2e6a53e65cfc21a4768e5d87827fcfc911b059b72525c0dd67ab583f8a806183b9dbe15675a64e0ac998834cbbc5ce5302dc5eb71bbef1e86c22061374adc279a8f2837e42e4e6f429829af9234e7cf04c778bbc186f59e8eaecd6ceecc401d9c508d9773991f5531ae77413d0bdc7010efc73e17c8f13ce70ad4fc94d3edd59a47869d3d77d92c0fe38db0dd0dd33345ec896f50564b93986707314d05ddf3fcdc499eee58729bfea981a0fb52a79b566afafb6be8e5aceff04f7daf91e3b94efabf1e5fbd438fb75deae21bf0b3d70d2bdb5bba545e0defee937dcf32c02cff3cf00c2f3aea3a6acd19f735aa3d9ba2e1be545b0e39e6d0fe572017b1c9b0f83e80f1e826618f90cf3b1d50129966c901f085db16687508ff9179cc8c768e4355a67cdf90d3c769ecf0732870be48508e4f7a302925123d9402e4320ffb2a78c80d3f81d6f23d8ac0823f2215cc8af41c8ff8a13f95c03f92184ce36b5ed7f129c11fb742eec7720ec7fcd897dacc6eeccab352bf4f4336d46eb9bcb85f20042f9379c28e7f8f01cbe2966a30941ff5b4ee8c334f425861627b798678397cf056f3682f777d980b72cfbf0d8346f0982f7f79cf0d27f60207eeefe2004eeeb9eec72b266fd6673a15c8150fe0327ca894697d38ed615968a925e368e7a0c61fdc76c6828358e4a758a183594cd291a8150fe1327cac996c6debb5df77508ed3f67b3f1c3f29de4f3fe743695b1f1b3d9d4a711d67fe1c43a2143f7645b73c6aaa9f773213d8590fe2b27d2bc0c484ded5c1243fdbc05c1fcb728c15c1c4398372298ff1e25988b6208f32482f91f5182b93086308f2398ff1925980b6208f32082f95f5182194707a901c1fc419460c671045f8b60fe37274cf72399f3d5e281de32097731c2f73fd9d0c57da436e2ecefe674860670c15c8860fe6f9460323a436c301720983f8c124cc6310f1bcc4508e6ff45092663ffcd06732c82f9ff5182c9d87fb3c11c8960fe284a3019c73c6c30f3114c9188104cc6310f1bcc990866221b30a98718e6fba08ccd7c2217cc6108661f4e98ee5c7be6c718591c4aeee1c27a3dc27a0e27d6600fda189d77b6076d5311cabe9c28ddb51c0bb33f8c645b929087e0e570c23bb78bcd7b790c1b772b82da2f8a5097c510ea610435378a5097c610ea3e04b57f14a1328ed9d9a0d623a803a20895b19767837a25823a308a5019a7ead8a05e81a00e8a2254c6b13c1bd4ad08eae02842651cd3b341dd82a00e8922d4380e423722a843a3089571c2840dea0604751827d419227571225c04c2dc6d7e7afbcbb3eb11e8e19ca0170aef140ac726b58c95b090ab12a6a04a18d19373ada9f358ac0b1cd966b296239823a30493d1b765835984608e8a12cc38ceb1ce473047470926a32fcb06b300c11c1325988ca32d36988508e6d828c18ce33b4b7310ccbc28c18ce35bf1f310cc719c308768989070bd705e527464c3fb4a6ce0d85e421408dcf86c3c1bf5b7cc96717e9f6d91ed2e847202274adb4b88fe879f8cbd38dbf0f37284f6dc6ca3f5ff7e27a3b7399d0bedb508edc49e5c1c11ff557a4310ca49d1d05267b204ef13cf8a966d0f918711dac99c68c765e8a6cc6566acee12db42b32711cef3b897f17877150174d56a2a2e8e3b8b9c83e04de176dc0f1b7b6e3a1f9ca951625a3a632b85b32b281bcc915c30072098537bd2ff4c1d05c571747e3342797e36d6e6f5a657bc462178d3b2016f692f82b718c19b1e9d41641cdf212e43286764430f97f7223dbc08c1bb8013de084bcfecdda33b7ebd717f047066741a32e3ba64b686bc17a1cc8fee6c10e3e885cd01af406867f5e49445aacf18c7c763e72294b3a33165619b586344cb36b1d68cd0cee1447b9e6fb4bd6743dea308ee5c4eb8d37cc3f54eb5e10dd518ed6c1517e43508f2bc384066d46436c82b11e4823840669c1a6183fc28825c1807c88c1d1e1be4bb10e4224ec8f05d1073f4b549380b728bd5116c1cec60669c6066ebdcfa2290f37bd2bf8dffd6d5e311ca05d1995e8ee37aa52a847221274ad843cc4914966a9709770ffad59248bbfc015d8d5fa31e8cf02de2c40733d9f85b1dbdc932f643101773421c9dc132ba25656dca1bb9302e45189744679a2f8edb549620944bb951524e8ffb1692f311477815666f0c1b770e42b92c3ad37a8c4b11d9faea6908e5f26c3c455a94fda7486c6b8dc621781772f7d4ee7374b369437c9cf7ba9981205ec409b16bdf3760ec6ad8be6f702b427a31f7f83a33d2f87e78e75904f292a8808ce3074c1f42202f8dee334ec6372ad9ec673542bb8213ed540b5ac844bb82d72c36c810e6297bdb62ed3e08f0cae8789b717cfbf73c84721527caf345ea2e0c35b2a937c8bf6a033d4c8ee357b88e20c4abb3d16525bfc245b953ac7dff642e90c710c8e2a88064d4483690972290259c202f3040eeb5f4f0bd7bf395fb11ea359ca88b0cd41d24c8b66fd032884710feb5dc932978e6be5c5e7a34e6937ab908de3a4e78b66daf28372b4bcb193ab8a0de84a0ae8f2254c6e50b6c504f20a8a55184ca683bd9a0d620a81ba20895d11f60837a1582ba311bb3fbf3b33fbbcfd6218d46f03645e7d9671cbfc45989509665d32f6dd01329d59a47b5125c6b20eded6ba06f47f8374777f695d1c1621b71ed4468b7641badff992c46a3c136937506a1dd1a9d7957c657ccd8e65d2f40282fe344197c530cc60100dba618cf209ce5d970abbc7b8835eb4be2a78b0904afa2e79fa9c677827a370259191590719ca05e854056450524a333c406b20381dc1615908c1d0c1bc87604727b544032ee59c706f23604f2f2a8806474c6d9405e8d405e1115908c0b6ed940de8b405e1915908cdbf2b381bc0781dc1115908c834336904f20903ba30292f15b886c201f472077f5e48471ea84451c771b694428afe244697eaec7bbbabe77af182946a07747e72107e3e887ed21473942b98713a5fb4d6e5767db45f27b45a5a2c46a55e3bb74fc6e84b53a3ad3c071fcf6c10484726f741f5630a2657b58518ad0d664b3f1c3c724b6c9938daae3ea6dbb323c80b0d66663a67d71f61730b0f5edb310bcba6ce864e6e66ebec61dc74f495e87b0d647a7438ae3a7f5ce4728f771a21c2abcbbcb57881a9511789816bfc63d10a1db9f8dbebc5dbd42432fe7ee3dcb658622b40dd11913313670b6fe7b07427920ba2b8f181f6db019803a84f620275af3b51aef8b07bd7d92e42c42dd980d2f7441f6bd50b691d11804af291a834eef9b47ac834eb6fd479e43689ba3b5ac8bb199b32deb7a10e13c948d072194631ff795499311c896a8808ce3caa4e108e4e1a8808ce3829ab908646b369da570ef20c7f19b0b4f21d46d9ca8f9df418ee32ee17722fced9cf8f302fa048c4ff4d93c821b10cc8e28c1645c67c206f33e04f3489460c6d157bd04c13c1a259871fcc8e96a04f3589460c6f1e5984d08e6f128c1645c53c206f33204f344946032ae616683b90dc13c1925988cd3cf6c30f72398a7a20493f131091bcc3604f3ea28c1645c61cf06f33482793a3a8fef181b39dbe3bbed08e535d141c938946443b907a13c13dd27a1717c3cb719a13d1b9d053971fc32fc2484f25a4e949384b9aaa477ebe84404f6ba683c05b52dbd65d459b607cc2d08edf5d169fe8c9d145bf39f8e50dec0897296489dbb6f14a9dfa771fafbdebfd46cad029e9b63085feb115eacdcf2465dd806ad810512459d70bed1d520cf14747ee8678f982f76c89f60b5b44bfed8e2136a65ca1a714c3d2a6955f26a95ec26791672d6268a00f78da03403b5d2e4abbbcc659765cae854abf7555ae535c1bed1981ff8f346f901be7396ef6367d5fcc4084b0e2a959a362aadaa939cdae5757996eb4ad4518daa851674b77b4fa685aaf9892156a6eea7eff27d7d140f542ea1ca0175d82ce53bd755cb5aad5661a52a2b94a710baeac412f9cbe9a10b3afbe602fdf8ac491fb9f19965828ea59776132852c26e7d1abbad75642a91d3a0e17ea8fb1a45156233953473f9e89636384dad1442efdeabcb7f33d4bbae76a5a67909f0c9aa64cdd7eaddfbb6c88b6b55a6e05fce8f017c5790e4be6b0100 serializedProgramBytesString: - serializedSignature: 9efadcacbec49fd35f3d1df6a35c6342138f26097064e18bff4f3dfeca503b4496c2a687a954e1e37ee66777d11be4eb1f25fb6cf03cd277b9233eef7b9fd406 + serializedSignature: 8b40a6dce6ee62a4421055055691bcc467148fa1b662ce1b4fb912e788ffc218fabd1d3d58370419cfc4f9a0f323d41a4660618a3de575969c8de25f31115e01 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset b/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset index c26f874..9dd0d01 100644 --- a/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset +++ b/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec9d057c14c7fbf0e72eb8152dc54a28163c1082b49402c1bd58692985900448090192a085165aeaeede52777777777777f9d55ddf9ddd99bb6727f35c6e6fee3966fbfedb0f1c6bcf3cf39d679ef199683fe6fc17e9edfc3587cd6005ac2f9bcd8ad90a56eefcabc0f95deefcef5dc9fbd35985f3bbc4f9bbd079d69b65d7f025ffaf7b6427e7ef09ce5525ab72be5ccd8a9cdf52f7f94c56e2fc7b82f36d8973c5ef2e76fe94386f456a391fcd66a3d9343695b58eb4aa41c41cf7a34a712fc2e315a9e7fc3d8aad779e96b84af140fab98f5a3b7fcd749e54bacf963b4acbf7e6b1f96eb4963bcf8a9c6f2a58992373912bb1dedd5b99fb0fe6fde488df1ee2b7bbf3a7bef87796f8773df16ff83ebfcf63b76f82777b8277a5cc5ece9fdace9fdfc4756fefbad9f5e2ba8f771d69a9c8680064f415bffdc46faef8edeffca9e3043f3009fd133d1b207ea59c3cf1aea3d78a63c4bda6de6f649408331f5c3b5c224bbdf7a37f89f7c5733644fc0e02f1192a7e07c7c359b951dcdb55fcee2ee44f10e10d02d7fc77a2b83f185cf3df49e2fe1070cde50d8b87b571a5b8b71b885b7de68f678112cf022f9ed187c57bc395f7278bf787826bfe3b45dc97f1da03dce7bf53c5f3ddc0b52e0d20db11e277a486adb41f1ddb51e2b783f82d88bfb3ea6a71af9d17cfacd1e2babdf86d02c2d8456134cccf28abca9399256d6734f88ebf2fd296b510df8d56588ff6e4d49aee7f8f8d11cfa789f787836bfebc1bd0b19b783656913d56c8dec9d3510d23666f43c0357f3e16c8e5cf453ab271e2bd31e2fe0870cd9fefa4c459b0884c07baee24eeed29de1d09de91f7615c46f9e352fb634597e9cc1f97027f5c2233145b9d217ec78bfba3c135973fda63557bb2f8bd5b84375ef95ee6c941e09abf375113d79971dbdbf81db807f46752ff31cafd5c70cd9f8f1569798a783ec91f169b120febc0afc5bdc9e01d45373655e13d0e5c3b3cea142b76ada6b1e43aaee6348ed9c3acf8bbeebf61bacb741905ae1d3dea1fa1c896dfcd16ef8f07d7fc770ed0a78db8b71708770eb8c77fe70a3913c0b5136edd854246cfeaf19461319127b1bc1ad91b7cb3b7f8dd87f9f3ea3e5e78f57210d9f314d9f3c4efbe40b62caf054b266d66a2f25ce689494a58d226e72b61cd57ec18daef7e481a2f00ef2e00eff2df854a1a2f1469bc50912dbf2b54d2b850fc2e52182e127286f8df8bf198a5f090cf551e22dc58de5bc07c79afde117e1b8cbd37cbff5e9d8b81cd70bd64792a790bbb64d2569d6fc6dceefd36907e87202f55935d535e9279231f5c7339d207ede57f3f517c6a62565ff8c758d9de291e3f36d77b67d1d3e27a6fef7aa9e42aeb27e3157d45bc1b4ef7bfc7441e62322f4e549e2b7691b05e29c32e52c22ef2c26e2a7516793052ccaad5c398b4bbd1883e0bc1b7bae7d29ee723cf1789dffd90e752f749ca7d19b712a07331f26e89787709f3fb9025e27731b0d7c5e277a9c26ca9607637a24769003d96297a2c13bffb031952b732a0dbfe4a9a2cf6338b3d5f08bed53d9769b214792ed3a414795e539a940760b1526121da06911520de2bc437fbfb65c5ee4b7e158aac0af1bb0ac85a257e972be9bbdc4bdf1dde46e25419204eab153d568bdf2aa047151227795fc669ad226badf85d0364ad11df9429b2e4fde5e27abd226bbdf85d27ee4f06d7fc7783b83f055c4b5f00194e05d7308f94232c0f08c07293a2f326f1bb11c45fb6af5496f2be64799022eb20f17b209075a0f846da5f6daf5aefde5be95d2fd82cae13f9de55debb0dcbc4b52c3b1a82b827fabe81f8ada8e1fd44321a8adf4a03198dbc346df67282777b82776538a20deabec7afbb0bbe9b016bc9b196489769cafddae2fe74e57e1de47e5de47e3dfffd98fd6e01ba6cf17f133998f9eb29077b7ab6785e917108f3b73d6a2bf2e4f331ca775bc57d590faca37cb715f9ee50e5bbbaca778722df1da67c574ff9ee30ff77f27eac4eb485f9ea44cdcf10cf577bd72d64df48aa7d60d2af1dc1fc7d1ab25e7bb8b83f035c3be9d172a1177ecb13841ce9bb8e54e41c59839c9b13e8b881f9fb0ca55f956c8f526ce52821f32fefbb56b25faf96787e34f3d79bd780fb50de4cbfbc1da5fdcabeb98b98bf6feb00452ff97c8cf23c17840b9fcb34b88ef9fb27ae13bf5722e16d549eabe16d0269039f1fe87f2f72bd783e4bb99675785dda3456e27c8cf8660eb876d8b5967d6118bb836a60279fa78b9d9487b193cf31769bfdefa5c44ec6f50616f7dbb5149b3c5ec8d90bbc2beff3df7399dff6cff564b491365f5b91772cf3b7e78e55e4dea83cbf51fcde047494ac6f8edf739fcb7bfcf762e6ef3bb9d8d36ba7cf858c3a8a5e272ae19ea8e825ed612eb886fe4686b7b73fbc368d70fe5276ccc7dec07c3eb6f536f15cfae22459b243aab3625bc1bdc3c4efa1e09e2cb78e03f7a00d88bad01ee78867078b67278034384eb18d13149b3d3c187b5f3cd669e221fbdf603c64397a92261e272788c729201e2781f7e533180f5196c8b23726ff54251ea76ae2715492f190e5fa699a789c9e201e6780789c06de97cf603c447913aba349f9672af138d3201eb29e7196261e672788c739201e6781f7e533180fd98e91be6818b876f260fb9b95f7ce63bef2d7bd86f950ca99e997d341b627d4743fdfcfabdaf36d0acf6de2f702458f0b143d2e14cff7f1eb5fad8c9a0bf490dfc1e7f3fcdfc77cd53070cde3f7b6f2de258a7e9788e71b153933fd7276be18b1ab4b154eeaf3cb144e9789dfcb153d2e57385d817092cf65d93a17e821bf83cf2527b50cbc8af9cbc0ab14f957b3b8dfd67d2f9fcbbeee6390f7ae51c2b94609e75a259eb21ecafd7e7df00ebf27fdb893b73acaba7aaa757351b78edcaad8cdade2f716e6af53dfe2c5ada3a8ff66f7167264997a9b22e7b6c472b2a727d0f124e6af9b8bb22796476e67fefac9ed42e6194237d99e9375f33bfcb626e5b9f7a1bc997e799de4b896ac5f3ec7fcf5bd9315bde4f331caf35c102e7c2ed3e079e6af5f0afd232f20e16d549eabe1c9fae589caf353fcef455e64fefaa5bc0e5237bf93f9ebe6777aec3a4b3bc3d89daac851d9c9e7e96227e561ece4738cdd69fef7526277badffed8992c5e7ecab62e2c53659d0994a90523c43d91ff2377c5df77ffcd9f89723772b7d0693eb8e66923c708743a9e2b7e65bd54e6957b98df8fdf239e9faf097f1b8883ac975e00eec97ae9bde09e0ce7be785c47c8b24b94e591fb4158f782f7e533985ea2bc8cd54ba5fc0794783c90643c643d08c643d64b1fd4c4e3a104f1781884f520785f3e83f1906d92ba8afc4794783c62100f592f7d54138fc712c4e37110d6a3e07df90cc643ad3f48f94f28f178c2201eb25efaa4261e4f2588c7d320ac27c1fbf2198c472d45ee33cc5fbe3f239ecbf2fd59e62fdfd5efe573598fb8c4ff9c5daae170593c2eddb7897ba9d603a43eb2bfff25a1cf38705dcb7b1d9525eb6ed297bfccfce5f3cb42c6104fe79c95feb023af307ff97c39b80fe5cdf4cbeb21e78cc832e64de6f7f95780fb50ee1be2bdfd946be9bb9b88fbaf8afbf9e09a873bddff1e93754759e79ca83cbf5a09477d2eeb8889c67fd57257ea365fd1ed7ef19eac33cab4b92e6e33bdcac4ef7445b6b4d9d714d9af79b27bca796bd72bb26f88cbcefb09912dcbddd715d9af0bd9b22fe04645f64d71d9fdae576463e97eb33f6c34fd1728d76afabfa5a4ff5b9eaebdb647facbfcaaa4957bad6ba7c83ecab799cf3fc5ece71d16f72bef8077f9efbbcc9f7fdff5e4f693e398b59530de677e1ffebe22f703e5f907e2f73da0c37be2f74385f9875ed8bdc5d8536f59779169ffb192f6b780fb50c7cf983fcfcbebd9c2b6e4dc3599f61f297a7ce4e9d1f727f1dead7e9eb1741853837ef2bb5ce5f918e5b9ec97b8ceff5c328d7dff8992fef2fb4dca73557e0fc53ea47c990e9f327fbdfa53859b1a9fdb94e7323c59ff92e9f0b9620b9f2bb6f205f3b5eb63f26f579e4bf977f8df8b7cc97cf5f2c079f44be4b99a47d5787da5c4eb2b255e5ffbe315e3fcb55f6eb5f47d07a42ff77df7037bd3f90159cf48870f91fdefff637a1ff20d8be7df6fc0bbfcf75be6f721df7a72f3443ac67c880ce37b85dff78adc1f94e73f88dfef800e72ceeb8fcc9f777ff4c2ce1573c4facbf908328ffeacd8f42de03ed4f137e6f721f25af8903cd986933ee427458f9f0403397fff4e3f4fd487a8fac9ef7295e76394e7d287dce47f2e99c6beff45497ff9fd26e5b92a5ffa90ff29f2653afccafc3ee457859b1a9fdb94e7aa0f91e9f0bb620bbf2bb6f207f3fb1029ff76e5b9ea43c47b913f99990ff913798ef91019afbf9478fda5c4eb6f7fbc629cfff6cbad96bedf80f475ec3457e6ef4cf81039d6f60fd3fb907f593cfffe0bde757ea38cf97c887bedc81d2ce725d4f687118dfaf9b9d7406e344b792ee2148dc47570ffcd7fe5fc957c70edfc1928fa3ff3a56d883c1aada3d8f42de03ed4b13ef3f990d8b5f02183e59c1c6133d1da8a1eb5050399b7659bb0061f524d3ff95daef27c8cf25c867383ffb9641afb5eced319ab7cbf4979aeca973ee41ffff3583ac8793e43c135e4a6c6e736e5b9ea43643a34506ca181622b0d99df8748f9b72bcf551f22de8b3662463e24f67db23e44c64ba6ff78700de3d5c41faf18e7267eb96afabad7c0870c94e33d263e44e97b88eec07c7d0feeb5f3ce908d0964c97989c2fea34d99df673415326ef6f41ef2b53fec6833e6ef7bb81bdc87f266fae50d5dc8fcf9abb9628f5780fb506e0be6cffff23a993e77ccd7cab8b764d5e77cc8705b319fff8db604f7f9ef8e0ab71d3d197bc878d656e4c9f539e3c13594db46792ed620445bb36afd8e3199ed946fda2932dbfa6d376637cde332dd7700f7687bf1cd4270edc46bd7b7fdefcbb16fecfddd1a01fde177b25f5ce653991f659c3a2871eaa0c449a6ff5cbf7c26fab7a33b2bf629fabb637ea8a3df16dc6bf91dffcd56ec37db8bcfb01cff7bd2cf473b89f70bc135ff95eb0ca72bfaeda2e8b9c87f9fc13efe7bfd7170e30a7da88c5b2eb88676ae7edfd6f0fb0e86dfb730fcbea5d9f7b13572497e1fd377520defef534378e353fb3e16df54bf6f61f87d07c3efdb1a7edfdaffbdf401b13a94e423cad8a172bcd6a48c9565431716cf8787887b5d859c61e0daf10d23e62aef75613e1fe45e43bdbbf9edcc9d2b24eff3dfcee2799122b7b3227f9117ef11ebfc7262e12872e4f7ee7c2528a758797e30887bd0b9f2db148edd99bf9cecee311bd9d2d37da4ec4714f376a2397e76525e344791375391b7d52fc71dab4a1407195e4f254d7b7af246bdadbcd75b4953399f43b2eea5d8d805e03effeda1a4a9d47334780eaedd78f3f74b140e525e1f856b1fa1f7cbfef763faf5f5db9c941393db4fd1ff7cf01dd44f7dbfc44bc751b28d7981265ed006a59c9ad227918d89f1fa682e9021c3ebcfaad7e9c4dcbde800e6afd3f507f7f96f9ec234cf933146caa9adc8cb677eff94afc81da43c176bd2a383818e625e5f7448fc5e7430b8c77f070a3913c0b5a3d36839ae5447d16ba812ee5045af5d99bf0e25ebe0672be1edad84f7b62247f2af1d67249fc5ec4eee0f227c74c152f02d7f0fccd50c6c07f78b341992c4bbb2def680417862ce4e74372043d61b87c5ef457703f7f8efee4afaedeef11cdb25419873807c19d683cab38785bce142fe7070cd7ff700df3e04eef1df11e29bddc0357f4fb7efca23def538b93fc7a3e257b6332f8f7fd35db62f13719475ee91403fb18e313a0a701c09eef1df02856381c7715c59823057803065588f29f149a4ebe3e2375bfc3e01e4c83d64e4fc0947e6649927a51fef0cde9f0a64a9f63386f9fbad64bfce68717f06b876e23c7e9617de7859ee49a6631539636b9023e3f714f3afe17edabb2e5b9a805147256cb8d784b20e33f6ae5887199dc0fc362bd374bcb83f195cf3efc43c91a8dcdf6331b876e23141d681a45f91dc9d384c5ca8c87a565c4f52644d12b26459267d86ac6b4c5674963acabd3de4bf65f8b2bea0d3e139713d55d161aaa7837c9f3dafa4cb0b01d2e5c5e07a47e55e1923fd761c9d0ede9d0ede8569320a5c3b71985ca5c896dfc93d13c6836bc8221f5cc3749a01ae1df993c4be0393def7cb89f945b94fc07070cd7fc17e19b13496dfcc52be11fd91d1d920fe33c13da8df4245bfdf3cfd264f56f4cb06e1bf04eea9fe45ae2955fd4b6dc056f62fe4826b50de4ebc5f3c7f59b1a357987f8f86443e50cc318beea5a48fac47cd51d2678e487f11ff29aadf57f6ad88ce4d2c67cae4043aaa3e08ece952a30f52f66e898ab9ef51b9efc46470cd7ff715f7a7806b2e4ff605c9fd1de6836b47ff9932cfcbbc54047494f3f75e15cf162a3a499b2a06f627db6b85ccdf262902f7f9afdc876514b886fac8b05f13cf4b94b045db23ba1884bd58094bee59311e5cf35fb9cf443eb876c29e763112f652256c594f2c0561972a61efef0f9b89b988d165e01bb95fc3ebe01dfecd44e5b99c6b34499105f69e70ffedc461ba5cd7a7a69ddc0b6038b8e6bf602f8868b91287150abf15202cc84f843d331b095bd943222ae60c46c1be0fd1554ad8154ad862af0826dbc44b90b4aa54c2aa14bf606f87689512d66a252cb11f4454ae21cd07d7309e6f223a287b4244c51abfe83aa0c33a4587f58a0e728d8c984312dda0c8147b3d44e15e0d2af78dca37d2176c027a6c52f43850d143ae117e0b7c23d705bfcd62be7fafbb999e85b2a74354ac878d6e06f2362b3a6cf1eb502d5e072b32c59ab42858ff163d4491b95589d71621f35de5f944e5f97bcc97f7a4bc589956c47c65da54b99e54f5fdfbb1e47dff42a6f7b3724fa9c9e03a027ced14700d7594be763eb876ec78af6de2bd647c3fe67f75beff50a6f7fdb22f51fadf51e01aeaa3868df9df547c97dcdb271f5c3b61cf2e43c2c6fc662abe4bfa77cc77617e325119a79433b2ccc07cf45eeb802ecef59cd7115d303f9aa8cc53fc683596985f4ce48f0e50e2277c732cdfcae71395e74abead163fcc9f262a27141f1d2b87c15e3f31bf8d95e9f2b952a6d7e45766c9b51689eac26f896fe51e1af9e09aff1ec6fc75d8c33c1b985bcb0b63aeac3bc8beb423143947d420676e021da56e478a6f972a61c9fba5cafb72af8dfd95f7e5fd65cafb72ef8e32e57d797fb9f2bedc8fa25c795fde5fa1bc2fd7f4af54de97f75729ef1f27ee5728efcbfb95cafb726d5c95f2bebcbf5a795faee15fa3bc2fefaff5bfcfde17cfe59ab875e09a3f97edda93c4f3f5e0da49e37d9622f24ef6cb937a547bbe41f9fe03f1fc14459f53147d4e55f43955e8f31b22ef34441ff5b9aacf87e2f9e98a3ea72bfa9ca1e87386a7cfbc2310796722faa8cf557d3e12cfcf52f4394bd1e76c459fb33d7df6dd0991770ea28ffa5cea93c8ef88f9f951657d7f54accbdf97d70b1cffb2efba04b2e4dc83f31419e70919970b19f78bf74783eff8fbbb2b72b6317d5fd1052ceeab2f00eff2df8b98bf5e729117f6fce715d9f2bb8b99bf6c12edc7e825f130626c2e05e15e02eef15fb9ae7e02b8e6e1ca75331a5e528758797101f39517fb7ecd12f29071d67e0fe328f74e50f6678eca7e7518c6854a189783fb09f8eef7b122477e7785c2f77ce4f918fffd589c2ef733d96f600dfa9eefd79729eb39e473f77b19f74e5e1c1688ba2ffbc49feeec53166b232d96b69b282f3513f2c4faf70589c601e4dcf7cf847e721ee27070cd7fe5fe0807806bfe9d6c0fcafd0fe6836b478785b20c9263095d41bc3ff7f42baae7fd2edc287ee5373d35df7c817c23eb5389b87ca9c459fc46af01f28b99bfcea7ec551895eb6f86836bfe7b6d5c4654aeb553f62a8cdd17f58de80d8a2c3967f37a204b8eb7e8f62a4c1457b1de84ed08e2f635f3f7918ab519313f18749c4bce2b97e9f46dfcfb4589faefe5f7df29b611f4fb6fc52f9c43f8bd1247b12e24366e12348e3fb2b8bdf16bb19eb1e4ed24becd166928f7bbca07d74ede2812eb5f8b12f5ff4a5f09f7c6127263ed909b99df8ec47ac7e82df16fa272feb9dcdf6324902beff35fb96fc72870ede85a7c0612f61d4ad862de73f44e10f69d4a58727f8df1e09affdea570ba4b84bdd2ff1e93eb5b26f9e5c67cb65cdf227c76d1c224d2ea57efdd25320cb186449e2912bd3b6e374b37837bfc9d3fc4af5c1793687e72221dc45a8225d2fffd2dc2b907b0bcc7635222d63f96c874f9477c2bc7f6fe45bee5cffe04b614544759eeddcbf475a3fb4078f78177f9effd8a6dddefc565f1c58a6cf9dd037e3be1afc4eef30b4db928bf8dd9029cf3c8df4ba60dfca9f8f641e6af473e28f4fd4eb0ae95409694f110e021e7283cacc87dd893bb64aeffbd4884f9cba2443ab70236936adacaf987bf19c890f3a11f01f17ec48bdfd21c8fdb52116fb75cd7bd2bed37551d7664f17c99aa8c6ca1cfa3ccef931e157111e540a9dccb3eca6a1eb796edacc7805ef2dee3e09ecc4b4f817b429f98df957d42c3c135ff057b5744451918957b528c0472e57dfefb04f3e7cb27bc382edb8684fd9c12b61ceb7f1e84fdbc1296dcd7623cb8e6bf72df9d7c70cdc35ea7842dfbff5e52c216e3cbd19741d82f2b61bfa8842de70dbca284fd8a3f6ca96344b6975e55c2963abd06c2167b232ccb56c202691e932be794bdaec815fd7ed137c0376f28ba49b9c06e647c63beef29e6f37da5b3802e30ddf3c1350f43ccc92893fe4d8c2d446ad7607b208e913afeb0227559cc57978935f3917a200efcba7efc9de572ec39411e8dc8fdb3651e7a13b0783341b80d95efe0b8d45b29ea22c76cc43a934863c042b42122e07ca788dc6367877838e549944d11a9a75ca79f0fae9df45a2eceb15abe4d7cd74d890fffb758cb143b8f09e81a3bff09ea5a3f455dc53cf5e83b8aaeef78ba968bfa6f7982faaf9411690274007de1097db85cf3f3ae12bed8bfa2fc7d2153bef79ef2de7bcaf733fcdfaf90f1946767497b7a1fd8930c436787cd819e92b198372ee7ad4464b92ef7210bda7e692b7415654144968d7942bf0f44dc3629d7727c56ecf11295fb700c03d78edc950b15791f015b92fbc388be82885cef3051797e3590a17b1e643f14b9deeb6390061f0b5d45ffdf4ac96d708277e55a6bc94bce6dfe44e125af67fb758e7eaaf0fad493bbea0445de6706bc0621cf83f092ebcf3e677edbffdcd3b742b44522723ddf97405ff16d44ae7d1bade8239fb703dfea9e0bbd236d90e7729d8e8ccf54f05cea5220c2f84289c717221e177b695f21db773a2605d5e546e4fc554dbcd17373e4f38589e32dcf68c1e22dcf688974449ecbf13db946375b84f795268d3a81673ac6bb24d625d219b149f9bc4b009b936b64e55e27721f74b9c656ee1fb159b90ff61789852bcbb7ae885edd1599eaf31c456fb90e53ee57b245b9ff5d021d7ad4a0c3b749ea20d7e0ca3d50362bf77f48a043cf1a74f83e491d84df8bcabd53b628f77f4aa043af1a74f831491d645b52f6f76c56eeff924087de35e8f073923ac8fc2ff72ec9f7bf1ffd3dae83fb8ee36bd68ef67f1b9b7b2bf719190eaef9af6c6f3bfe69addccba3aff24c8605e3d8c71f87d8f3eee05bdd73358e727e91dca7448d23e85370df71e2b8ee7dffb73119ffc4df8df4d7871311eb91b85b803cdc6b2e43ee2d70803e8cac0808230f09438cd364652961085f941505327241b8f219bf96fbafece7a5cd3a596feb0b9e4b2e7f2b6923d78f4d549e775764abcfd5b4c9163ad5d2a74d569db80eee3bce9ff50ffbbf95f69725f7dc180eaef96fedb8fdad7fdd1fc7d83319168c63be3f0eb1e7ddc1b7bae76a1c3b89e7f5983f9fcbfba0ed522d9fab7520259fc764d694cf45f99625f7013958b9df30810e836bd0a141923a88f5525972af8fcdcafdc609741852830eeafe21980ea24f2eab89a283bcbf43021d86d6a043932475485477d0b511e5fa3eb9d7b8a85f64c9bd3a0e01d7fcb95ccbe6d8e7c1b29d25cfa9866bdf92ed339ca8842bf7fed80aaef96fb3b8ec88cc832de2f7b2443d274baefb1e29e48bf224ab1578b7157897ff2afb756489fd3a0ebc5e912dbf53d69e6789323522d6cf65c9b5fdc3c135d745d4bdb3643d713db8e6e10df3bf9f25d7c81f0aae65bca19cc3143947f8f5ca6a07e22eda13eed9c509d24ac655f68765c93d4f447fd82639de3e353979da7b62be6c96dc276418b876e271507b2fac83462b614dae212c2957b67d545b80eb26659ac03580f2bdce805b672093ff662b3693ede9bc799da283fc4ed6f10f07d730fc4e8a4d7412f2a6039d617ac83d42c6fae565c9f6ce11fef063df75f6a7e3416728f1da5989df7c257e722e8e5ccb56435ac4f4964c3b2972453cb7481f95641a6775f4cbcf92f3908a12a47532e92adb42a3c0b5a3dfc1723e63d074eda6a46b37216fb4a27f77a053f71ad27a1725cde5be07c5c9a5f996957e3935e6a7a065ca08213f272e3722f3760f10cf1ee257b6bbd47cda0bbcdb0bbccb7f651b6514b876b86eddacc896dfc9fafe7870cdf5126166c93d1086836b988eb24eba1e5cf3f0e6fadfcf02fb0e6449fe825596acd31f09ae791862cf822cb907c154700dc3103a67e5813044df61a486b2577288d9846c670a9b38443d5b3e50595e3be28ec78c6725ac90ad64fddc46004f81396c062b607dd96c56cc56b072e75f05ceef72e77fef4ade975ff666d9357ce3ee4be8ee5ee8fcd7dd0db68aad773e2df1fa57663a1795cead12e77d2e6382f34d15cb63035cd9cb9d67458e9c0a56c64ad922d6c61d7b90a117b87f173a6f94ba428fcaaa16c41dd582e0ca9539ff97389f55391f72252b9dfbe39c3be5ce9f0ae75e91733dd9f9e55f2d64fdd93ce77fbf94394eb0656cb57335cbf97ba52b6fa1a376f5376b8ad27ce7aefacd0c4766b9abdd72e78e04bad2b92e73359ce9febdc6d5b4c4d57e8273afcab9c763b3848d727ed7b9a1558f7b85f36f5d98b30432bd8ef303dd8fb8c35d3299463bb1e1daf7736df1ff52647ba488db35705496970d6bf573473b8faa9612ffc7d07332bc313f41c8e8ef228bf8ee0d60fddcf1e119d508068f63f518eaeddbe33d880d4c18173d199edceddc18c453b8f69b050b57ccf9eda7dafea8e5b17e6ed745fb1aa296082c9797e38e26058942eddab5dcdd7955fc111d7eb73b676606f17bef95baef054f803a6ee1e74f0077487496f38f75ce9f32e7e591ceed62d7ff4d715e2a77fe2c71d5ad9642b95c5c5d1772f522b4264531cc511d6677e47bd676b1f2793578383de87ab158c441f773eb453b2530472c2cb7c21415b52699615e9f3270f06eb9432fa8ad4f97066ebaa4121a963259ba946990e90c50b3c74f942e0d63f18aa70bff4fcfb01162db35e98011aca523d870fbd836d73d35dbe65da27d542faee5d724a10d26d20023585b47d09d07343b8304a7391aee2fea89a931dc2169864d5d866daac52e191d308a7534147339c5663ab5ea2b6a718d10c17531c1cd0d05d7c304b730145c5f67508d339d25f9b315ae145ee0063727de23dd4b756b7a7b6a85e4c99a55c0aca9812e6d38c21db55aa989d30a4f9c8698e4d6a6921b6192773295dc586750ee4cbaccd7d2532b23b9af699d7419d99625aa64072d219be8e8716719d997945ef5ce23f9af51ceb74b1d0e6bdc1af16ae77b5d675362a2ed92f6f6ed5d9ad94cd705164c238cf00e3acbe7d83b60c9ae1a7f5bdcf89bea84f310774ec64db7c70537c3f26b474d7e8d04c9afcd3195b30d556e8109ee6428b8a52e8fb8e433db10f5da765c4e701fc387103a5633b6cd7be873456786b53113eb80e5815698357531f5fe3bea24f3b4e9aa89f0e2c58bf7a826bc332ebc35a6763753b577d299949be796919ad46ce79ed7673ec67d5aea76b4c665ae70afcb411537d117dcb0a638bfc58e865c97c426d89d699ae8ae37e06334b49a89d917de7f7591167c0fd7eae995c172491bcc81f53474606d313bee656ac7ed30c9bd4d25b7c760f43184d10113dcd750f0ce98e07e86823b6282730d05676382fb1b0aee8499c50053b3d84527993bcebc6454ee810beeac13ccab697c92a56935ad0bc623df9447574cf22053c9dd3492fbb9752c3ec522f34554bc977ca6a88517895a48cd5f245f480dd69991b6b4e0931173dc69b5d41a63e545775dda73931d9a0693cdd109e73d0fbbc65e8e0bffd7f9af9af046b8f01e98e6bb6934af1550f39e589618a6c912819a2ebd3026bb6b986cd6a99d80496f4cf8708df013020aef8309df43237c5b40e17d759ec26d346d21f514c94e5a19e7c48c87067b70abd7e4e4ac8519ceef62570b7e5fe6d8c46125f6292398a6e2eb3689c6b0e4a7ded0c7824fb16ae096ea7a8f37caf57876e98cf9c67e3a83e7bde57cfd5bb511595e8158207ad078f8e5eea3e94e083c3527086f5d2d4fd4c5f3442ee6e1466b3c5c24a087ebafcb706e4bb87cbb66385e98ad763b05f8bfd788e49de5861d1f9836c94adcf83a684a36b774d31aed58d768072461b4e9d01e33c70198ff1da7f1bf4322c1fc6f1e66eb7c0e658d75e204463c10133c4197896ab90f8267957c8ccd445dd91490cd202c0a930cd90cd609e6b50c3e49d7a8e23d0453798a8e3a2fd9e3d546de2507a79064bb1dd795ce6fb9fb94ffbbd2f9179f3959e84a2f76eef2dc5fecfc9bbfc1277f153a798f7fdd371091a11891a9a64476c52c649ac6421a458359c86e3ae1bc113c3d190b49d0081ea6f3d26e976229a9974ebef32abdfd7b7bea78697df20cd72773cba5d315f3c4bbeb92bb2513070429eae772a3e4e3d25157efd9aede7d13e8adabf004d7bc9a958dc2ad6c389637e668f2c6dd01f3c61e982bda4be78a78afcf58b7a55b9ed0ad64bbc99aed4ee1ae10c9bbab737d80536bda14c8e58cc0223f5713f9bf02467e2416f9bd7591e74954e046becc8d3cf7b755ceef6237ad8b95e826f2b9d9ceffd0a3cba78bdc19efcb9c3b6b5dbf50064259ebdad1b2801e7b14866f1f0dbeecac60f80a30bf3acfd0af8ed609e6556b3e626ddaed31064bf4f9ba44e74ea112f4ed04813f56573cb8e3427b92160fc1e749ebddbd7b50875a736558357c81eb3a5b558b59c2e9c408b971980b5f88b9f0c2980b5f5463d133cb099f57a12a9daccb75594eecc0c76399b0489309cfa91d2c134ec03261b161269ca813cc2b3725c9089e810b9e84e158acc151af4e301c937579ce1d76cbe45ca191ce5b15ae4b0f9eeb96e8f06a73dc52a69f279438742ccf4dd1250b27579a4c7a2fc59364aa2e49dc01cb4c4eae50eb6bc11265ffa4136519d34faca8297c2c59a661c55599aeb8e2396375cc9115b86dc372d79195052abaa6630e7839e68079bf94e85a0ce01af7c462b74217bbe66e31b3c0a9442e505ac1fcae57fbe2b5f320319d8169b052a7414ba0c102d71aabf0c51d01b4988969b14aa74563b7c05be3a8c82ddf9fca9581c29d85a5730596ce9529a5f36ccce757697cfeddf583f9fc393ae13bb839c1ac08dc0bd37a8d46eb631a04d37a2e267cad46f8fb0185ef8d095fa711fe5d40e1fb6046b31e339a0d2919cd3c2c531c90c839f44fa373d8178be9462ca69b528ae97c2ca607ea62dac28de934278673624d4c5e0c7add7db39db8168b7f0789eb7e1a1dfab9b37f32b90e04ae714b6d1dc8419aa4e9e7ce35aabee22399d036b3242696f16150dd92926402c04afe0598511cac338a562c5e3295c4c63626b83d137c2162ea996021a6c72189b221d7c32b978a8551a4ae4121a6c1569d062db524a68a7ebbd4b558846971a84e8b1d80163cb4254eaaa71e761116f661bab01b33584be183aebc39eb5965b07a493116eee1ba70f9acdc256e9d6801704da9d78a4ab0d08fd085de06c4ba262df87b15ee3b41f459acd387f74bf16d44d47e29574e807ea9255859731456d61c9d5259b314837a0c9e99d4b226de1f262b9f4b029636a53a2d786973ac2eb63c92c7297e580d6c0b1ed8fe58948fafc98a478a8d2bb81781d10e12d56558e827246bc59816a9597119a6cf893a7d5a68f334d44276f005d16139a6c3493a1dda27ccd93a5d522353aed38ad79a4f669a564ad360b5e6153ae1bc94e0e73b9ab45256625a9faad1fae9805aafc2849fa611fe5b40e1153ae1bcf0e2474c1a8d27576292cf30955c8501395307a4593020ab31e1676984bfdf2298f0353ae1bcf4e207649a8eaaacd509e7bd60e72463dd097a8bd7619ee2dc640427c8eceb75827909745e32821394361bb0443c5f93880fb70c968807e884f3f7b7b1eae5663f7725446a0bdd2f70beaa538b79fff575fed314b90916816fd4e9c98ded428db145031adb264cf8451ae15901851f8819dcc54c5334f1f106dd940039d69d2d1a80de349c2a77b8d7ebe58f57c8b3dd02ac8af5717e173b7f57c46a54d92cde80e112fbbb1217bb2de9e5ee775cb63756c59f0f709eefeafce639bf9d02e5868374b1e6767589c6ae72b95d5d6a66209b31cc97e9302f4c0be6d461f2f1f7a5a27b235b69d766b3d5a0cb255b7ceff5cd2e71b5e033b28225c716cc875caef1218fb709e6430ed609e75ee28a643c5f82919e4330c1571a0adeaa13ccf3f055c9085e860b3e5427980fd15f9d8ce005b8e0c330c1ee29ad8ae0193a179540f8e198755cabb18e13da06b38e2330cdafd368ae6de426d0fc484cf3eb359acf6d174cf3a374c2b98637e85c0ad3a99e204b1e8da97ea346f5ecf6c1543f06137e9346f8c68ec1841fab13ce8b4b7ec2aa69c5ef384cf82d69107e3c26fcd634083f41279c57596f4b26ef27a8b29e88d9e1edc9084e60822761567287c64a166607b3929375c2f9fb7732a406e01e749b7a0de0140cd3ddbaecca671104ad01f0410a1b2b5ba762a8efc150df6b86fa340cf57d3ad48bd2863a3c15aed3b1ac75bf266b55750e96b5cec0dcd8036970636762c21f4c83f0b3301ff990a18f3c1bb3c8870d7de439188e473438b4ab5a13e03817b39247750eb84b302b394f279cd79e1f4b064982daf3f998e0c70d056fc3583f9106d3bb40279cd7439f4c46eb0475d00bb1447c4a9388395d8325e24598f0a735c2bf0b28fc624cf8331ae1b7770b26fc124cf8b31ae15bbb07137e296629cfa5c1522ec3843f9f06e19763c25f4883f02b74c2b973e3e722572b97f982b4a0e572952863e562b120959f6025e895585c5ed2c5853fc8f6851a24acabb0b05ed68505270414555b7694faa0fcd59816afe8b4f04f5ef4ea28de7074ea1a5c8369f0aa4e83060c4e0bd8cbb58caa80c5ebb59897784de7827a04f312d76179edf534e4b5eb31cddfd068deb26730cd6fc0347f330d9adf8869fe9646f3950135bf09d3fced34687e33669fefe8ec932f7a9f277cd97cc737cc137e6857d136f0eecd757ffbb0e1cedf6380cf2a7205f125537c5878a5736fa9eb5fd6b903c325eedde2803eed164cff7775faf375a6718d4631be14b744c42357c4a3bf8887da56f27cb6dace59eebe51292690792d262f7e95cc9b4fb7defd32489c6ed5c5891bc87bb1074ae3f37de74f9dbaccfbafaff75fb0f6e76d98917da031b2da018dec764cf8871ae175020abf03b3808f7416d025290bf65ab8fd9cdf81e29e67cd07b07cf1eea080ab24efd469c9d3f4632c4d3f314ed3bbb0303fc5c2fccc38ccbbb1a4fe3c0dceea1e9d70fe3e3f7cdb6490e15e8cd4971829f7786b39d9291550f761a0be4e03a8fb75c27979f43f56bd3c9a3b265879f4804e389f26f34d32a990609acc8398d6df6ab4be7e6c30ad1fc2dcc4773a3791cd983b455a1e8ce4397fb822d8bfa623dba9f657b855f795292da27e18d3ee7b9d767cfff625b1f0e4bcd920e13d82a1fe4183fafe80a81fc584ffa811fe7140e18f61c27fd2083f615c30e18f63c27fd6691e50f81358bef9c530df3ca913cca752f173c28da6523d85f1f84dc3e3e2f1c1783c8d09ff5d23fce680c29fd108efe7ee0e9af91de9f90e38c15749f043db5b2814a2c892467e583abe1f3d163eb6ace1595dc270767f69548a544f963ff164790e13fdb746b426c513887e1e33a77f34e6346c6230737a0113feaf46f8e480c25fd409776b61118df3e7e74314c60aa278b1136c59e14b58842291ea111a3d3958845ec6844735c2b70614fe0a263c4b23fc9480c25fc592a2962e29b8a0225f3d205e43089218af61a1d6d685dab45aa8d537ed0b12faeb58e875b0d06517157734de105fea1d646f60a1d7d585de84e956f7c6e7de0709f94dcc90ea690c69c48c6086f4964eb87b067b2489c27e082ef86d4c700343c1ef6009d15097102d7c5ec83fc1bfc42d3dcb58f0158eef623a34d2e9d0cc678afe4517a919e37b58f88d75e1c305640b9c7a80b7c950aa8b50ded784ddcfdd769ccf39b765afe702f75f6b98ff10ca74eefedc24527d7b49772a98eb0f75b59f1d22bcf6c3b7becb7c5cb03ad4073a4be2a9d95413bd2c193dd55c78cc90003ec40268a609209a42001f610134d704c05208e0635d007ce6428b643c5982990b9f608ebda5c6b1172f08e6d83fc5b46e65a8f56798efd911ab05c22dcbe2abcb83f89ccf3152ad35a4862c0c46ea0b4cf84e1ae16501857f89096fa311beb43098f0af74c279c5a76d4477828f467882036dbec6346fa7d1fcf2809aff0f13de5e23fce980c2bfc18477d0086fb42898f06f75c27927c6ce11c34e8cef30b53b6ad49e1c50edef31e1d91ae1c70414fe0326bc9346f8f50185ff8809df4523fced80c27fc28477d608ff3aa0f09f314fd945e729bd517db8e786be3610c46ffe823988ae697010bf62ecba69d83d5c1c8cdd6f98e6ddd3a0f9ef98e6391acd3f0fa8f91f98e63dd2a0f99f98f7e969ea7dfec298f4d23019af139e80c9df98dabd4dd5fe0753bb8fae0b27a0daff626af735559bb714b46af7d3a8bd717130b5233ae1dc4be4622de405e8d663a9ee0114c522d85f13c15aa5c1229885457000d6fc8d77014c761b4acb5276a9b5b0b0f330a7bec609a5d2d7e736da813c37650d6a631a0cd469d092c11dde780f5c252b11cdc962837dfdea60099caf49e09cb260095c57279c1bea20c3cea37a98d6837575ac805ad7c7b41e62a875034ceba11aadb705d4ba21267c578df0d7030a6f8409df4dd777b93c98f0c63ae13cb70f4b86778281ca26580edb3d19c10932cd0e98850c37b490a698c67bd43c3493aa1f6a86a5ed085ddd3960da36c7d276a461dab6c0b41ea5f35b2b8269dd12135ea0732f0185b7c2848fd6085f1950f88e98018dd119105f3cc18ff8911be7cc728ab3c96c57b416c167a60531add6983663b1e1ad746c9dba932e545e7e8e8b3d00b3ab78ed6e7c24957db3da60b19ba08b9db78d937ade14ac978d76fe2c725e5e9262ef5a5b4c9f893a7de4f68003d2be3d603b4c8f49787bd9dba5335ddb03b6c734988c55ada406e9dc1eb003a6c5949a4777666b564f06097b672c0f4cc5f2c0b494f240475d387ccf9ce9ba70b8f83d2329efda968d456a0616a9992945aa139670b31219f0c0341af02e9806b31319f0c0341b70674c8b393565e42277e8afca7524260b6aba601aec557316f246eb0b7c9a0409bb2b16f65c5dd87c76ec72b6da7d13d6c4c6bac38c135c771f9f37102f728368d40dd3686f9d4670eec232e7c67a8374e88e85bc8f2e643867634dec76eaa1e760a1cfd385de586305a955f37b60e1ee8bd5c6799fc44ad70ae63869cb1f049d29db130b73be2eccfabe30a708fb0b125e2f2cbcfdb02a1adf4a5b1649a9c6b23716ea025da80d94505389671f2cc4859847e5fd2b703eb6bf8f253e112e88167d312d0a755af061f43eceff4142e88785b008eb3454e3a9df4733880eb9980e45980dcbe5aa3962794c8f40e1f5c7c22bd685c72b1f72cfd0094ea53b484803b0904a6a2a8f6088a9ed459a8785bd18af138c15c719f1c68497ba23dd7f55b81372bd5c146c22e7404c8b253a2d3af87c7172daa446271fd36b295642c1f238deec4c2d5f0fc2422f4d545294bae117bad3a337b0a0cbf6066361ee8f796eff2c4eefe4baa00bad8760a12ec362bac2ed399f02fcf78080b96e28166619e64fe227eda55256ec8af5d02cd7f4d0dcbc31580fcd6e588f58b9618fd8309d603e67714532827be08277d709e65d472b23d5f77f7315548527d87b63b84e38bf5c15e15354fcc237d46ad7eef9851ffc502d80da78007b60c65391a8f2c81dd062e7e6025625e6ea9506cc9e23b088556a22f6d6b5074c9bb0fbc96d82446c2416b1aa44ad017dc4829501a374217372ab2386e3a90598e435a692476392d79a4a1ea393cc71af8b98afac1c8ba9bdde54ed7198e40da692c763920f30953c4123b95fb67319d93ec72b9b9f1b99786ef2c6643cf7229cd7445d4a705e9b0c054fc2041f682878b22e853bf114de7fbba4703a0e77aee174a26488cdc6894dc18a81cdc9084ee0e5a76282b7180a9ea613cc7de0c1c9084eb0ac7e3ae6890f498327de1313be350dc267e88473b33fd4d03a666295c2c30c2b85b3301c87a701c76cac8e7c84611d798ecebdecc2ddcbe2ede25ee8dcca913a52dae52c4745f884c99e0c5fce6276b2bd3e25f6d225314f89a3934962ae3322782e56fb38c6b4f6b1376695c71a5ae53e98cac799aa3c0f73b5c71bbada7d31162718b2988f697ca2a1c6fb610eeba43438ac0598f093d3207c21661ea7989a4721968aa71aa6e2224ce5d34c552ec2249f6e2ab9582799afb43a23191809565a956094cf34a4bc18137c96a1e02558263cdb30132ec552ef1cd3d42bc5589c6bc8627f4cf0798682976190cf37845c8619f23643435e8ea5de05a6a9578e41bed010f20a4cf04586825762a977b161eaadc234bec450e30a4ce34b0d35aec434becc50e32a4cf0e58682576328ae3044b106d3f84a438dd7621a5f65a8f13a9d60be43ced511d31d72d6633a5f63a8f306acb6756d1a6a5b076049789d61126ec4045f6f287813c6f90643ce07621adf68a8f14198c637196abc19b38c9bd360195b30e1b7a441f8c158d97aab69d97a08d605749b6117d0569d603ef7f3f664046fc1051f8a09bec350f06198e03b0d051f8ea5de5da6a9770426f96e53c9476292ef31957c1426f95e53c9476359f0be3464c16330b5ef3755fb582c0b3e6098058fd309e6930f1e4c467082ed628fc7403f9406d02760381e36c4712296bf1f31ccdf27619c1f35e47c32c6f9b134703e05c3f1b8218e5331c14f180a3e0de3fca421e7d331ce4fa581f319188ea70d719c89097ec650f05918e7670d399f8d717e2e0d9ccfc1703c6f88e35cccf3bf60eaf9cfc378bc98061ee7633c5e32e4b10d13fcb2a1e00b301cafa401c78598f057d320fc229d703ec8fd5a3248128c865f8cd9deeba6b67709c6e38d34f0b8143391370d4de4324cf05b86822fc770bc9d061c5760c2df4983f02b31db7bd7d0f6aec2b47e2f0d5a5f8d097f3f0dc2afc1847f9006e1d762c23f4c83f0eb74c23b39971f25939809a67a5c8f59c9c78656720386e39334e0b851279c0f567c9a8cd609062b6ed209e6130c3e4b46708209063763823f37147c0b56127c615a12dc8a49fed254f26d98e4af4c25df8e49feda54f21d983dff2f0df67c27a6f637a66adf85a9fd6d1ad4be1b53fb3b53b5efc11afbdf1b36f6efc5da303f18b661eec340ff9806d0f763387e32c4f100566ffad9b0def420c6f91743ce0f619c7f4d03e787311cbf19e2780413fcbba1e04731ce7f18727e0ce3fc671a383f8ee1f8cb10c71398e0bf0d053f8971fec790f35318e77fd3c0f9690c07df6cdb04c73398d67cf9b1a9d6cf62c2a36910fe1c56e1cd4a0649820aeff35815bd5632821354d15fc034ae6da8f18b98e03a86825fc2ea0575a386f5829731c9f54c25bf82195dfd3418ddab98da0d4cd57e0d93dcd054f2eb98e446a692dfc0ecaeb1a1ddbd89096e6228f82d8cc50ea62cdec6ccae691accee1d4c78b334087f1763d2dc94c97b3ac97c06498b649231c10c92f7b16a74cb640427a8467f80f547b44a467082fe880f31c83b9a42fe0893dcda54f2c7582edcc930177e8299739b3498f3a758f1ddd6b0f8fe0cc3d1ce10c7e758e5aebd61e5ee0b4ce30e861a7f8909ded950f057188a8e8628bec634ce36d4f87f982d774a832d7f8309df250dc2bfc51c476753c7f11de6f7bb18fafdef31bfdfd5d0efff80f9fd6e867eff470c727753c83f6192734c25ff8ce5951e8679e517cc9c7ba6c19c7fc5fc7e2f43bfff1b86a3b7218edf3167d7c7d0d9fd8169dcd750e33f31c1fd0c05ff85a1c83544f137a6717f438dffc16c79401a6cf95f4c785e1a84f32e23ade31868ea38223ac9dcefe71bfafda84e30f7fb830cfd7e964e30f7fb830dfd7e2d0cf21053c8b531c9434d25d7d149e6596057c3bc525727989bf36e6930e77a3ae1dcef0f33f4fbf5311cbb1be268a013cc9ddd704367d710d3780f438d1b618247180a6e8ca1186988a209a6f128438d77c0b25f8169f66b8a491e6d2ab91996ffc6a421ff35c7488f3524dd02133cce50704b0cc7f834e06885099f9006e13b622632d1d4445a6345f724c3a27b27ace89e6c5874b7c18aee298645775bcceea61ada5d3bccd94d337476ed31b3986e6a161d3095f7345479672c9bcc484336e988099f9906e1d918ec59a6b03b616acf4e83dabbe884f371ef39c9a4648271efce3ac1fcb893bd9211bc1417dc05c331370d38ba62a9b8b7692a76c3d4de270d6a77c7d49e67aa760ea6f6be6950bb076623f30d6da427c6633f531ebd301e0bd2c0a337267c611a84f7c198149a32e98ba9bd280d6af7c38417a541782e26bc380dc2fb63c24bd2207c00267c711a84e761a6b2c4d454066292979a4acec72a94a58615ca415885727fc30ae5609de05d9ccb65c9084e30657c0826b8cc50f050acdab7dcb0dab72b56b72e37ac5bef86a158618862182678a5a1e0ddb11cb2ca34870cd749e65ea022199513ecafb107967a9586a93702135c65287824967aab0d536f1426788da1e002cc2cd69a9ac5684cf23a53c96330c9eb4d258fc5246f30953c0eebf038c0b0c363bc4e30df526963d4744ba50958c6de6498b12762980f34c53c09937c90a9e4c9188ccd8630a660158c2d86158ca9188b834d594cc32a8987a4a192381d13be350dc2f7c4b2e1a186d97006661e87199ac74cacac3adcb0ac9a85697c84a1c6b3318d8f34d4780e66d047991af45e98e4a34d25cfc5241f632a796fcc948f3534e57db012e538e312651e6673c71bdadcbe98d338210d4e633e9686279aa6e17e581a9e6498860bb0343cd9380d176269788a611a166269786a1ad270119686a799a66111a6f6e96950bb5823bc5f67e73252ceb6c71102f1a3ebe0718df3c4e100357f95fc910267e8ac29a290738f143833ca8f1418c0f02305d2a93576c44009962dce32cc168bb1fae1d986f5c325589638c7344b2cc5589c6bc8a21463719e218bfd31477cbea1235e8641de660ab90c937c81a9e4e558f25d68987ce53ac1dc9b5d948c609ecf11c12b7482f971b31727237808aef14a0cc52586285661282e35445181a1b8cc10452586e27243145558a6bec23053afc632f59586997a0d96f5ae32cd7a6b31c8571b425e8741bec610f27a0cf2b58690376028ae334471009643ae37cc211b318d6f30d47813e62c6e3474160762286e3244711086e26643149b313bbec5d08eb760767caba11d1f8ca1b8cd10c5219855dc6e68155b31abb8c3d02a0ec59a4a77a6a1a97418e694ef3275ca876392ef36957c0426f91e53c947ea24f36955f73a0f3a2683ba332efc284cf87d69107e3426fcfe34083f0613fe401a841f8ba5e683a6a9799cae1ba08b731959c5b66f37c00ce74f99f3ff0ab6d8f9df6b2897a4bd33e02127fe1d34a9e3a690b653e061b753209f25d32990ae38605d03c76346f7481a8cee044cf8a369107ea2ceeebab2edd8fd54eeca2f74c3e15f16b8dd396b6a48afe0275a3e9674f7d3e349743fa54f6bccc64ec27ccf13a6bee7649d646e034f26531b781caf669c82097eca50f0a9188ba74d599c86a9fc8ca1caa763829f35147c06c6e239531667622a3f6fa8f25998e0170c059f8db178d194c53998ca2f19aa7c2ea6f2cba62a9f87497ec554f2f95813ed55c326da36acf9f05a1a9a0f1760c25f4f83f00b31e16fa441f845584abe699a9217eb24f329aa6f25939209a6a85ea213bc8b73f9763282134c67bb1413fc8ea1e0cb30c8ef9a42be1cb38df7d2601b576029f8be610a5e89f56a7c60d8ab711586e3c334e0b81a4bc58f4c53f11aacfbe863c3eea36b31c19f180abe0e4bc14f0d53f07a4ce3cf0c35be01d3f873438d6fc4cce20b53b3b809b3e62fd360cd37633cbe32e4710b56827f6d5882df8ae1f85f1a70dc86a5e237a6a9783b66d1df1a5af41d580a7e679882776229f8bd610ade8541fec114f2dd5847c68f69e8c8b80753fb2753b5efc54cfae73498f47d98f05fd220fc7e8cc9afa64c1ec06a1dbf19d63a1ec454fedd54e587b02cfe8761167f1853f94f53951fc124ff652af9514cf2dfa6921fd349e6434bff248339c1d0d2e398e07f0d053f81b16059862c9ec49c7f24cbccf93f85798d68561ab686c74a96ac64b44e50b23c83695d2b0d5a3f8b65efdac9689d207b3f8725621dc3447c1ee35cd790f30b9841d73335e817b13c583f199513e4c19730c80d0c21bfac13ccab110d93119c6008fd150c722353c8af622c1a1bb2780d53b989a9caaf632aef60a8f21b98ca4d4d557e1333e56686a6fc1626b8b9a1e0b731162d4c59bc83496e692af95d4c722b53c9ef6192773495fc3e9680ad0d13f0039d6077fbf36404275836f521c6a28d298b8f3095db1aaafc31a6723b53953fc1546e6fa8f2a798ca1d4c55fe0c53796743953fc754ee68aaf21798e46c53c95f624dcb4ec9c048d0b4fc0a13bc8ba1e0af3582fb75732e230b19e51c8a398eb402f78dd16c92f3acd0799fcbf4ee4f7724163a61737923dd10f84c04ef99ff8bc4f3243aebe868e74974c9e2f324bab86fa647336c2ec4ffb00cd3d530c37c8399753753b3fe1653b9bba1cadf61bd6a3959e6bd6adf635af730d4fa070c744f53d03f622af73254f9270c74ef3480fe19d3ba8fa1d6bf60a0fb9a82fe1593dccf54f26f188c5c4318bf639d04fd0d3b09fec01a40030c1b407f6290f34c21ff85411e6808f96f0c72be21e47f30c1830c05ff8b754c0d4e43c714ef45d49ac61043d388e804731c430d71447582dd6ddb0d2d230b43b19b218a5a3ac13c970c33cd25b53116bb1bb2a883a5de70c3d4ab8b41dec310723d0cc5084314f5b1d41b699a7a0d30954719aadc5027987b8c8234788c4698d6a30db56e8c811e630aba09a6f258439577c0541e67aa72539d64defd3edeb0fbbd19267882a1e0e698e08986825be804f3cb49ce83761a6bd65a746d3c80965876999c86ecd20a133e250dc277c4ec6faaa9fdb5c60a80698605c04e580130ddb0006883b1d8d394455bcc0067a4c900dbe902e07d3f330dfb7eda634c669932e98099f5ec3498f5ce98f0396910de51277c27e772af64602fc0056763b0e79ac2ee8449dedb54f22e3ac97ca7f27d92819160a7f2ce5812ce4b431276c17cc8be863ea42b067abe29e86e98e4fd4c2577c7482f4803e91cccf52d4c93ebeb81d51a0a0d6b0d3d312c8bd280a51726bc280dc27b63a6526c6a2a7db042bdc4b050ef8b65c8c58619b21fc66289298b5cccf32d35f47cfd31db284d836d0cc078ec6fca230fab832c33ac830cc41a5f65ce83ee8ae0c8314c8ecfcc66c562ad2a1f835aeefe7b823b3ac54766163b9f78635013626f8e7157b4f2376638bffc69a97ba782f575caed05eee855b9f32e5ffdca4792b8dcf837a39d5f39f253ccc63a5f15b2e56e08deb7f1d1276fccabd41df3f23ff1f4cb7362b820412cf82adbd5cebf2b41e8b3dc313729d32f758ef355a9232748cb341fa3be5c477d24c3560f4f638bd8fe2ecd2a4171055be9fc3d81f171c1327724907fc59fd42c418d191f315ce18e2d163aef0689df202c7ee5baf8ed86c66f9c48e5eaf15ce25c718dab5c4b2877745eec8e392e4f10d759d5de0d12a7c1589c56e8e234188d53752dfc315ae93cad107647159721585c56eae2b22b1a173902bdc2bd2adf8ea933148bd12a5d8c86a51ca3251a8bc4e3a4b3df20b1da158b55852e563d03f809199f72a161222f1a44e3dd308d2b751a0f670c0dd5d373acb085428d7fc23d7d22af966acc866131abc2f28c6e56c26c56e5ced728757fbd591a0b5c8f5d293ee76589aa338d97de1d8bd16a5d8cc607c833231dc2156e69edc5aec82dcf2baae90e4b642c0f25921e24b6c3b1d8aed1c5761fc29ace3837ef4d7767e62c11359939aed72f75fe5ee4a665625bc7ad2308913d30226b7544ba05f6995e3cab3fe5cf6605d27404a6e93a9da6f86e2b3595bd454ed381e7ce6257ebd5316df5361b240623b118acd7c5a0abe217d5fc24f59dec125de2fc7b699af41c85e9b901ab99eac384b5d1c96efea874e82f75e927f202b877488fcf2bc0e277802e7ea3025b92b4796947a9783cb39ad0682c861b7531c4f7c0aab9ee5de8def37c1b6fbd9539faa62fa5c660f1d8a48bc7ee8a2542add5dc3353e89f9c15262a7b5369fb8dc5e275a02e5e7b2495c3463a3a148b3ac58ab4e4b0d4bcc7382c6e07e9e2363a419ac1d88d61ab9c0f0a45ad697d0db523fa7ad3782c969bb1d22859cb1c57a365a6a7e49f80c5608b2e063303b42bf0144ba6ff21937d1413310607eb189410d607671ad70729fdd5248cd3213a4eb38939e13d84416acca970988c71d89a4cae2f7063e8c546e69559ce3d8f487f3628509b2ffe5590184cc16270a82e06fd03c5002f4374714bad74998ae97f984eff82a44ace09ae87495cbe64b27e3a0d8be3e1ba380e42e3985a0bbc26594162321d8bc911ba980c09504a068f8b5e5a90d8ec89c5e6c86462037d91796cf4d282c46606169ba392e9a5f35b37cc4db3ddfec40ae7dda9ced3252cbea769e21c92befc33138bd9d1ba984d4aca478c73fbe30b45c9255bb1d39c7fc7eb39dbd367ccc2e27c4c327e91a2cf356e95e9ea7d9d8dc5f1d860ad5a3e8eb8c87949c675b25be71ae3eaabcb85e9ae4dcdc1e2715c322da420f6b93d2d722f2c96c7eb62999b742916b47d945a3d632ea6fd09c9d4f412f9faa0faa79a5bf6c6627062325656dd2324d70ec77d43a2ba78ea56b60f16cb93b0bebc9af3d24ce7e545cc1bb72c424baf4cf5a7ccc3627872327d60892c31581f58badb52fb62f13a059b1f909c7f08162b3cb55289d37c2c4ea7a6de735e538ecba44fdf0f8bdf69c9d4ac684676a9c77c1760713e5d17e7b9db39ced434166234ced0d1189b64a9924c0b3cd3254b2116d33375311d93545e9ec2f8190dbc449133b3f0d651a6ca9745583ccf4aa6e5a07adf0237a6d5530fb60692b99f5ebf5c84c5f1ec64fc72f538c6ebda13dc31ba2ad7ba786fa5aaed2ce7df2bddfbc9c52eb5b67c3116bf73b0994f89e2e795a0f10f921f6b496faa9560b13a5717ab7969b64c2cff057d3fbd4c16634cce4bbe86c17b6383d730bc3edce4fa7653f7ba4bb0f89d8f8d8ceadbf8fa039dbd58578a1a6289db53e58dad541fa54fdc3b954ada2dc5e2b62dd8ecd1447193e3f295ee1cd22a77f4a8cc894b19f3c64daa97aa5eb9e99e1c14202ea5585c2ec04a8dd4d32995b8a423bdf6c7e27821365662965e5ea992be345a86e97f11d672344ba364f44f47ba9461f1ba181b1f493d5dbc19ffa39dbf1395f2a9a6d0722c2697049b89944c0a058f493ad2aa1c8be1a5146955c8d691a5d50a2c269751a455d098a423ad566231bc3cfd69e5f7e9a56c83260ea9d722566131b922fd69153c26e948ab0a2c865762add3d4d3aa82e94ebfc4e7f3d4746e6690785662f1bc4a17cf3d8d5232ddf14c473a5761f1bf1a1b733649e71231b76311db877973b5a738dfac4b9b0f5d8dc5e61a6c4cc2243553894d3ad26c0d16cb6bd35fcf2f76db702b99b7fbe76411e7ea63d1a9a6d85a2c2ed7a5bf9e9f4a5cd2915eebb0385eaf8b63514a719473c2e3b3d6e227bc26e361a0c4f897f1de255c027eb26c1046eb31463724d3ef8baf51adb9df37d3337b376031bd5117d3f294ac6126b13504b78574e4a30330723799cf8eac6946577afac2376231b8591783094c1ddd88fba5547bfdfdbe2d59af97aa77df84c5f796d4660d25b71221b5919c5447ac0ec4e2782b360f25c8ac21eab9420761dadfa6d37e2ad3af389deafa9bb5eec8e3325f8a79e5d234e759b99bf370efa35b0bc4dfd68587edd31d24e69bb198dfae8b793756f3fcc459aee74cbf856dc134bd43a769d71abd06959e07637adea9d3b30b4b3ca249a5e521989677055b971274456aa51bc3e9ccbff3827e2c8f7a9df2568cc1ddd83c8b7431d87e713e148bf33de6b587416c600ab507fe5590181c86c5e0dee4c7e67898c1c7e6bcf861f7d355333e1c8bdf7dc9ac1dd1cf83c4479993abf705d1ff084cfffb75faef52631bc68b01cc21ba9c1344c323310d1f48651c9f13e4fd50eb1cddabafcac5c6b14d6ad5759dff239186ce3fc7b86ff25500d3dd5a8fe75dfa75771eb9752c79c2875cf7d5d7b7462c7e9f87bedcd1885becacd8686dfcbc0f4cc2830eb03a51e6fdd73dc261578904892c56b8795f96b992e3f33df9ae1ce35c8f56e2966345cef564d123af9ea082c5c2e3e55febc6efea6257739ce4392b7c5faa22b72ec7bdc222c762ea8a1849590ee91c4efabf16d38778aab611a91aedc737178cf44ad19a6ad6e2e12cef90469d0db5ae4616d67774ba7b02a68a5a74846fea273b02a6b8d5660f1f6f2cf27f15d71c22cca9ba10fbb802a41faa51dc6c90bd75e2dab866e635ee2a98b79dc3fb858cd5ad1dcde529f10825ae662eaeb89595bb6e90fb162e7282a899840259d338b2472991b577912d60b9b1c200a29bed84522c26b18d77ab02c5a2e3b5d2894c18407e9d1707f9989d20fb87026471af38c8c7e97d9e04c99b135c8525a2a8e1c8c280ebea8e715c4fd0fbbcea450407b73c54c544f6a238b2272991f16336e5d0985a38c001fa70602b6e16c7f61425b63aaea579734d2a42528e8e181387f334259ce63eafe565c77867f04c175a5532b1b400dac5abe2d09ea18456df8526fb8365a5360c88724be2889eb5b35a91170a9097f78b837c2ed31954d7a40a03b485a0a47c9e125a2b1fb4194a3dcceb4ef50e8ee5dd096140d77bdf38ba1728d1b5ae666fb23fa540acbb2f77ef8d73f1ad76420d03beeb4179fa22752b40d6d1c25b37cb0675b39728713574ad6d8cdb4fb7da0d3e4cbd1dbcaf57627a9912531ba6eb2082a56858eb6c3b55c511be42897047d4afcd71e72d9430ffcca330c0fb6d6c1cdeab94f01a272c4fc380aa69cb38aad7a81be90b9c1897fbec4a66499865c3806ddd8238b6d7e90b82f8149b15ee38e0f29060baba388ee90d4a4c2db5d605e74b7a75b425210177c2c238b83733d78c1ae57e580c269d4e76ef2c0b05b4cde571686fd15b1bdef60c5b36dd0806f4dea604c7cf7394ad0058d5e0f5ff3037a3cadc6654ddda8a7075467cea23f1c1a8e3730678336c0c5be7cedcaa10e0953904fc3019eb347f07ce01c849d03cca4972d038278916694e8091859c1aea8239498c83e5180d3a9a7c9d67f4f500e76b75302127a5bc9e9342374b4ee0264c4ec07eb09c0095d79c4055919c4045494e12f34772921c40cc49ba033527411d3407e9f257a5e3f50abd1eba567b4e8aadfdf8f434fdb4b25c3e3dedddffcf678ee5f29963ef71080345d9efd506dea7ac0dec2c52de9b2858ceca58f2d38d17b041aa3eedabe933837927f994bae1c91a804eb3fabe3ac28c64229b4a3da14d345ed1fa80baa2a5a2c5e7032f6043aa0f2fa50f672b2a9cb7019c1fda8473682871be02707e6413cefea1c47978248ef3639b700e0825cedb01ce4f6cc299174a9c1f029c9fda8473602871ee087ce76736e1cc0f25ce0280f3739b700e0a25cef900e71736e11c1c4a9c27019c5f6602e7121428549f6776c25651232a9cdfb038ceaf6cc2393094385f0238bfb609e7e050e26c052a4affb309e7a050e26400e73736e1ec1f4a9c2b4166ffd6269c79a1c4793fc0f99d4d38078412e74900e7f799989d8bc1f4af6f1fe0144564309751c13c08d43a7fb00926a16592c1dc0860fe6813ccfc10c2dc0060fe6413cc812184b916c0fcd92698842d7532989500e62f36c1acb6da3e0430570298bfda04b3da8afb10c05c0e60fe6613ccdc10c25c0a60fe6e13cca12184792580f9874d30878410e6c100e69f94301b3817cb6b5eff1a82de752e4522fb2b134b9f30fbf3f70e1156ccdb52a1bc1c74b6fd6d0bcabc50a2ec0832f23fb6a0246d2e92a17c0a58e5bfb6a0cc0f25ca678055b25a96a01c184a94fb0294114a9472f27911f3e60debcfd3f47671256cd9d4a602390264efa82d20095b356420870390599420f9d295c2d8d47c75f90319b81e54e0f82ebe125cad4c58e060c60f16e51b517355b9c2de16bcfcd94a77450cff207c3ef10600b2362548be3c638503b0c2b70465001b1dc2f64b1700ad0e2534b9620b1f43842d68b8f53361b1d2940aeb41006b5d4aac70a11ecfba4b1c5c19cac864dd10f70078f528e13505f04aff337e701bc0577f7b56b3a138d26c5c970ae55450a9694089b28940d95f64e38a4c59e1522a74e7032b6c98090f3848b1c50cc06b4f056f3760778d28e1b5f0151fb2523dc74597210b24cbbc4d00c4c69410e5b268ac6927634aea031750613c0c64e42699f081b9ff191f780840b703253a39388559a0bf24269d294e969ddf03309bda0493707a1e19cccf00cc6636c1249c044506f31d00b3b94d30097bb6c960be0b60b6b00926e124283298af03982d6d8249383d8f0ce61b00662b9b60120e1790c17c15c0dcd1269861eca6780dc06c6d134cc2495064307f063077b20926e1f43c329811d0066fb37dfb223d51ded9e4841eb33315ca23c1907fdbed89d23fd3318c3370a701ab6c97892c5ee6bcc4314ac958ff10214cb2fea18e597198ed33d1cdd6df377e2d1f87bdb7f24450ec74a0c498adc9defa8dece21b20c22d21497b318750e1ad00de73674abc358f734381191ae7de4285b514586d474aacea169dfe2d3cf93dae52b51347423003e34f80303b1396192f8cbc09031cdb04363ac17cb4304eeccb01c552274aac7212417f37d3cb8d7e33541c918d403e01ac72974cd436936b0585b1aba31f40d9991265f25bd4ce72ed92e35eec8a5b4e8b761115da09a022df85126de70095a672974f21939b2d17b855a735d415fcc7a35435535075ea1a06c884c51519e49301e46e61804c381c4206f91400b97b1820130e9390413e0d40ce090364c2216732c8a703c83dc2009970289a0cf2990072cf3040269cd64306f92c00b9571820134ef721837c0e80dc9b12325f1ae39d18234fdc19e9f63110d616c8d670d46371687db607b4302e7ca90ba0f5cd646f163fbd88cf5be6a7fda8032cfe11ab306ec0d317f466f5cb443f2befcd5a2e022f743b09c33ec0320858666e262c3368ff3fe9fe08642300ed40d1d2df46aca49ba190617d04f46c0da0c4da25e96a510153cfb5f26326ac18912dbebe05586f1e25e6e0675c1156e6c9c6b2ee073807da8473682871be0d70e6db849374fb71329c47019f3ac8269ca4bb1293e17c09e01c6c134ed2dddcc970fe08700eb10927e97231329c5d81ef1c6a134ed2636fc8708e053877b50927e9c122643897019cbbd98493f4d81b329c67039cc32871b6ae01a7dad314c6a31be60198bbdb04338c4737cc023087db04338c4737cc0030f7b00966188f6e980c608eb00966188f6e9800608eb40966188f6e180e608eb2096618478e0e02cdca029b608671e1d8260073b44d30c378744309c8e6636c8219c6a31b160298632961063b8780b0f821db3ff10290c9c7d982322f94289b01ab1c6f0b4ad2f3acc850de07ac72822d28f34389f2566095136d4149bac11019ca0100e5245b500e0a25ca5e608ad7644a94fc005d78f8d21cb70378b5fb900c1bd9b618dc3024b62994d852dfc09cb077886c1ee7ad00ebd4ed99b1a1b805a1dc03e76350724fa344c9e711f32dcc17390496b031b12d32084fc5201bd16907ec6f3ab537f44fbee6f3dc3c1a64d89a5061ab05b0ed49894d8e2bcae9d76bdca9d7ffb58d82ba803279c6f6f5829e286ffb2ac20e0ab272fa2750539c9989de1ebc9c9eedab2d1216298da8608e07d97c964d30092d930ce6280073b64d30098768c960ee0a60ceb1092661259c0c663e80b9974d3009a7b590c11c0160ceb50926e1b4163298c301ccbd6d824938444b06b33780b98f4d3009abec64307b0198f36c824938ad850ce60000735f9b601276f092c1ec0360cea784c90f75e2a753563a8fe37b788e6653d85c850a1944b27de95a0088fb65c222f92bba7de9d489d384be92ac93ad2780b9c0269884a53819cca100e6c24c0c44404fa95fb19bc1f96b7c6d1d09d64b41bf512125567818e81ab0914446763d20eb76fb0a58e5224a7cc91f82475876936d727e04c058448911ee73fcdfda7f230f202ca644d897f98726e2e75a4e76852c63feedcc836d7e4e58ce936d7efe18f0a125991815ca75abf225ae139820f096ba3eb5946d70ee17b330efd85d012c793125ce8e9a927e8ec3a3c051bbd8f5b3f277142b714731d7b816cbad95fb59c2a10db20a7e1d30e4b6c466b884431d64702300ee529be112d654c9e06e015eb6d466b884451819dcf500eefe36c325ece623837b2d80bbcc66b8844d0732b8d700b86536c3251c6e2683fb3b80bbdc66b884c3cf6470af0770cb6d864b381c4d06f71f007785cd700987a7c9e0fe0de0aea484db86a9bbd096bb5370d7b144abe2c880922d4ec8054057d90694b03e4b06f42e3029bc821228dfc5da3fbf99703a38d972047e4c98c45549894b778652f2de328c05d10a6089559468b3356883f5bd1256ffc9fa5e0f009e7375262cd73b2151fe8e151e74bccf054c005e95bc1f96cc879e019cc21a4ab4c1cea8236c47910dce8c0128d752a2e4b36b8a4481c4b37a592696db90596067806d1d25b6662cbe2d7fa5cf2766645090cc3bbe0500aea7b63bb51a2447a6c23702d50860db90e9ea50b2bbc3934e799c4185f603501d3a80126d0306576bf28f0b5d51e1ab417600d6b89112991c5e4e7e014d1827dd7e09706eb209e7c050e27c1ae03cd0269c834389b319f08f07d98473502871fe0eac73b34d3849f7e124c33917e0dc6213cebc50e2bc16e03cd8269ca4e3ec64388f04380fa1c4d985a5eb5027c2714bb2439daa4097db567b5b478413c8c85a475700b48752a2dd41a0cd530067a0b3830cde4490fd0fa384d72e69bbf4af10219c2f4ab63e6414b0c8c36d844a98cdc9a08e04508fb0112ae1401b19d46100ea913642259ce94106753700f5281ba1128e0691411d02a01e6d2354c25a2919d4c100ea313642256c519141bd19f4461d6b2354c2290b64506f02508fb3116a18d731ef05a01e6f2354c259746450e700a827504285cb72bd5920fcf3152edc8c8cc093354a3f657184275222ecc3fc333bb905ae753b46e2302b53eca722b45db25eaaf3417de0244af0ad58e2d94b9eeafc783d52cffa2715c86781059f6c0b48428b2403f90c00798a2d20092b5064209f03204fa504c92777c7e7904c765e5c12c2f923ed01aed32871f16db7e5c658531d0a65ceff708671f8e6cf7503e84ea744176c9b7ec29e24b229b02f80bae4199428d5add32b99b729c67f6b814b07b0d5c09999aa9af39a61a1f30a9fe1599ca9aa39d92ccf2741e63e8b12614ddbb3f93337e941cc64d9bb08c03cdb269884431964308b01cc736c8249d8314c06b310c03cd72698615cc8b208c03ccf269884ed1832980b00ccf36d824938544106732180b9cd269884b54b3298f300cc0b6c8249d8814606733e8079a14d3009a7ce90c12c01302fb20966188fce5b0a605e9c891ec9416e23521e9cc7158e2f93ce405392ac357e130079092548b88b72bc673243f8c87a280b00be4b29f1ed00f049a9198247b677f2a100de65dbb78fd213e51da247d8ee26dbcdfb3b3066787926fc61fe7fd41f5e076cf20a4a9072b3feeaa3de1e91ff56a76f2f609f5752626d2cb0f28017bb60a5ec52471d3270b5a9c031608f576d4f1f99b169d66467b6ae06e3385753a2acef5cf097573a04aad814f76fc23144b2618656c0f6aea10466b61321690b86ace6b81a78c46b6d861bc6edccf70770afb3196e18b7335f03fce8f536c30de376e65500ee0d36c30de376e61b01dc1b6d861bc6edcc0f00706fb2196e18b7331f070ab49b6d861bc6edcc0f04967b8bcd70c3b88bec7ec0726fb5196e18b733df1bc0bd8d126e5ba6ebadf2565af8fb09e0ea0bc2626c2915d25dc0f4c4dba97baafc1b9e8e6315ae3dae64843b71932d5be1b35725b83b28c199edc41dc6aa550928a0eea4449bad411b6c276ec2228a6caefcfbc08bde65afe586b197ab1258eedd94689bb044fdfe84feb40115ba28f0a7f76462242a99151cfed29dd0976ea1c2fa17b0c87b6dc44adafa27c37a19c07a5f26c6a9b0d94db33335564ab619600ec8f8f767ba384a7e973a42b4646bda8b81953e408976270d5a287094f3e90a77be09affef3bdc0084702c80608af0615a7076dc2393494389f00381fb20927e9381519cee520b33f6c134ed2538cc970de0a703e6213cebc50e27c0be07cd4269c0343897307e03b1fb309677e28710e04381fb709e7a050e2dc0be07cc2269c834389f30880f3494a9c2d9c0bbe7287032b728514b3396e8f5289d2f319beae393e5e26213e95099b4cfe701ec24164b256fbd700e7d336e11c184a9ccf039ccfd88473702871b600b5cd676dc239289438ff02d6f99c4d384927e090e1dc1be07cde269c79a1c4793dc0f9824d38078412e7d100e78b9438e5c2ede496e00ca41c27225b8453174caf79c9269884ed2032985900e6cb36c1241c1b2283c900cc572861d6b4d2ce5f9e134ea8215bed7915a86dbe6a0bcabc50a2ec06ba3a5eb305e58050a27c1658e5ebb6a0cc0f25ca86c057be610bca81a1447928c8e06f52a2eca24199dad18f845525b2d9c95300e6b7c280997490980c7353e018dece8463c875ff9ee2dcf64455b039ee00c76af7353923b48a0e25d9962e7fb038ca772851f666feb51dfe4509fee9ddc12683133603c82683bf081cc5bb94d8e5fc50bcf304b6aaa06b205c7adb940aeba9c09adfcb84ffd55b73b02561e11bd4bb1d58effb949875abed929f3b4aba369f6cf6e85700ee0736c325b45c32b8ed40cde1439be112f6ba92c1cd03703fca44b54c7adfd2847d5b84764ad65e7b0a38818f33513fc875eb0825aef54d775ee70227087b2d755ee61ff353428a3351db259bd25309ea079f6ccf1e05288eb4aa45b637ee95a09febd34c8c0af477fe7895ac6277a654c57f683fc8cb805d7e4609136ef00aad33ccbbe3ee06e07d9e094b2c62c96c793d2894e7d47403d9fa0b9b6086f19c9aee00e69736c10ce339355d00ccaf6c8219c6736aba02985fdb04338ce7d4ec0260fecf269861ac57760630bfb1096618cfa9e900607e6b13cc309e53d309c0fcce2698613ca72607c0fcde2698613ca7a60780f9c3f6edd6f04479475c1096e564e3a147838eb71f33d1121f9cf99638d9b8fc3060873f6d4f3bf4cf140de30ce6f900e5cf94283bb1ea1dc033997f316201b2816006ba82c97a8d1e6071c0bf50026ec160971b57d47f624398fbd3ff06107fa58408cff5e2420a63e8c27cc2f6b700df6f99c8e472c06c85eb1fb111c971e233bf17256cffcca6023c0378d1dfed299008eb986405d27a80f28f4c65f525bea226cc8314734056ff93129fd9ee9f619c8db42fb0ccbf3291c9936b4a86b1277308b0d2bf33d12a87b5ce31b183fe0a58fc7c3af2ca11d9a06e7700f31f4a986d6a287caa6fb416cebdc17a83f945ffda0694b07a4406b41b00ca0f17b40a28e1e00519d0010068c436a084051219d07e0068941268f2bbd4ce72eba0bcfc5fec8a5b4e5bd62fa2423b09549bb23261abf1b9f2359f3e4b0894acbcff0700ad651b50426f4a06b40be88baf6d1bd0309e8ffc36b0d03ab6010de334edff01a0752981b6aba1bcc7167111fa51b2455ca701a8f56c841ac695716701a8f56d844ae84fc9a01e07a036b0112aa14f25837a1280dad046a884d3bac9a03e0aa036b2112ae1f46e32a84f02a88d6d844a38cd9b0ceabd006a131ba1124ef72683fa2080ba838d5009a7309241dd05344f9b52420d7ecc0fe100335957df230067339b700e0d25cef700cee636e1ec1f4a9c17030fdac2269c034289f33580b3a54d38f34289b316c8ecad6cc239309438fb009c3bda84333f9438a7029cad6dc249bada830ce76100e74e36e11c1c4a9c17019c6d2871b6ae012714c7cbf5302eeb1a0160b6b50966189775cd0430dbd904338c1b5bec0a60b6b709661837b6d803c0ec6013cc306e6cd11cc0dcd9269861dcd8a20580d9d12698619c0ede08c0ccb609661837b668026076b209661837b6a80f60ee6213cc306e6cd110c0ec4c09b37d0098fe594c8495a42d54588702ac5d6cc44a7aec0f19d62740d771574aacc96fe1ab5f304b5848912d98fd14c0ed66335cc2ea1419dce701dcee36c3252cc4c8e05e07e0e6d80c378cebe82703b83d6c864bd86425835b0fd4137ada0c97b073850ceeafc0727b51c2ed9234dc0296f8e02bc2ae6ab29d9f9e0636dcdb8e757ad53193ba07b25315b200da3e94681b3b1725b135f8a3195f7bb8daf974b2f3c9123a7064fb42346171707d6d1a271d42e949c9c649ef0276d8cf269c434389f3358033d7269cfd4389f30850cef7b70927e9981419ce3b01ce0136e1cc0b25ce8f00ce3c9b700e0c25cef6c0770eb409677e28718e0638f36dc2497a500519ce4500e7209b700e0e25ce5301cec1db73a84feddd271c3c21dbc5f1550073884d3009a79491c17c09c01c6a134cc26e0e3298cf0198bbda0493d06792c17c12c0dccd26988463a26430ef003087d904338cfbdadf0c60ee6e134cc2314f3298370098c36d824938c64906f33a00730f9b608671b7f03f00cc1136c1245c544306f37500732425ccce1a98a98c6186710473270079541820135a3219e428805c1006c884b50232c88780cee6d161804c585b20833c13401e1306c8842d2f32c82700c863c30099b0454606f95800795c182013f66e9141be1f401e1f06c884bd5e6490ef019027840132e1080219e4ef01e48961804c38b24006f97d00791225e49ace2d8bab4e3c31886c8bee4b00cac9b6a0241d552043b93368bd4db10525e9fc2a32948f01ab9c6a0b4ad2d92b6428ef035639cd1694a4f3aac8504e0728a753a2eccefce743143a248a193f86101e2e9cfcb185843d0864d3d3f704b0f7ccc4f2e025497592877da7f3bb581ceb8c4c2cf8899f71020fc90e62bd84bd0664d6fb2cb0de9999680648ccfc65fef94a56150832a13f2683fc10803c2b0c90093b19c920b706906787017218dd4504409e1306c8613c08f93bd0a8d82b0c90c3586d7b0f409e6b4b738374d1305973e31a80726f5b5092ceb72143d91bf8d77d6c4149baeb2a19ca4f8055ceb30525e9c6df64285b81d37bf7b50525e996f464282f00197c7e265016b9a57625538fecccd8663664d3e9a6b238cafd2851361728b9d5797d03c58cafc6aa70efae74ee54b8af922124db93e22c8070c1f6ccd8501ca935926dbe380514370b33618dfdff73d67802b0c6424a842d6bf08d32a6a496b8800ae3588071d1f6cdd49ea83237b6842df1ce54288f02a5751125ca660265aef3a7cacdc24b9cdb5599cad243a800be0d6cb1787bda62c6364624abeecc03054c0925ca6c0d4afd849d91b1e1be99a22fa888da6b9259ea0a90d5176fdf613c283043f3abb75061dd0f38802594585b09ac039d3ff1ddcf26b8d5a312b62e539e94ace1783900b9747b361cfd55f5309e7ab22740594a8972076093d09f66c00e9752c19b0ce0ed9f891581b9d5da39ff9d4c7d1c80b98c12663d6eeaa20c1f2d26d892e122db42a601c05546898bcf6a2974eb8aa56e5112afe8c4e735856fc82b1be05b9e89cd5de5b862bc3c2e70e195572b5460c72e6135872c236f0695f3721bcf88209d5e4b567b6c0c2ae52b6cc44a3a979e0cebc3c05a5766626733bcad335b191e236c9937a2c2f939f0abab6cc2393094381f07382b6cc2393894381b82cc5e6913ce41a1c4f913b0ce2a9b70f60f25ced900e76a9b7092ee244586f36280738d4d38494fd423c3b905e05c1b8e5347c2b84c7633a8e6afb369a7dd2194fd9b64dd240f029ceb6dc239349438df013837d88493f4dc47329cc780fae80136e1243d9d940ce7cb00e7469b70926eac4d86f3278073934d380786126777e03b0fb409677e28714e04380fb209e7a050e22c033837db84737028719e0b706ec9c4b603708a827fb59ad74a5aeefe9bb79e56bb22c7c4c6a166b9d43230df782c15ecfe2c0efb605bd66490f641910dde9d07cafc436c4149daff4486b22e70015b6d4149daf74486f20e609587da829274808e0ce555c02a0fb30525e9e01c19ca7e00e5e1b6a0241d492243d913acaa3c2213cb5df84cbaf80e4d935d01cb3235878e6c565373e0278fb473ff25c29d6ec9f65fba93c5b11e65cfd240c2ddf2c9e61bbf092cf4e84ccc37ce75e7dc95b9423294bdc996bd6c0576780c253c3e88c86715c3c3d29788cfc3d7166f0bb01d9b8969dac92d17203d20902c03df01601e6713cc30aebe7808c03cde2698843339c960de0c609e60134cc22a0f19cc5b00cc136d8249b8531c19ccab01cc936c8249b8b72119cc6b00cc936d8219c69d3aae04304fb1092661270619ccab00cc536d8219c686e2c300e66936c124dc698b0ce68b00e6e9f6c01c12ca16d01ea00be30c9b6086b1053412c03cd32698616c010d0130cfb20966185b404301ccb36d8219c616d02000f31c9b6086b1053418c03cd72698616c010d0430cfb30966185b40f900e6f999d8e128f188f82077b71942abac4d05b22d180fdf9689cdf638a84a06372e0bf7667b3b004bbc201323e1f1639ff87e85f2f17f6d67d7b660cacb8599d8360566f0fff6c138a5c0622fb27b4f43c2ea3c9943781358eec594783b69f07225aa5c80e56ca23b017ba5e21afc2b84095d03d9fa60ce5302be841270d714ec7706e34b0aca9cbf173bff4f717e8b19f1ee9c0f47a9364a03967ca93dbb1f86b1c36424b0d9cb28513664f13de74a9d9bfca50dce83e2104ea7e904a05d6ed3be0aa4078a90f9cd1f00ce2b6cc2497aa80819ce3701ce2b6dc239289438eb815ae95536e1243d1e8c0ce76a609d57db8493745c930ce7a300e73536e1243d268c0ce78500e7b5996edd27bbc50fe961a164e7b9dc08fce87576eede4968b15ba8b07e0eb05e9f890ee73cf6dfdc52ff5290f56fb0c993e6536677324ffa05c079a34d38078612e75300e74d36e11c1c4a9c8d80d7bcd9269c834289f357609db7d884b37f2871ee0570de6a134ed2c50764382f01386fb309e78050e23c1ce0bc3d1cdba012ce7122db06b5140c72dc1106cc034289b90798677267260640563a04aad81c77386eb5fb880c1ad949982d810bb88b125a3ba69e1dc3edcd13f25f9b59f206a893de9d8996bc845aaa9d3ae61551613c55fd72e039efb10524e10a2432904500e4bdb6800ce3e63e5b40d6becf1690613c596b3a0079bf2d2009ab3d6420df01201fb00524616b880ce40d00e483b680249c9e4806f25f00f2215b40124ee92203f90d00f9b02d200957669281ec0faa3f8fd8029270bd3019c89600e4a39420bb292017b1ea33e3939f434f5841229b43df1a74673c96c9535d8b024d6020444b3681e16260c58fdbb307621857163f078aa82732d17f14742e481867829c0fa03e692354c22e1032a8e700a84fd90895b0f14906f54400f5691ba1123644c9a01e06a03e632354c28e3b32a88702a8cfda0895b0224506752b80fa9c8d50091bab6450cf04509fb7112a61c3950cea1900ea0b364225acfc93413d15407dd146a8849d7e64504f01505fca44e3149fe314f631a6fb581ce5cbdbb79def89e25bf7935a25d93c91e34197c92b9938eba0bf0234030b12c8fa9b86013b7c757bda213cc884d40ec98e8d5806bce36bdb7f57267e2e3b697be84f2a90e341867edd169084850c19c875c022dfb00524615f1219c805c022dfb4052461ff1119c87d00c8b7284136772e96ba47db16bb559b0a47dd95cebf0b5d819399b7b8b02c8435c7c6a0c47e9b12615be61f7ce3036b6b451bc66f9519ea805b4a85b407b0ca77a88fc5ab64de395945ae90625620ecb4dcbd3fcef9940f0daf0ce1b0f0cec032dfb577d73ac202880ced625092bf67f7ae75845d7064bbd6bd051cc0fb9478dbd450beaba7b2f777ea9d84c3c4649b57fd09807e601b50c2216232a0bf02a01fda0694b0cc2703fa3100fa916d40091b9b64403f04403fb60d2861994f06f47300f413db8012363ec9807e0a807e6a1b50c2413632a0df00a09fd90694b00b990ce81700e8e7b601259cb04006f41700f40bdb8012b694c880fe00807e49ddfbb4dc5dc55ee26b608e753fe18a17ba5d28a56e47de1ce797ef10b6228448f9d91012e957f66c341dc603f86602945f530f0517c63a4026bb1f2ef3890c5f1f537300ef7f9938a227b9a5070343797a6123b044e61b9b6086f1f4c22600e6b736c10ce366fcf500ccef6c8219c635460d00ccef6d8219c6d30ba300e60f36c10ce3e985b501cc1f6d8219c65d937e03ad9e9f6c8219c6d30bff02307fb6718fee01a15c45f43b1822fec546acfd4389f55280f5577b37eb27acd693cd3d1e041cc16f99d83235d9ce39d2c39fc9fa916e04387fb709e7d050e27c01e0fcc3269ca4db4d93e13c18f8d13f6dc249ba3f3219cedb00cebf6cc249ba7b3719ce7701cebf6dc249da9227c3d914f8ce7f6cc2497acc0919cedd01ce7f6dc2497a900419ceb90027ab63114ed2634ec8701e0b7046328133f9338d085b4564271f7cc7e238a336e1241d3b22c3f932c0996513cec1a1c4b92ba828d5b209e7a050e28c029cb56dc2d93f94385781cc5ec7269c79a1c4f920c059d7269c034289f37480b31e25ce9af65af067f4306ef67b05f09bf56d4199174a949d40f5bd812d28078412e533c02a1bda82323f9428ff0556d9c81694a45311c9501602948d295176d1a04ced283dc239226467bce503cc4dc280794028313f0f30ef408959eef6c5035eec4296b2cbc52be19b7ae3944f31784d29e1c9392278851eeef795a1bd669b52613d00606d9689ac1f3f0f01ee1df25f3f76a21054af9a53626ea3605ee33ce02f1627a81b847113ca9dc11cd11699a8642577f45e1851de048aa596942893db212cbca718ee0932792b5b4086d122c700903bda02328ca718ee0740b6b60564184f319c0540ee640bc8309e62b801806c630bc8309e62b800806c6b0bc8309e62783c00d9ce169061ecac3b1a806c6f0bc8309ecf7e3a00d9c11690613c9ffd640072e7edd9130fc5915680c8badf2e02283b66623c3dd7fd5bfe7aca8c6165ae50b972c8ebe1aca2c349b66defc12c8e339b12a75c9559c492d9388574c08dcc36db00dbec6413cc306e58d116c0dcc5269861dcb0624700b3b34d30c3b861456b00b38b4d30c3589ed70630bbda04338c1b56340530bbd904338c1b56640198dd6d8219c60d2b6a01983936c1246c4e92c16c0760f6b0096618f73b6c0f60f6dcbe6d734f94778a2061f143768ae0316000b7d7f644e93f088f1025d941784b8055f6a644d941a0ac624b9dc795e83cb859acc29d2653c916bbc296d30ee92ea2023b8ec5c1f6c9e43ca3156cad0bb22236c768261bcd26b151ce07fc3c23efde74e75d3e898bbf37d2d1a4941673972c22cc5f0357d077fbce928302fd7337c9b06ea1b2de8ec02df4cb045669bd558c9fcfba84f15ece098eddeafae707b181b4d65a9b0a6b0b30892b97126b3381950f64543278e4d30296812370c90e7faa0becb27f264afee46aa4616c290d0405d4004a94c96f96a62bfb09d19295fd138195e651a26dcae263471eb20c6672b24d2a0603cb1c98c9c287cf1a9ee3ce1f5eed62c4abfa84850f59557f2750f8e467623546be92ed33609364e39753804d0eca4457487223ebfd43d9aff437f08f836d8219c67ea53aa00534c42698611c59ff0358e6509b60867164fd4f0073579b60867164fd670073379b60867164fd370073984d30c338b2fe2580b9bb4d30c338b2fe358039dc2698611c59ff0cc0dcc3269861ec2ffa02c01c91895679f07e76c21a27594f7b07507d1f692356d28a3c19d6c781b58ea2c4da83a9ebcf2b9c0fca183c0713ebef1c193b95d0ff36a1af25eb997f1cd8714118b65421ed3a21db52e54e8079b41dbdf6d531932e30243be2e407e032c6d8b4d5f490501e387e0fb0d4b136e11c1a4a9c6f009ce36cc249da034086f34890d9c7db8473402871de0d704eb009675e28717e0b704eb40927e9c9af6438b381ef9c64134ed275496438c7009c936dc23928943897009c536cc239389438cf0038a7dab21b2d696734d97602178262689a2d28f34289b215b0cae9b6a01c104a940f01abdcd31694a4eb38c950de0bac72862d2849cf702743390da09c690bca41a144d91f4c549c4589b2398b4f9ff536e72d76ab3f152c435368c9fa32d7b238c2d9766e1e4d38a3896cf3e87b01d639b66472d2810cb24c7e3528c5f7b205655e2851e680a267ae2d28078412e52bc02af7b60525e9e60164285b82527c1f5b500e0c25ca6d2083cfcbc4fe881c55095bc3bce1dc096ec5a884adcb54b5886eeb53507eef9b0990fdffa3208f0520e767f6148d15aeb2156e4f6590290984936ac8aaf10f808cbf5fa62787e9d1fad7c191ce0b3d2a4284f51280754126dcc0d0ffa81b3813b8818594205bb2c4cbb1654c493761594085717750eb2cdc9efb1f67e87027b2559ab9a0ceb928d3b3e3923fd08970422dd9814ee5c0468b28d166275d1461d367095d00d9f4d9034191546ccfc616615cc3390d144a25369d844dba3d25d949d89f009c8b6dc2393094381f033897d884737028713600c5d2529b700e0a25ce1f817596da8493b4a149867312c0b9bf4d38f34289f3228073994d38498f6726c3b901e02c0bc7922dc20989644bb6d681aafd727b976c11ee7d43d63ffa25405b4e8996e7418e8b0b9820908e16f8c8b0914d916d0832fe0a4a6cf59d0bdef1c17b3b57b0290e87aa5002eb0a80adb4652c339c872f9f0d2aecab6c41495a1d2243f90b4059610b4ad2aa1019ca6b01ca4a5b5092f617d12d1a006572952d2849fb8ac850f6052857db8292b463830c65773032b4c69e9331c3b8addf8bc057aea544d986c5a767f3d1722ea6c2f9986fd00b056768149d6c68ad3100ba2e13a3e8b9bee908f271863092d9e53a16c7b83e13edec9a8e3219273ec8d8d6d1b3a9d0ee0ed06eb0e72028d21dbfc8ecf42800f3009b6086b1303a05c0dc6813cc30ee317b2080b9c9269861dc6376338079a04d30c3b8c76c198079904d30c3b8c7ec720073b34d30c3b8c7ecfe00e6169b6086718fd96500e6c136c10ce3291ba7019887d804338ca76c5c01606eb5e7f456c2f60fd9e9ad77835ecd432951b663f1ee8ef8ef0c57d80ab7fb638c8b91bfec8d812f7095aca2834a36f3fd3c609f87d973242ea17d929d935501bae30ecfc43959dc2ebd532f2b33d509b7850ade7a60874750c2ebaab1c320cb04e0bc22c2e6e5995122d02f032f7a64584013768a90813e04803e2a2ca0099ba564a03701d04787053461670a19e85500f43161014dd89c25035d0e401f1b16d0849d3064a08b01e8e3ec5df74958cf201b9cde1fd4868fb77bdd2761ed826cdde75660b927d86bb984fd5f6496bb0a58ee89f4fd0c6362132a0a5c6c5e8fc23217fa28e7d522e7df9ec8b1ce6f8923aa3884f3a8789b55423d89126a33166f1c57fab279b827fbac00004fa604b80bf3ef9cb38455b8185706caf884b50132c4b341c63f8512710b60a35ee7b7dc9828631d39644b6b3e06767aaa8de7d2918ebd92f58f3500e5fd69366225dda99e0ceb0320cb9f4e89952f9d8aaf689aeebcf4ffbabbb3d8a8aa300ee067940285425b40148306433463812e144a7932a15024d248541a444de96e630b4d4b0b0ffae0932f3e98f8a2b2086eb88b28828a3be0860b2a881b522aa262c58a206ee03967663affe9dec4ffcdf71542d399b973b9f777cf5dcef67d8ecd8d4bd5779d4c8353fc1e49d369a9012f69d369db81f35e499cd4a09734ce7dc0799f24ce3c959c43e10ab9461227357c358d732594ceb59238a921ac699cbb80739d244eead01f1ae73ae05c1f44f6631cfa339046bb02ff5b33a8515bfa534324f01600bf5f1b38b18e4f033f04e01bb481136b5834f05600dfa80d9cd84b4b033f0ce00f04312b3031e8fb609915b806181f0c6234d7f44ecd2e9a1bab1700de43724317119f1868edabb5501f7b5852d6cf7ce6f3002d42cf2668577d4412e76c959cbb817393244e6ad0231ae7cd70b23f2a89933ae78ac6b915381f93c4498d2345e33c009c8f4be2a446eda17126c1b5f309499cd4785234ce5ce07c5212273510128db318389f92c4498d3f4ee3bc03389f96d99f4f6cc0a6f5e7ef815bd233ec213cae2fbfcabed1641771a3f722a9805df5b2d6cc37b15153fa6aef2e7e560c71b3a44e9599cc91d0b44e9536e07c5612e70c959c7b81738b24ce592a39c7c115f339499c792a39cf40e97c5e122735063e8d7339706e95c499ab92730b70be2089931aaa8bc67927706ed3910883d8a3494b84510575a5ed1a98a9b1d268cc6320d4f18b416413c59e7a5c215e1834a65ddf0e978597a44012fb3a6990d900f9b214488d51cc2f07c81d522089a39968905500f98a1448e2cd86063917205f9502497c06a541de0690af498124cea8a741de0a90af4b812486d6a6416e03c837a4401203cad120d702e49b41f411f55c5bc7e87c0185314a63b1de0dac6f31592f338933e9cb4cd779f2fd9f514f7c80a7f5244d832ae54e26757627eaa61e217b4ebbd17b9d9ef8d84fabd1a703ffae2022f9f67faca8be1efb32e828d92d099318169986590e986f4bc2d43896640e60be23099378cba2611600e6bb9230898f5a34ccb980f99e244c62db130db31030df978449acedd330af04cc3d9230896d5034cc2580f981244c62ad9f86b914303f9484496c8ba2612e03cc8f82486f10ab80d6f4da15a7b1c57e3254263f9693095763bebccd502af70631b738c79474ac35a089d9252cbc8d268ef74950596f4b4c917d3bb2aa06fb7b93ff2d80c42fb42be35960fc544e96a7592a53b366c309fd99244c8da9597300739f244c8db79a4cc0dc2f0953636ad62cc0fc5c12a6c6d4ac5301f380244c8da959a701e617923035a666cd00cc2f25616a4ccd3a0530bf9284a93135eb74c0fc5a12a6c6d4acb980f98d9cd4acc407235a6ad6bb6086c6c120867cb93a793ce69cdb6037197b75508d1bb446b6661387fc564e3a566299a4a563ad87d3fb5010b386624dbf89610116d82f17db57eeab158370f0c17c606e61325fd889d90dd25a151da295c81ad0b02d5a4ee6c970353d1c5c0be71cdfc259694bab2b934d7e91005a386937a553702d6d95732d253e77d2aea5abe024ff4e6eb6398d49a7ae07da23413c3ae50fd247a71d70ba7f1fc4e9debfba91c6d6a42b80f22893f2a228e54a7b2ad798c6019dec1a534b4e8293fd07a9b0c4124b835d0a25f647a9b0c4567a1aec7500fb9354588d53631601ec31a9b01a1fa83201f667a9b0c47e791aecc570f36a930a4b1c3d4283bd00607f910aab31077d355c0a8e4b85258e2aa1c1de08b0bf3261279881ce38ca51391fee52185cdb2e0d54e36ccd4b00f43769a01ae7c52503e80969a01a3b4e8600e8efd24035ce8f4b05d093d24035cede1c05a0a7a4816a9c27370140ff9006aa7116e778003d2d0d54e37cb94900faa734508db3392702e85f418d8c2af11b5aef67290d96defcd3260ef93713323d0a996bff359a787ed880fa47f35980c9d0caf48f9cfe518dc370af81b2f82f9372947d11c92a53e1af850d665e47cf7d230f8e167a6d28c09d9194442a5f6523c74e1828765612e76c959c0781d35d3cc470ea6c825b07379c9024cee92a39f703e73992387355721a38d9cf95c43943256706700e91c4395325e755c0992489334f256733700e95c4499d8648e35c0f9cc3989cee855bd805ebd5c7946ce24cc3994c7d45f24aac7153efd7b43af7092873c99230354e7d3d09982324616a0cfe731c30474ac2d418fca71d305324616a0cfe7314304749c2d418fca70d30474bc2d418fca715305325616a9cae750430d324616a0cfeb31830d325616a0cfed302986398981307809998bf8858466f67b11e83a6e0b11259a9233269ac1b3cebb0a44e2b2fecb2f202df86e35a71cafdf647fab933cd7ce3ba662b3d49b97dbdd0d4f86f2db32037d8bf033b1637d9bfddbd1ff2617de799d5a6debfebd657e1d75d673f755bd668b233ec22e35cd1181d2d1ae1d048fbd34d3c70d3bd579845763977b0dcd6867d708dba6854db6b61d043a1ff1f1c6569745f5df77371c75ac27e5b4a7dbe25e7b0d0efcf2d097b1a0e8df5ffb3cbbd546bc963cbce35456649a75210d94ab78eaea357c2a1e484cf625178c3a114bff5f1f8bc89df1ad1e9d3f8f75cf77a79b483dd1db75a7b041bfcded7dba523db9d18cda5a087a523dbe0962db3afabadc30afbb33a7a74237b15ff143bf1c3a1e1dd7c33b2d5f1775d5929f55bed0a68c80f5271c6cbedf617994aff69855fa2d49e27a5f65bae74664db18b85f2ec8fc87494cc8e892899d16c5775d157b1f7fb5ea72b91bdafed3c57ec42dd5f916affb773a9af3d8a9cfeeefb55beec56fab52ee8734ffbdebf9ecfcb945e8e4ad654772c06f3fe8f77c73d7ad87d313ddf17fbc5f6c857440befd576e10abf51ee4fd27fd98c4b71c18a0600 serializedProgramBytesString: - serializedSignature: e274af2fb455b44b84a761f79b54a111d234fe86f6db23c6c30a9480882b13275d9e0bd1fdac9d32feb13c852dc60f4e92c8478fb6b5c11bc87f20856872760e + serializedSignature: c15a2aebffc5228bc26005e7d4e157c3839679355e43741ad4a60be43b436cbf41554e5d17530e23d9169c3484c60b5e273e55f762708580ab6fde48870f2f04 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset index 283cb80..f3172e4 100644 --- a/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset +++ b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15080921409ce28aed248e21c1b002e2dc892d202624c4a6b8feb82810687148094324e122af9037ca1be471f2333f52e574f7cea2d1eeccae56d2088b582a7677ae9eeeaf8fe9d9111193c1c77808973db6c556d83cdb657976ce5ec1d30adccfe06b979cfa4d5684fb4bb8e6a0ed21bb1730123fd3c6185cd7a15462651879c98ee17e4aeddbcc82e775186b41096b4fe0cf825e46270cda65abec397bc6d2c64800893d1a54e27506ca65c4e1bacc7e87568b98c2494c6a4ac3651b5a4ad476064c3bfd5eb07d12eb0cda8e614c911580e611518cff03578364a2db00bfa7e0af0bfe868432defb78fd302ff7b2ebe1ac5b7876fa1afc0fc78c086540c2f8db453b29d070ea127ceca88b768fd03721d4e1bd838f49f372b432e7f5980ea10eef113e664c28238f7ff9f028e3c5a1db25a91be4f5e375d28cfbd09cb0e5bce6d7a1d32f94b1df24c76315ef6fdebcf9376a9055fe0076926317cc44c18d8f59edeee38c0c761cc238c29999a669cb60a217404062bdbbe41b65b6c416a5d63b6e2405be57e89a831ea7441427734df1a7670a64ae005f4b70bd12d4af91e7a2f39d42cb3cdb803b8e3a640be04c2f5c54f660da02b8afc576e07a41f40e816d6fcf2091d04ddd63b680a61d45cea0c601f402ca05e2709baeaf89538bb85f87ba32c5b45710d596e17e45b379652fc2b36cce1d0e999c47793051d5db21cb51d32a4883dc9b64bfef3472131aa1f038c5ddb0d3a408f8874713ef30b4830c06cb754e63c10eab55758bcca4f565cb83607819bd12caed3b08ef7d1f6450dd6992a0a261fc44abc55a62262e17c65480587ea022bd1963d443c19ffd68b433834cbaa13764d0c7b072a785d063db3951c941dff0f023a8b36ef83dd867b05b8ce01bf30817cc820ac28804c24c8c67165eaeba5d5c614f05e50e997290aab1dd42e53c07d97fe56b4778d5606a35e70241ae990469c69bb204cdafd24ba74c2f719e057a5872ab25a1564b544538d920e12e99be29373dd4aa6f27c1dc864ce22768cb417f8b562bacdf048a39981be96569864a525a3dc2df127a6bb6843eb284fb42badc28672a1b89c9104fb4dac3b6610cf62904aca3725c713372b796b587b04d29bc2c88071582719933a0cd0ed4e20c7d6a67e8961146d50caae475134fa98927647aa79deed15be569ce4b86f0de3654b3b70d93453ca8c3dbfcb853d94b8f4cad581c51a5506eb546d56a4dca88e38ca3b518e3b09a70af8aeb7413b8ee53111f6b02f17e15f17109712324f1940aef8906f11e50713d29e13a1e92eb415564996a426419924516b2cbd6ae2865dad563bff02bca7b0c5ff3b84c63e33a40543bba2a3864e1a94875f3ec00be98be21797c16a7adec5bb0a5be19e481ed0e532d75fee0a842d7b0cc6e50b57765783d6a10af970cdf561fb00d6611a765f68b0f761e13bda336d111951cf76472645df855e6b4f93c07ee6d2e4bf0dd012e7103e5a765b5f6c596ea0d5918f94655f2bd2f936f3fa49e6ca9d7483b626ba901fb6dc0f243e09256e1f2810c97a70ddaef1ab7df66797b1849c754927ea89254e451dc708a36be4e2f4b7f8341398a1465ae39d558bf9666d9fab84ad2fbcdd0e93ce7d43e373be70bd12a7f4d8cbc62f9293c79e3bab8a170b7d9b4f2a1249d5049fa914cd21f1b90340b4b6e8ee4c3d64be0135f99db526ec115cb97dcdf754a3ca992f8814ce2c735c5e92cf09027dbb58f011a8fd3416b500cbe868149e1f7d4b3086337090d2c959849b9758655b61f41676338fb1978137acc0e007074bd69f5a730cdd42765279e2ca1de439320296cbc70fc099dac392fe265d205cba43e208a71891c5a80346d346e9ba433a855e7303662d27e67b64e6b0ae602cf70bb3ae436143ed3b4093ca39f4800017ce571c01dc3a2c5141512384bd00bd23922e09c2934e188184dcb0e24459ef6e1071ddd45dcbdb236eb28b2d6ed8dd72bfa290e5d017b588bf4f26e2fa14deddbc6f927a295cf282ca5126ae5213283a176f67f1e05331805f1974c5d434ed0c8a055cce9f4ec24e9cbd698983a1d808fb9e66ae46cb0bbcad3fb6a11a41e6fa773b4a80ddbbc4ed87a386c17ae7d56461f68c3ba404b0aa09937636b0b6d085b42802dd30a5babde8b69b5b5982ed02202680b3a418b73d06c02177ae18aea82ab5f806b51275c090e57f5bb008d6e99d00559a700d9522ba259def5d241aba5a574c1d62dc0f6a94ed8621cb6d7fcdd8c46b0b4d9585400eb512bc03ad10f9636cb8a09607dd60a87f4a6174b6d98cac605d83ed7091ba6176750b8f2bc3e6d3f5b1b1440fbe2666cad1d77002901b62f75c2d62dc086ffca72d5a679191300fbaa150b804580b527587d02585feb04ab9783754caf5eaa0f13da71b36408c07da3133879f6df8e99598700d9b7ad8864e2f193c6ed9236e7ec1100fbaed580b563341b10007bdc0ac0ecf4a2a8db25b501d6cb6ecd094c0613a527aceac0439d3edb871e035c4eacfb9959d49ee7a7f8950310937e5788dba330a783fe34834f27b2a2282efd149aa69f669cb8c8246de4f425e9a315937e86799be55f66f67f07d307cd344d66bc0b9ab7895b900a1429432f529fe87f8750fcb8683f0000 serializedProgramBytesString: - serializedSignature: a13b10965522f94e1473a76dc3fe77809fd422bc6cbb702f57ab05aa7d3f09a04f3b9517111ddef9b8ef05d2a961152423b751e964c86e685cffc32365b0ba0c + serializedSignature: 5133ead068028001127c2e50d3df573122925e1b5d04ce16b8619e0c6780d2dce76d69cdaaf3750e771f57b429dd690caff3129397dfc13e2dac9af37f3b4c0a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset index d10e526..f0e90ff 100644 --- a/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset +++ b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b6f1b45149e75b2bee4429ad02629bdd042a12e6dbd4e6ff08090d22694407a516e12aa506b522775712e386e6979434242e29907fe0aff821f0312e205cef976361eefceec7a1d4f4843bdf25ee672e69cef5c66e6ac9df1047d9c4b745a110be296288965f1586c894dbabb45d70d3afca7a0fcbe68d0759dce15aabb24ce24f4e4cf796792ce73f4b4239ad4f39958a56b0df58ba24af773d4b74a4f5cba46df2ab572faa9d3b29811f7c45d31e11c4b20b1824e3bb2cc61b99c3c9d6f8a97545b05533c8887aa093a2d52cd0eea3688e9a0dd03f115c4daa0ba55ead31075a2f93528e6e7e9ec40265c5c79ed9357e6384bdf41f99ca16f81fbc97bb54f565ef3f27e4879663a75d9f647c318c329c62884c628483abfcbb67fc9f201d9ee0de539a0c3df118507959723093ce6e4f3a88e67d781a63f23ec2b625b7810e2420a930c7a261b2393ce667cfd9155f2b04d52fb3611d058c432ecad29ae8a2b5a8b38ee0c297cdfc2b9422d6a203a161de2b7c810cc5c9d8eaa62ce3b547e1bdec0065da39a9298a72bf77a24a6c8401f84a8acd0b0757289aa58a2f336e83d22b6a32d934462d30ff759209abe676e504900e8363dd7c1e122cecfc16915dccf51591371629322c54dbabec06851d91b74af1b734942a6e751efa0a6723f0c046a9a2169987b0fb6fa5a23ff854618faec9874c37e0fd1e4e788265e63e8071917139f4f63ca9f7adacaae080ff17e2182607a19a312eaeddbc7fb86b8162b8b1e1956f70948d0d270e3973f5efc7de3cf9fdc76d1ae0a0f53d8c904d1e280657a45673c42215e04d7ed2f33a361f81d1dfc3cbd398bfb08bfdfae8676e91590c5ccd4ae00875782c1a4b9289e504583582d895962a202b6eb92c9658854c734579365b7e9798b0666724b581faea3fd3d2a7b2a636944b7e5ac5c1a1435936f9288260565740acaefb7829223529c82f2bb72b514c41f3d82050382493c9810ecd321c883384fad22b84c65fed26916b535ccb76c5b1550576d89e531b50f50bc8305ff3370128f372f732f87f0d6633d08ac4bf0157bdc9a34d3afd30cd6e84bfb68db5cb7052a156a9bdeba79d17c316cdd7ab88701f76444b864164c10ba1a08cb79b9e509fbdc3ff4710b21c6d8130cc4b33afd602ff88355fd74ba51d2d96630ee16ec91390a56ca0b745d03175cbe2aa7d7f8b1e2353fb28b4f0b630f7bd2d914db3dfb52f0767680f5e6eacd72146679b07836197c4e67f02cdb9846196556c69bbc29879c4721e719ad9cc1dd4deac6ab85e7d82b3d239e75bcba6ec48f46cd7e94d7f1cc71ee98367484290f9b29174c94c7f74a7940e7fbc87f3cda17df5fa49ded175457a1f655ec9eb8fc3e51acd0d84c6f1a23b4b4d3de23de73273a9e21276133e7149bd92b6726cb1ed4e992cdfdb86e7d7bdd3867eb7cb3241ed2b12e38b1f810491dd6d6737a66ddd4c93bb95ec5aa7d4a8a584ece6c39432639ded2c931b38b6c3b4a77c1eb77d0d73772ddec4b3147f5f7a8c6cf5e7049e738f44eca6193942774527edc85b6fc34f0b4a2ab78eec3b52b5457a3789546aa374c529dd449f5496add0516384f75ab20a4fa0db7d0d13379581ac9464c929dd249f6656ac97c6db5db651a59f662c5dd68fa88098fd3264d9b2dcf47608be4f0a5e0bdf64b60b54ef741d6319df576ef99a326c9ded64936bfabe9606e575721fe8e93b5b486a8c9b3d7dc6ecb597825b7588066aad24f1b12112efd16c3b054fe2c58c3d035f17d0c32f1faccd1e1383c5bcc626cc6fa3e7af0d38ef0e0c4e514ab391e7b83ec6b0bd98e0addd53b5aa3f14acaf4fa612db24ae836139d24854e4725454baa749daff8a359f79c9428a0454823a81c3649cfb256fba456331e02c5c52ead29998b77d4d1125f612565d17c027765cc747879fc503a4615af78592189a384731de1512e834090a4edc17b3736ad6982e73116a73b74fc4a2539375366f4dfb50951161071778edaaf06384201e79c4d70c6000e9be90c863605f05701b46b002de786887fdab3e8d55d4a3f1a674730b3bd4026a1017a8fc3711753fc41e3fc3dd5128b11c72a766c4d4543dc6a4dfcfa09bbcc13fffbfff339b9cce6739e41180ca630c489a2cd387106fa0a34b6498dd22efecb619ef6f28ab0d0164d263b11b89b8832a084e10b36e11d96f0f2c06b0037a0cdab646bc0b9b68053e7af0f6c02372e815b958edd0c6d3454e6adda60c11694ae02e5459b500e819afe4db035d8066dc1d6a7c076c9266c67359191996822b5be293e973f5f3a6c76995100be6c13e011636cdc944dac8197b3059ea38057b209de69095e533cc102275d12cea25d5a73fcac02ad6713da098de3c765ff2c82396c0bccbc0266f9208139f50a825950c09cb209260fc4ce3e8b08e96f9d2cae22ad01d6af0076c52660a72251b23d616e7e756ed5ad8fda0236270e4da6a4cc9992ab6c1cf25f1ea218bb92f5530ca35252feadc61d2cd62a44b9826b2bdde0e117173744bacc703ccde45cc03555989086ea3dd3502ff21b3a49f792eb188ad18ac73f7239d4f25f57f59ef1d8f99da91ed85e32476ce19dffc9c6c66474f0f4eaff6b6e1b2d99cdbdd835a791dae9f9bfc2f68e1d4c9bee9dec1fb6dbf478b7369d9ea38f6cdab44fcd5f2b8468dfee403abd1ec232b75a6dc31e5ae973dfc39f08fefd713212a7902433539ba6a775c85a03d50d117c726e704c2029bf4c7dfda8c2736a037fce6ca0a5fb2fb53a883d983a0000 serializedProgramBytesString: - serializedSignature: d9369b1429ce5f11a0e883a153ca9ef664bad7b93e557d2479cb21dfc6e70b274bfc7a8f0100bcda37e12aed93e78a03e64553deb58170447f53e0a3e65a8408 + serializedSignature: 1fcecbb27681e97ccdca8ac360efebf249f48900cc7107dcfb03fe642d2785fa4fd955c1d7c51d1dc5a68be2e741b2d11fcd65c6289387224b3c747d55bc8708 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset index 208e348..a55df62 100644 --- a/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset +++ b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a5b53db46143e32c87708699b92f4169ab4c529010998e96ba7104a9949930cb679c9741c8345e2d606c6364cfad6bef617b56ffd619da1e71cadecb5b4922ce275631a7b2c597b3997ef5cf6ecda290bf0653cc4cb01ecc336ac41151a700a27f86d1bef6d7cbb4f5efb33e8e0fd255eebd8f710966266d26bd9b88dd73d7cea420f679ec311de9bdc5f0607bfefe15c079fa8f5183f0e8e32667152151ec15378028bc6ad1812073ca92bda0cd2cbc8e2750b7ec55e8785222616772de2a58c3d5dee6ba3d0deb8e7f013abd5c6be239cd38116d23c648ad9bf692eebc4b719fca4f153909ee99e177743f417a567fae40664b87f4e7a26adff14cf197137a53959896e4eeaf7dae8332fc9e1c9670abae6e5e5e53fa6c1e8fe80fad6e10cac144d7890c00dbc99f10e40a4d329a1dc32b3ed21d467484061852adbb8079bb0a1b4c21da328c9bdcdd73a8e68325162e663f157800509d7c2b723b95017db77d903c9899ad8b3068ff14eb35ec03a3ac5731f950364db423774a082d733a6f702c50e8e8c5389dccd3f671f69bad1d0c6160fd0337c6eb18465be5eb0a40e4bbf876d3d8ecd138cce2dbcbf666e41dd3bf85dc5b3222053cba80e8ab07637f43c333d426d487a8be3e39d45fe0b8b70aabae1e5188b62c4f82360897718ba49c6e4c5c6a5b1eea6fba1b60db038e756020826d731a8a1dabfa9ef94a9d4716c943e6a74c8e42bacc5c0ca600eebb50916ad17c627317a45a14af44abce22795df34676d92d28fbfa1c29fd7c6f204f12fe31c1ad38af12635fa04eb5d3ffaa030809d160b7f49b13cc6c91086604a81a09d11d58452ac9c4f2c1a1c427c268c786e0cc467c388e7c740dc5439161758bf6b75ac51abac5d2eb21dac800fe167b13c7a7c4f79692489bc65761fefc72c05b51f091789e615edb4853e3e038c2d2e3a7712d48afab5a09a30657b9574c958524ae77ddb429aaf90d705971ae7c849c5c134d5a139cf1cde2efdc3c23eadf2effce413678f4b381a973c7152cdb2eaf341b5651642936634ff30f432aad443d9e1a6222c6c0a8bf7282f910b9a812c341f9e85b22a3e64a5f781b633c37c0ce2e3a01d5caf79227c2bc06f219c5f2e2ca57ea04ca9bf7d9b24a5e6c388df1a43be2e8421f5a10aa912d0f9c189d81beeb0fd9b1c6f95be97d7f0fd12e8fca0d6f77d6a933d485e7493e05c0c93765125edf73ebf95b9ba729e62349264e7e8b33d3e80196c97a2648eea198fa673619ade5669ba3ba2a6bb1cff751ed5419bbde2c2713c9a0e17a349749d0fd3f58e4ad76a7f9df032b79cb7dd2d146977ccd6a4bcbad71fb9d38ff27d5e351cd4e78247af097da8b78114cf592fa23b9813c4699005fd7d0738b78994d43864f06d18147b3b4cb983339ff10c7aea82c5616927581189771bbd982c5041cd0ffb056d34858f20fc2ce93890f7af7aac10a785ca6a6b92dd64ed46afc082472819a191470b91e69472dd34fd98acea1d7fa62c4e262b57f4a67829686b9b9e51fb50f2dac125e0adc26cb21a9f9c3444e28ae52057852a0eab4cc0db708fe1009564fc0ee56b707aede29b5e14e43ee2fe15695c0775a3d683c188b8c139e835d7cd1da6d7f04708a7e7b74df24f650f2f29bc649062d5a9d1a6aecffee7d9cfa6ec7797402878c9c2a664b1a433a2f36cab9aaf98d8f4f3799303b3dc5084674651e22a513ecb51ee42f6b94ec8d43b146d802de8022c2b01764f276005e163c345690d6c7da099ba400309b4fb930fccf5290ccc9404d91793876c630a219b9120fb5227647302b2603ed31a9eda725a5a02ee2bddc0b5f0810878c72d1dfe7604bf4ca1c7e525e096750257141ed704f7bf2e75710aacd5dfe674c1664ab09574c296666a75ec768ff3a60faa8c04d5039d50515dd3e0df3deafd9dc1f405644e82ebebc9af9a1a83511b64fc97b2ebb1cfb7699fbf229bbd144801a5909d48491901ee16fca6c08272ee8f4ca52e36e975693b6e9180c63790ec8c2a9a66fc5e99fea6d93f45f0d9b035361b8e63ffafd2f44dce028a1156b1a856bad6faaf82fb2f4e7e919b2ef28eb12a9d1f3dc5c10d168a5ee6bf3fca3989d82b0000 serializedProgramBytesString: - serializedSignature: a636370c4db371aeab71e3259dae1b12f045d3eff66cb0db5017284e66289808ca045a7597dbb2356eee90e94d542d2511f11b154367174edafe767e811cdd0e + serializedSignature: ea1ad3c58f950c18363118c6f89bd10d2ef920804a98dc4f212e7bb68211bc29ca48960732d3a85a3f95b0d4b23cca455a429cfd9294adf57a8c515162f4710c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset b/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset index 912338e..7aab820 100644 --- a/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset +++ b/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c59531b47109e058484b94f81c1181f09c4c648808fc43931604c7ce08044123b2e2c1b81957005b0cb7e4ce52595ca1fcabff0631ef2901f909f90aaa4bb77168d767b76b5420312b128edeceeecf4747f7d4ccfec889a84808f350a8765b128a6c598488b55b12db6e06c1aca4df8b3af9cfb0fc52e94eb70cc40dda8180a68899f61ab178ef370b527f6a1e54bf11cca1cd52f892c9ccf43db2c5ce1dd35f866e129ab0e1aa5c58c58100f44dcea0e20b14c8df6e43d0be5b26270bc25de406d9698c24e12541587c312d4ec51dd2630ed3cf7583c21b136a1ee39b4d9151b40f319518c0dd5083a1176119165ad2c916a3d7c07946b94e24f791d9525c2d1e06a7b4a96f5f27bc655dfa8b4e5ea9b6419d3d437cbb24153df22ef0fcaeb3a59b6cafb67e5758da41193e71c0e6db2ec936d87946b2c4fcbfbe7946b2cdb65d92febcf2bd7c08ff5d6eecbfa43966f5dbc76b878ed9465972cbb65d9239fbbe0a2f74b113216854bc422ebbd03f694113b2241443e10c5bb99d332d8c190743d1ef0334cddee8329ef0001c6cad3e443fb62524cb056de6735297c4fd331034fe488e8456f17bf7bba40e636e02fabb8e81edc9f230f4727cd41cd98b80725b67a2ac6c1e91ebba82c43b71be0e6599182e30ed17b0a6c7b9f0c1209ddd9dd661168dad16613ee3880eec0f50671b844c757c46996b89f877bfb14fbb620fadd82f235f5e6957d17ceb93e5312329e473ee8e8eedba1cd51d30c4883dc27c8ffde69e4383482d0d75f946e5897a028f1ab4713ef30b4830c06d37949639c20b30aee4d8804c5db450f82e165f44ac8dbb78df77571d557161e1954773f4990d7f0cf93a9bfeefef3f86ea450b44991c061c31a0810cd0f58a43762f57828f88b1089d425915137fc16073fa52a4b4708bffd5c8e9e0baf807a1a990a156061ca938293d7f0dd20e653c0c2063cb0257e101ebd24914894a0f50e9c41ece9c0ade1c08d1d35b8c1d1c40fdcd8815c7970f1c323d8a0413088071d82b51c82943d7f6714416fdae59cdd82b62f0089573496be84f65c9ae68f29a6fb575c98f27836129e436cf2188e231dc2751cc2341f59338a701aeed989e52cd5e6281b19a3b47393e864480efd733696f7696af79238f047bda968d49b09f54b4218e152a78908a38924ba5f0be382ffc227d2e0621e1d4343bc9e5373e3f10cb3a505229c73c58b0e446dbea364d83014e5d0a349f74f471c86f819e39c34c70590e17b61a7fa4ebfdb648ac89133655884728db8c0fbcf659ee1df97bf6eda0ff0c9eb26418b0eb321e6bde6a5c035825368f511de6a3ac96a2a8b679d4dc6b8708186dac5a54328d90a70b9053773b416b64d7697a1b669e06d559e7ba24a541f551a38bfc07065a58f297bd4ade0f9db6f3767bf1870ac3edf6450d79bb3c6449fa8c6d8e2646ca575a0338a533aa3e8e58ca29b8c624524e19b05e86d63c5108906f29aea7009c85eef0d63188d3a3efa383e3a143e5e5086be2a8da2740e9a741c9ce638e8629178209dbb742e9a755cf4735cb42a5c606feba0f5d2fb6ed1f53dc0f5ddacf4bd42816a5dae08a11ec2f4dbca05055a154e1d6150c0ba6da282f6143e24e012f96577bac13bf2203972af47b86016746edca653dd594e75e86c3b34b57d2341db2f2196b7737d22e921e14dbc7066eb21dea627dec111c7e7cf31305b1eca837aca9d1c6574fef34c4c4fa295e3c2bf4c02dcfd74eafbe9d2a9e422a79216f2a619f2a00c281a8d409d3384514c37d733f2ff1ea398da908ae9e19c954c61cba8b306e557388d7a49fe82e74e404e51dff98598c3e4acef837c6798f9047e783f1f263f9f10c1d96139b8d7c586b8ce9546d88815c2957a395b20cfcd19b505bfc973611e5dde05017c2757dc82c025d2fc15e1b72070585e75faeee3b44251ef281711d5f94df8c1f472d1488f0a7e0131a87f1d7aa775c1f30a133c45c8e0d9af73c5b1c3bae2806eb44970a3cd94d63055d8c628b3db06735801aa9b9432e4e4eb5dac09a6804fa96a294c70c28c696774f22539f9b20721d709956aa0b49774d0b0d7e875351af6fcc193f9f0bb48526441ae57f4f4989407379014ee6c59a67c3b773072bbe556676885357e682d430f38f50e83d3a00ea7710ea7b4619c705e360d5da1444837dfc61fa1c3e3705687c30487c34dad3fa839982dd71ee97f85e470f4bd1a60e9e590684827d12427d123839a9d3bb407e87d200c22e774885ce51099700d11d324ab2d9713eb52702fbfe0ebc7a7bb2edf2a8c04e775125cd3456dbe4f3552cf8a1fe1f10cc56ab4663da7fafbe58ada1774f25de7e4fbedd8a2d18cc81e4c8757c56d69d359b99a525c2457f1d34b914ff4f9343f5ca488c29f45d3f959a2b40b2d1f520bbcda13099a842645f004c4b98f7d6f829da3be5307de1c3cf9b821f41bcbbcef054bdd631424056723638a95a8d2153f1df4eea78a4a891c5a80344dba4f9aa41fa2566ba5566b1234f7bf5ca2350573f191da5be0e6c4a03d1636016745d6c2b9c20a35cf50c00fa41f3481b842049c8d3765d84b89463505c0acd20c680ffef0138dd42411f79b26c1095a7daa06b0feb6f2607d6c12ace2df8c55036c31822d1a7111bf5db64856dac62d6fcc6da551ee352d99ec12bd55770ca695ae4ae3fc13d516473c716824843d8d043a6a3e21e007f22426049ffecfc7ea248ed59f210803ced04651e3739351a347d8afcbecd46c0b1ef29b5c24ddfd1f660368434114192d46b85222499f325a7d7114503e97b6b8ef9ba31b84326a0aca9802e5944928e30150ba97310c8239680acc5605cc5b9504e6781582d9a180396d124c1ce99e0967fbb5ddcc27252d1f74cda6a0ab53a09ba99cf878ad0ae3638b02e5ac49289d4d2ed8f11a8dd90e6dccd48c011731059c5080bb7d9c36982e582f3338ac34988232a240396712ca41e1cd1c752f2bdcef948d427bc914b4bd0ab4772a27524e5461a46c54a09c3709e58084725d3bc351094ec1d92e2db81bb5d0b829581b1458bfac1c0bbd518516daa54079d72494c30c9487795163d06e874d81dda3807dcf24d8e798410b99d8a7df9b6d81d3d8bf423f6959418d02f0fdca090c57ab3030342b503e3009a5b38bde9be46fc947aa0f3c4b016fc12478ce4f4274a3fe1139749b29204f2b403eac1c8736b87664cc264f29507e5539505eaf4228db1428174d4289f3875707afa51e8afc8f468c81d6680ab45a05b4a5a388893afb5363a24147361613db152053950264350e2ef50a90e94a01d2e032873120bb1520974d02e9bce3d1a53b27e185595c01f3eb4a02b31a5f98f52b607e6312cc7049cf6415263d4d0a94df9a84f28c84725fbc10b8a9c5bd4ea4ff473a466dd45862d4a900fba852813518498d011b152766735d1211792c949d63233e938391c0f7f7f64eb5768904fe6f93fb0297073372b75b46d9b596a01f9a5e17e1361efbd30cde5286ff30acdee23d61a36c1a2cc736394ed2c36c996bf2d14a827e5e7a92e57f220afe174b341227435737622ec0c3abc4147e22ff01078515991a5b0000 serializedProgramBytesString: - serializedSignature: 36573cd6daf94bc2f003d8d0efe18d70e75060a221e23fc81452d720a25f665f6a867e1c64a7fb2cc980e620e1efdce571f62950faed70c78ddd9348f898a501 + serializedSignature: 37ab87aafc259e28ee941825244a144206e77d39fed5a8dbe0b3f3eb31e24c036f2d264185086bb420eec8d99de38e2fb96d22785961b232d15093adb4213607 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset b/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset index c257985..b381931 100644 --- a/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset +++ b/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15c5d6c0e7463aa8a820bda820512010124251a437a9d25410219010220122a18a057bef5d51b1a3585051ecbdf7deeb53df539fbd3febb733bb73efd9c99c7bef66f62cb3f9949f5cb69d39f39f337de64c4e0fe6fc97e8e6fc358d4d6243591e9bca4ad862b6c8f9d750e777a1f3c7bd92f727b225ce6f99f377b1f3ac1beb98e14bfe5f97444be7efd1ce55155bea7cb98ccd757ecbc5f3c9acd4f9f768e7db52e78adf9de7fc5feabc95a8e37c34950d6313d878d622d13c838869e2a32aef5e82c72bd1c0f97b085be53c2d154af1407a88472d9cbf263b4faac4b3858ed2f2bd196ca688d642e7d95ce79b25acc2913947486c50b98a897f30f76757efb78bf7dbd9f9bfa1f7efadbc7f37f0fe0ddfe7f779ec0e48f36e2e7857cadccdf9bfaef3ffafdef5eeee75bd26de7557f73ad14c91d108c8e8e6fd76f77ef3bc5f6e0af518cb393f0bfdd33debe9fdf6f27ef3bd771dbd964bbd0abcdf7640af76de6f7b4f8f0b94fb1dbcfb172af73b7af72ff2ae0bdddf444720bbbd776f27efdd8bc13bf23eff6de33d5f0bae9d74ca19e55defec3dbf4491db51797ea9ffbe649c90ba5ee6a5d3fa343a7730d4f94b458ed4a5b7f7febaec74cc91365aa48477b93fbcad3a79eff5f19e5fe15d6fefbdd7d6bb7f25b876beabd3d27bafaf771fda447f3f1fb6879faf94cdf604eff1e75729cf0700d9bae77b79bffd90e703813ebae783bcfb577bd73b78e1495bbe125c3b71ae2bf3eb60ef7e0710e7a119e2bc8312e73c4527f97c0090ad7b2ee33c04793e10e8a37baec6b9a6e5c530d7ceeacab24afe3666d995a58dbcdfe119de4f27a3b1f73bc2404613376debf54cf36e2e78578633d28dbf788f5f77f6d26d97d43be2df09573e2c0393f7eb7af7af51eed743eed747ee37f0df4f964b9d802e9dfcdf243a337ff9d3d9d5b3413745c6aede7bd7029da13cf95c2d13bb307f7d504ff9ae0bf25daef25d7de5bb5ce4bbdd94ef1a28dfede6ff4ede4f969f9d98affcacf7a3f77c947bdd60bf2c6c29ddb3bdbd70ba7ae15c07aef9efeedefdebc1354f8f7bbdf065bd30c67bde4d91d32dbd9c864dd3e8388ef9db23a315b6dd155be9eec9dccffdaee119c0cef97359b65dec9797c853e46df0cb6b7483f7beacb34678efc9fbe315bde4f3f5caf33c102e7c2ed3609277ff4670cd7fc721e175519eabe14d0069039f4ff4bf9798ec3dbf49b9be394dda6cadc459b6f736826b875de3cf32b0db27033bf93c2c76521ec64e3ec7d84df2bf57237632ae5358aadcaea3d8642f4fce2de05d799fff0e627edb1fe4cad85ada7c5d455e4feffd5bc135943b55793ed5fb9d067494acf74ddd13cfe53dfe3bd293731bb8e67a0df364d453f42a54c22d54f492f6b0095cc3f2468677bb12de7c9cbf949d2c63a7305f19dbf80feff9e4602cd9d4eaac18e427cb6ac02f596fe5837bd006bcbe4ec14aef99e45200d2205fb18d02c566f70fc6de178f319a784cd7c443d6a3bd35f1284a138f3e201ebdc1fbf2198cc70cefb7be22bfaf128fbe9a78c87e47a678c87abd9f261efdd3c4630f108f7ee07df90cc663a6f7db4091bfa7120fd926af493c643b6380261e7ba589c740108f01e07df90cc663ac777f10f3d7f9fcdac983db3555de1bccfc7dcfc1cc9f0fa59c0d8a9c379174977d8d5b91e743fdcf135e5f28314cd16398a2c770eff91d7efdabd5519b801ef23bf8fc52fff7c9b2ea3a70edc46ffbbeca7ba314fdbcf182649d25e56cf0cbe15d29ad5dc93af356e4f9de0a2759ce8f51f4906581e43416e1249fcbba7513d0437e079f4b4e6a1d389ef9eb40a51d9598c052e5b6ee7bf97c9d77ff40e4bd894a38139570f651e229dba1b3582aafc876c36c96cc5b3bc8b67a4ddbe6733cd9fb2b76e395e789fd98bf4dbd9f1bb7665efbb7d9099e9cb9def3e98a9ce919e4dc9046c712e66f9b17337f1e99c1fced93199ecc1fddef9acbfe9c6c9b1fe0b735292f7180226f835fde8e326fc83a6309f3b7f74a15bde4f3f5caf33c102e7c2ed3a08af9db9755deef5224bc2eca73353cd9be9cab3c9fe77f2fb18cf9db97f23a48db7c26f3b7cd67baec5a1c93815d590676f27958eca43c8c9d7c8eb19bef7faf46eccafdf6c716b054fde9c58755807b5ede620b5932dff769ebdd3bc80bf7c0d4fb095906c9b6ce2c4fa7cde0da499b96726c47a7e322ef57b64b655e99cdfce5f86cef79a526fc83411c64bb7409b827dba5c5e09e0c674e2aae85777acf167bcfe682b0e0fbf2194c2fcf0e92ed52f97e89128f922ce321db41301eb25d5aaa89c7bc34f12803619582f7e533188fa5de6f7d45fe7c251ed23e6b120fd92e2dd7c4e3a034f100f69b2807efcb67301ecbbcdf068afc0a251e1506f190edd285ac7a3c16a589c76210d642f0be7c06e35147915bc9fcf57ba5f75cd6ef07337ffdae7e2f9faff3ee2ff73f672b341c56a6e2d246f6276bda0e90fa1ce285b1dcd3e74e70edbcd336ddfcdf2aef5796e52b98bf7e5ee1c938c7d5b9edb3feb0132b99bf7e5e05ee43791bfcf2da3de8bd2feb98c398bfcc5f0dee43b9877aefdda55ccbb27b1beffe2aeffe95e09a877b83ff3d26e54b395729cf0f57c2519f1fe1dd4f373fa1d6bb52b7cd7edddacbfa618d923647a66ca6c393deef0d8a6c69b38728b20ff164cbfedc518aeca353b2732722b265bdbb5a91bdda93fdaaf7de318aec6353b23b35516463e97e9c3f6c34fdefce90fe872be97fb8ab6b872d91fe32bf2a6925ae75fd9423bd30a5ec5b14fb59c352e5ca1af02eff3d92f9f3ef91aedc5d5ef464d455c2389af9cbf0a315b9c728cfbd344e1c0574f06c2a71acc2fc5837ec8e2fbae1ee24db2e32ed8f57d2fe78701fea7812f3e779797db32b771759becbb43f4ed1e3388f81ecbfc9fe8f1cd792e9b03e837ef2bb3ce5f97ae5b95ca771a4ffb9649afcfe0425fde5f71394e7aafc1315fb90f2653a9cc8fced6af9bee4a6c6e724e5b90c4fb6bf643a9cacd8c2c98aad9cc27cfdfaa4fc9395e752fe29fef712a7325fbb3c701e3d1579aee651355ea729f13a4d89d7e9fe7825399fee975b2d7dd780f475ecb4a32cdfb17240b633c228438ef5743883e9cb9033592aff9e09dee5bf67317f1972962b3757aeaba9ab84718ec2ef1c45eeb9caf373bddfb3810e677bbfe7317fde3dcf0dbb733337dcceb28d29f3e8054c5f865ca0e87831f39721f2da2b43bac8f94a59869cafe871beab47172f6eec543f4fb40c51f593dfe529cfd72bcf651972acffb9649afcfe4225fde5f71394e7aa7c59269ca1c897e97011f397211729dcd4f89ca43c57cb10990e6b155b9036266de512e62f43a4fc9395e76a19e2bd97b8949995219722cfb13244c6eb32255e9729f15ae78f5792f33abfdc6ae97b26485fde8e9a0dec8dba0c916d81cb99be0cb982a5f2ef15e05dfe7b25f3972157ba72bbc93185ba4a18572bfcae56e45ea33cbfc6fbbd0ae8e0a559e25ae6cfbbd7ba61efe68d7feee68d7725f3e8758a4d1f0fee431d6f60fe32445e7b65483739df27cb90f58a1eeb5d3dbaca798bd3fc3cd13244d54f7e97a73c5faf3c9765c8d1fee79269f2fbeb95f497df4f509eabf2651972b9225fa6c306e62f43641f507253e37392f25c2d43643adca8d882942f6de526e62f43a4fc9395e76a1922ebfd9b9959197233f21c2b4364bc362af192e3b2325eb7f8e395e47c8b5f6eb5f4bd02a42fefe749bd4cca1075ece156e61f7bb8d57da7db9b69649dce7cf69fb88df9cb8cdb5c19dd9bba7a771fe50f3bb189f9c71e4e07f7a1bc0d8abc7b993f7fddaed8e36a701fcabd83f9f3bfbcce66cc1d2b6b65dc37b3ea6b3e64b877325ff99bd80ceef3dfbb146e77b9320ae43c715d45de3d8a9ddda3c8bd5779eef14adccdaa8d3b2665deaf7c73bf22f33ebfed26ede6f6944cf10ee09e78c0fbe61e70edc4ab475ffffb72ee1b7d7f3ed01f7e27db3e323fd453e2f4a012a7079538c9f4dfe497cf649dff90629f6779bfb29c7bd86f0be25a7ec77f1f51ecf711373e3d8ff1bf971c9f79d47bff5e70cd7f1ff3ee5fa3e8f798a2e77dfefb0cf411e437320e22aeb00c9571cb03d7d0ced5efef33fcfe41c3efef30fc7e73b0ef93e15d9de1fd3b3284776b0dbfbfc3f0fb070dbfbfcff0fbbbfddfcb3c98ace3241faf8eebfeadf7dca48e9365f3132c950fe4fab7273d39d7816b276f16162aef3dc17c6580b8867a3fa5d8d9bee03eff7ddc7b7ebf22f77145fe7d6ebc0ba7f8e524c351e4c8efd93445ce03ca73b81631e85af583158e4f337f3df5b4c7ec5b57f7de727cd09b87493ce36727e589fb50de06bfbcdeb3fd72189823d2ea2bc37b4e49d3e75c7945772aefbda0a4e90b0aebe7151b5b02eef3df679534957a1682e7e09ac979a607150e52de8b0ad7173dbd37fadf4feaf792dfe6a49ca4dc9715fd2bc177503ff5fd07dd742c926dbe259a78411b947232a54f3a1b93f3e5af001932bc5759f536d502efd96bccdfa67a15dce7bfaf2b4c5f7765f4fdd093535791f726f3974f6f2a72df529ebfe5fdbe0d74f4c6b612efa4ee89e7f21eff7dc393731bb8e67ac93e4c3d45af779570df55f47a8ff9db30ef79df2f54c2bb5d09ef4e458ee45f37c5483e4bdaddabcc5746f71906bee5efc9f9ea9ad8c1d95e9af4cde2dd73dd7797cef6aebd31c67e2bddfbfd4e4923438e6dbecffc65c0fbde736fcf61e203eff943e01ab2f890f9f3e087feef99dc43762fb8e6bf61ed5bfc04b09671fa4889d327e03efffd94f9f3c4a72eb73d9a2a72e477fff6db56721fa3fafc52fffd24a34ffcf6d27fb6261c583fb4378cc7938a5eeafecb1aeabd87acd774ec3b98e9bc67852247eaa2eebfcca4e3bb196ce123fff74ceeb39475446be5796bbf7db336caf336fee7897f79d70f836bfefbb177ff11700def3f8ab34dc6b9adc2f03170ed30dc4bc65d4de7ff28f62bc3f80c8421f5f95ce1f519b8cf7fbf50d2ef0b2fec4d8a1cf9dd7fbdf71f07d7d0f69e00d75257fefb25f397d75f7ae19ca2c8f9ca7bef49bdfd249faf73ed23a9a7dcb79307ae811d0d58eb9783d9db00594ecb7916396625cb35d9f659c592f54a5bb987f742bf6ced3be9caffb54c5bfe0ff4caff81eb582a0ff1df8b58fa7a49a6f9d7ccdf7efcda93ebcd7f0ffcb58672bff1e43e05ae1db983725db983e43ab34bfcdfb1cb525cc67e1830ec758aac2b52b206c9fc727996b2d2a5c5765e9cbe4dc910ff76e2377890f78eac5fa42d7dc7fc654f5b705f7ecf9f6f56e4c9353092c1e519f496e3aedf337f5e916dce1f58f536e7ef201ebf2bfafdc8fce5cf8fae5ec3e4da8cf6feef12bf327ff923f5f91ff39701bf82fbfcf727e62f037e72c31922d719b652debb5e796fa312de1f4c5f56fcae3c5f873cff93f9dbda7f02aefcf71725bd7e71f5189aab70cc905e223d60fafcadc8fddbe32deb6395f76f0a6f6f8c322701d2f437708fff323f6b71cd75e7f59293578635d3879593e30f2b672be66b7388e7f23e168e8c5343f06ffefb17b8f7971767b936aba3a2471d4feed3e05a7e076d43ca59efff1ee681643ae5816b50e60fbe137c03d349e68bcde0da096b845c2fa1e67f696f6afeff43b1ebcde0da91373c68fe6feb0f37d9e6b94c09179603f29b768a2e6b155de4dacf8e8a2cf9fed3fef74778eb1ff85622fe3b62b6468734e1c9f793ecdbb2ea6dd09f99bf3ddd16dc87f97403b876648f94ebb0aff4bfef4b17fedd33e09a3f977d25593e5c06aec1f39cbaccd797caa9ab3cafc77c7da51cd9079673c3cefba33ef4c735d9bf9271cdd47e958c24675927acf39ecbb25296d9729cafbdf29d7c2ef7367554d245ce83cbb1916b98bf7d24fd1aa46b1fad47c296f5862cdfae03f7e17bb21cbc0b5cf3f7353e76927a67ca4be9da001edb1ce92fe262702dd3915f37f0db9fb876ec6ff49e69c2b85e49f71b809e72dee746704fcee5dd948aeb4ab97e7a039025df977565fb2ce54fcf427e7bf0be5c73d1314bf9b76621bf63ea7dc938a721ab561ee43452d2a321b8cf7f1b335f5923aeebb85b837d72a45ca54f9abc9f07ae417db177651a1ddb1bea28ebdd264cdbd74fca91cf2fcd4ee731b2be4f67efb7336dff63ccafeefdb132ade55cd16d2c7dde927191731bd7816b47ee586f5df7d89501e5dee197afed4f5c9aa5ac743cbc3236671be66f677a655cceb629d9e2dffc9957b7e43465be36b5b8aee3bab0f0d9a0f75dce76ccd716cdd90e84cd7fb767beb683b876e48d9363da9b153dee4a319928d717cbf9824bd33349cac803d7c096c6c93d945767272f2d63cf2f8b6a73e32bdcfbe3cf51c2ba3b4358f72869b403f3e7b31d3cf95f06942bd3a31948f366aeac093d95b0db82e7b05e90efcfaf61d8cd99afed2baeb9bc8d4af84d95f73728ef7f1630fcfb14f9e96c2b93ac2cea5be6d5ef392d983f4fb460a9f29a5fefc8fc796247377efbc879abf68abc564cdf8f6a0dd2b415b8c77f5b327fffa6a51786b76f649f0390b0daf8c3ca916df44bc073791f0b47c6a921f3c74fb6a364fadd998179474537d9c67c1a5cd7715dc50492bb9dfbdd6469cf32fd649ce4d8ff2dcaf3bb94e7eb1486f27b39a7a08cd327bf97cf95366bf2fb8efe7856e3209fcb36ada27fb576c14e4c5b2727c3db29bd3ed5dad0583fee0ed7b626bfc9b4dcaae9d51ed12b13a7bb10bd32f539e49a2ad9f6f7e6e6d3b6fd1ff47e1f42747b0e5cf3e73abf99727c24935da62b63bcf1fa1ce9abf23a70edd8f2944fdc30a7aa75dcc319c294727761fab642a7d4f7e2dfd06e3a337f5ba1b3abcb34c9ac83ffbb9c5d99bf5cdc1584cd7fa54fb8cde09acbbb402f4fb5a78ce92fd773c9f497ebb2d2a5bf375fc09e50e292aba4bf4ce374e99f212d92f1ca03d7a0fd32558ef1679bb6e9ecc91bfbced94db1a7dd5ce6fb16ba61ee7b8012e69319c29472a51f3ad59eba027beaaad893f469f718b87674993e5f912dfdc7296302525e4e1ef3d76179e03bfe2b7da8dd0eae9d70f657c66393f2a41faa5bc0b5b43f7e9def3ddf08ae1d79fbfd8ac8537c8ee578fea472a49fa8e7c135ff95767e1db886f283a68d0c1f8baf7cbe8e6597afe4ba2199af9ef1a7b9365fc932fb39256ce953eb39708de5ab2cd349d8224ca7cde09adbd720e6cfa7193826ed360f5c837cbaafdca7976dbaa4cba72f316d3f63faabeefde97f28613d9f212cb9b64ada5611f3f7338a5cf933a604942bdbfac0cf98f83797758112765bf01cb6f3e5fb2fd6306ce99fec7a70edc83ba0a5127e53e5fd0dcafb130386dfd1fb5efa21bed81f5e8ee7a72ca7bf125e7f37bc99329fbcace829c76307305f7ecb19a03cdf8bf9c773f7529e4b7f62f7826bfe3cc8786e47254ed2d7dad3e09a3ff7d22e47fa587b015cf3b8ca3d0132af65c936c944aecd93e547867510ec15e62f9b943554dab2295bddd2e5dbd7993f9f0d62fe7c36c8e571a05c8f246dedb5ec78e40c56d2e775709fff4a9f6d1bc0b513deac6e350b2f191fb9ceefe934dfa4e3a2f61de47ab8cb6a28ef2d85f35085f35037deb3ebb8693cbb93f25d5be5bb8dca77b2fde3f5b9d99b197875f0cbcf19c6fc7592b7462fd97618cefc75d2702fdc5783859b942bd74d3e9f46c7743cdf51788e50788e70f52b9ee2f22c5eaa7cd756f96ea3f29dccff325e70bda64eaff68afcb799bf6f1d347e723da68c9ff4f1b7165c3b7acef1dabf73a628dfb555bedba87c27d73acafcf56e96f6e2c9176716407b917bb47a0379fcf98b6964a68bbfb76e326734f3b72947bbfacfede6c67bee1425dcf733c443ca953e0ed576ff98d4f739d2bfa16429fd1b3e06ae1d5d4a643ddcc1ff5d8ef467780bb89661f3dff1cc9fa7c67bf27295f033c429f95e1eb806edbcb96b02324a972e92d304c049fa5f939ca4ffc4c7c0b513af52390fd1deff5d8ef4a7b8095cf3f73ef2aea52fe7dbc13597375109ffc30c9ce47b79e01a702a91e37ebdb3939796935c07f731b03baffe9e23dbc2ef2be1c9b5901b6b18a6b71690fd1bf0f3c22c91e3fc1f2a617e6a18a6b7973247fab9be1c5c3b6934cf6bffcffb2c8d2cf94c8e594c61fe7ef317e03eff95bea99f03d7fcbdcf53f15d21cbfbfffa658b756dde3b0327a6d1498ddf34257ed3dcf8956d7265953d9946d6977e1d72f655e2f715b8cf7fa5ffcde7c03516bfaf95f86d4abd33265dd9abc64ffa14bd1c5c3bf19beff9ff9abf3e8d2cb9e7ea1bef5be95754c6ef3b709fff4adf9dcf816b2c7ede9c4ef920effa7b7f58d5e2ebfc96cb75293f28ef3e927a774aba7a5965237d915e0eaeb94e1bbdf01e4d23eb27eff747ef5be97b53b2f919dce7bf072a6ca4ff381d9b5ffcb2c5b889f7cebe75b2889f1c2fd9c90b6b364b8d8fcb6b58e64bdf941b35dfcb7252b69b7749ddcbf17c581e24cbbd5ffd72b57d1bd95fdad9933147d16d8ea25bb1a21bfcbe2178c7d163815c13e7ad7f49dbc7926b60e4bab9594016ff9deb857b17b8c6d22b5d5a786c724a3c792f816b47e78ab6aeacc5728cf14fe5bb52ff77c9fbf3bcfbb2cffe37785f3ee7bfd287e55de09abf2fd714f2f12ccfcef96df1976cf3ca79bef99e8c57fccf73c0fe1ef18e139f85759477ca59aa9fe884b550f2ef0d9e7b321239fe6fc5496e9e8e959e6e8904085b7ecfefcbb680f4757937b8c6e22bd79dc936b08caff483f98aff79cea294aee21d1edf1f957716fae3bba881125fe00f3351dfffad36bef540d8f27b185fe913f36e708dc557ead25189aff49bf98aff790ef0e729de71f45bf489f28edccb28e3abac89cf017e42138dfcdf6ae3db10842dbf87f1953e86ef06d7587ce5f94cd47929609990907944f25feac9bd135c3bef54caf6815c8b2e6562f26599b90cbc27ef2d07e9e0859f237d795e0cde91f7f9aff405ba165c3bdf1e3c5b9123bf937e305f05d7309ed297e59de09acbeb0bf4e6efe7816b38eeb85c79be1c3ce736b4c62f2723af74e576734f96f4917925b8e63a7beddf25722db35cdb0ecee84a7873a1896dd3eb91f0f6b4e71c0edef3c24f3405ef703dae529ecbf54f572bf7bd33e672d678cf5f03d7fcf7885458399eafc99cc3c0bdc3dc782ef1d6192d79d7af6bb20d25fd7dbe0eaef9efa180835c8b057c4c568b9f5c2b16347ec728f1f3da00394783b81cedfd1e09749267ed3503faca77f8efb1cc9fd78f65685e4f7e7b1c08f33897dfd2068a5cf59d1ada4c56b62bfd595e09aeebb8ee9fe17bc9f74f007ac835502af71dbd77a56fc9d7c035ff3d11c4ef44458feb153dd4f9e4f332c459da9cf45b7939b8e6f2e6bbe9b24cf68fbc753fcbd678f7d5f53f19c2cb91fe2ddf00d7520f7e5fae33c9cd4e5eda34f3d668e5489f9757826b270ecba5eede194039a781b0e4fa2e2fef25e4faafab94e7870319bae7417cdf4a7da5cfcc2bc1b5a3ef0a5977fde5dd3fa3babe8996e9f54db4023274cf5bd740df33157dcff4f495fd8b96e07e43ff3b2be5dcc5e7defdb30cd2e0f310d240f7cc1bdfce399bf9c757cf76e3b0aa5079ef1ce66f03c8f124cf075b8ef4f5b9165c43393729ef4b7f9ff72be19ca784779fffbe58cb9e2eefdc90e57bbe7b7513a28d328a95b262a789d94374307663d91f5b2dbfcc7c60b5d8ff257671317e72350f76a9d3f1ac7404684e8d9e2acea45eca0a582feda9d1ad443d20431f2afe2e76de281742dfcaa916c45dd582e0ca55387f4ac191d755cefd91e2c46c7ee875b9f3248f8d757ef957b39d626186f3c72f659a136c85536394b229cedf9542de6c47edea6f668a123f1e5bfd669223d33dbd7ba1734702ad74ae2b848693c5dfcb85a6a542fbd1cebda5e22cf145ac8c0d717e578ad0aac77d89f36f5d98533c647a1df5877863f7dda3c265320d7362c3b5ef216cf19f14d91229c2d1d77bcbcb87757a881eca49d552e21f866e21c30740467b32f205b284ef5e2fd6438c914caa4630781cabc7506fdf2eef22a7e39a2e2e7a323cb9db8818a452b8418767d60ffbf3f33975fd512b603dc4d04adb0c514b0796cbcb152de22051a85bb74e4faea88a3fa1c32f8688264788df7daf5cbc173c01ea89cacf9f00a28b35c5f9c74ae7ff0a11c42a47fc5c36d1b92a76fecd5595655eb554eac945d617a0ab57a39994c550e7e8508b9eda942d62e9333294727ad80d92b148c1ee21da462dd3982416966834e5782d279969de1c57d8678f9efd2eafab4f9746225d6a121a96325be952a651d4992073a99f2e5d1a27e3954a17fe9f9e6113c4b633e98011aca323d878cbd836d7bd66b6cd8799ba2b0cf5fcb6496b83e934c008d6d51114e33253232438c1d1f020afad583386db66cdb0a960d8aa5aecb2d101a3584f43b127a7b89d4ead868a5ac245b45e707d4cf0f686821b6082773014dc5067505b479d25f9b3c5424ab1f36e7073e2d57857b558d3db5373244f665601b3a646bab4e10877d46aa5264e733c711a63925b984a6e82496e692a796b9d418951f6e85bea35ab237959d322eb3ab2354bd7d00e5a436ea3a327f66e1f404aaffa0092fcd710e7dbf90e87e562546099f3bd6ec0293dd1365997f66d05cd8e4c370c164c238cf0b63acbe7d8db61c9ae1a7f6bdcf89b62c2db6b84970414be1d96673b68f26c22489edd5e279983ea984dedd21617bc0326782743c1cd30163b9b965fcd319577315479474ce54ea62ab7c054ee6ca8724b4ce55d4d556e8549ee622ab93596057343c8df6d30e1bb8520bc2d267c778df0bf9dff82086f8709ef1a82e6ed35c27b88b230ca5e091c71a959afa45b321e60d44214bbd5fb1fd984e66dc675ffab8f0c54f01523ba0e4e360160955c075d6af3d6640f5d0c45f15f935e2adf44ca7b26a2635fb79ac56c835b4c479dc588da625a8416e36ff3d7cc66f2754445f5d4ba5a4cb20baf97a49a1054b54653208ca6a6216066b313564814865048ec8c09ef1d82f05d30e14521949d9d74c62ada09b3498d55366927b3616c8cf3acd879bf544c11f1fb70887ab00821d50cf67f91de80f9cee2ec1ae77d85d175622c34cd3043ec8c2567bf106c65579d70de89ef9f7c3983ad34c18577c134df43a3794e40cd7375c279ab89ef2036ea01ec863119a061b246a7761a26bb63c2f7d2083f23a0f0ae98f0811ae1eb020aefa611de4334e48f8c24e7675a0332d289190f0d0e86ca70178b897bae915c0430c9f99d27b42815935ca559ac1d495f760c629aca4f744786835262cbc762b0a34d23d1d1d1976c4344c96697ce58d9d85d67f07ce07928d34c70f2d6eb2caf29c7c35f241e4d7442e0a9c9ef973bbfd5f2447d3c4fe46125dc304d09970858c2f5d008ef21baa18bb668861beefcbd4cb4a3f8bf977bc93b45849d9ae335c94adcf8da696a3651bb698d768430da5e59186d18da63e6d8132b7f476acadfbe8960e56fbe4e38b74dbef53be3c8461a23ee85091eadcb4475c483e059a500cb2a7b6bb24aa38059a510133e46239c0514de1b133e56233c687bba48279cd7aae334d5494f5e9df05dea39c2e82708a3e765d0542f415609f32e1386cc8b015dc9cccd1b7b5f66c071ce6f891364856897568bcf103c3e7db0f84cc4e2b34faa3e0a104e5f2c9c495838936b144e3f2c734cd1650e6e15b31cda8b7cedfee1c91a274886e9af0bb929f38e225463b81d73cf14ac97f0cac9bcfad5e3998787b60716cf7d75f1e433a595be9ecd12c78a82c46e4f2cbcfd74e135175c673905ec2ce75216dabc182a617cc1127fc657de2e11f61e448f01981efbebf4d81ee8315f0c2b9478156ccd35d80bd360ba4e83665a12e3bd7c5e732d06625accd069b12dd0a258a47d9541d883b0b00fd085bd35087b96684d96798bd282e6b0c1581932132b430eac511932048bdfaceccb90b1a2f5bc3c60d53e142b4366636548b14119324c171aafcae7b0eacd9f297583357f86eb84735be03bbe8d66494660924b4c258fc48094ea80d40b066414267c9e46f89e0d82091fad13ce2d93efa5356d50edad11de43cc82f15de2741d9b74ad1e7f5f35681b297d7786ef77cb6e5491c73f37c17bb574ba629d9731582975904efd0085d058ac105a908de034e5cd389d609e032a3439a063c3603960bc4e387f7fa1a6e8ec21665a6bb6308f77e6ebd59125aef39fa6d04db3686d029653176b72ea560173ea449d709ed4dc0f40b59a8b27b4aec7d191ad766aebc39c5f77168f2ff7e0ff5eecfcbd44a9bf3b8a652c4b5977e7779ef3f712d1ca2ae30908da3b5c62be90384fe4f585e23b2edbb57dfebc97f3bcbff35be0fcee14c860f7c192fe604dd2f7e4f89698a5e1240c73950ef3ec5030d71c6647b6c229d2dc02b8a3d20cee28f6e99438f7968aa7eef795426e99d0a2caf9132c392663d97ca9269b77da2658369fa2ab8bc4d2862897e8f1fed312d1d60b3ee9ba2cebda6539d32fcf4b1f3a565f4cd5250b27b7229b627d399e24d3744922168444b9b7401d320996282bb34e94554cbfaf2053f858b2ecaba32756bcec1321bd6cf6b9e9c91d9235b9d5825cf36ab14abb150ca1b69fce983935e11f4351a75c578baec60d7a7fac003b4c53807d19b0009b8e697eb846f3fa01359f81697e8446f34ddb06d3fc00acd65ba3abf5984ef534b5c64c4cf52335aa1fda3498ea0762c28fd2087f738760c267e984f3161df78f62daf79a8d093f2604e1c598f06343103e47279c37b98fd39518aae0725cf05ccc0e8fcf46701a132cc1ace4048d95dcdb2c989594ea84f3f74f64482355b882a97923751e86e9645d76e5dda7a08d545e19d9d81f28c3509f82a13ed50cf57c0cf5693ad47342431d9f3e413996b54ed764ad175b04cb5a0761c5d8192114630b30e1678620bc022b23cf322c2317ea04f3f439dbb08c5c8425e439ba32b265b0845cac13cebb28e766a3759a2e4a2526f83c43c107eb0473eb383f04eb58a213ce9b8a1764a3759a6662159688176a12f19856c112712926fc228df0b1ad83095f8609bf5823bc599b60c29763c2d76a847f1850f80acc522e09c1525662c22f0d41f82a4cf86521083f44279c0f1eaccbc6c657e18257eb04f382ed72a6a993f93288a075f252af7e2dab41c32758ed792816972b7471e10f3afa420d12d661585857eac282d3db73ab4d75d47c8af9704c8bab745ac069fe855efba458b0afb90647601a5cadd3a0118393dcfb0acb581ab06a5d83153fd7e8cab6f6c18a9f23b14c7c6d0899f8284cf3f51acd2b036a7e34a6f97521687e0ca6f9f51acd9f0da8f9b198e61b42d0fc38cc3e6fd0d9275f8c38c32bcb663a65c30caf1ceaeff50bdc7bfb89dfee6c2fe7efe1a0cc9a2b045538ffe2cb772a9d7bf345f9b2528c33968abb2501cbb4e331fd6fd4e9cf973ba534925b303a26e3d4df8bcf4ccddc895b66ab7d9c85e28d2a6f0da9db5b72e357c5dc31d355e2cb20713a4117276e2037251f281dcf9b9dffebd567ee7f79ee7fc1fa9e27eac2e446b651636475021ad94998f05b34c2eb06147e3226fc568df07a01859fa213ce41dfa633af4e59650fb7ebdcc3f92df4eeb9596535ebedbd5be4fc063198533183d98419ccedc606731a16e61d58989b8dc33c1d4bea3b432809cfd009e74d48ee2ad2a409792646ea6e8c143f91be5e5d482a18a7b3304ef786c0e96c9d705ed7ddc7aad77585fd82d575e7e884f398de9f4d22a45934722ea6f5031aad6707d4fa3c9d70be94ec4166b894ec7c9d643e95fb90ce76f874223ff539f85ac50b303c8f68f0341d180ccf8598f04775161350f84598ad3f1682ad5fac13ce93ebf16cccb12f2e782d86e4099d390644720926fc498df0b1838209bf14b3f5a74c6dfd320cf6d386b0d7613c9ed1f0b820208fcb31fb7b3604fbbb0243f29c21922b3124cfeb4c646430245761485e0801c9d598fdbd686a7fd7e824f3b2f6258694b5fc449ae065edb518fb5734ec7b8e0ac67e3d26fc558df0b501855fa713ce5b74fc98896aad614e68b0d3f571bb751d7d3b47520362c52c359c15a4cd7b3d16d1d735113d6174b0886ed009e703fd6f6493efd20cf4df80097ed350f08d589e7b2b843c77934e389f41783b1badd3cc20dc8c09e6e7f9aaab585aebb44e237c236621ef6a2ce4b38016720b26fc3d8df0517b07137e2b86e57d0d96e601b1dca613ce0b507e56aa5101ba492799bfff61366692a6b6ba1d83fd9106f6876382c1be0313fe2f8df0b5638309df8c09ff58237ce3b860c2efc452f213d394bc0b2b4d3e0da134b91b53fbdfa66adf83a9fd9f10d4be174bcacf344939657cb0a4bc0f13feb946789389c184dfaf13ce1b365f30a461c38fef0ddeb079008bc4979a48749b122c120f62c2bfd208af0c28fc219d70def8e0e7fc566bd870239924de5a2cc692d5a68ddba4294f6e53958d9d20cd9b87b14cf28d692679442799bfcfcf133629a51fc5ccec3bccccbeaf91993d8659c20f3a339b16cc121ec784ffa833b380c29fc0ccec279d99b517ef2d724cac582c634e2da50adfdc9ec4cced6753737b0a33b75f0ccded69ccdc7ec5cced7f3532b767308bf84d6311c7ec1fcc229ec584ffae11fe6440e1cf61e6f607666ebc548bc2dc9ec7cced4f53737b4127993701f82975a64d801731b5ff3655fb259d646e077c05bc6a07f74e0f66072f63c2131ae16d670613fe0a960d73124836dc2a51936cf82a16893a9a48743c3058245ec312b66ec230615fc7ec91efb637b5c73730e1f54310fea64e388f69838459c1fd16a675c310b47e1b2bf31a65a3759a22eb1d4cebc62168fd2e667f4d4cedef3d4cedad4350fb7d4cf8362108ff00b3bf6d0dedef434ceba62168fd11667fdb19dadfbf3013d9ded4443ec640ef6008fa139d605e6437d314d91feab44e53647f8af1686ecae3df5812ee689884ffc178b4d0f098322f188fcf30e12d35c287950513fe3986a49521922f30c1ad139a26aaeb500c36460ff19689f26564d2db56ff1a3549ff8bf16ba3e1373f20bf2f31e16d35c23bcd0f26fc2b8c61bba00c5da7d97c48a3660cbfc6a2d95e13cd5101a3f90d564c75302ca6bec5b4eea8d1ba4e7930adbfd309e70877d2254ed36a89c31d40cd73beac59827c8f456d674dd4fa068cda0f98f05d34c24b020aff114bed4e86a9fd13a675675d3fe2a0605aff8ca5f6aebad4debe5a6aefed6445d7894f490d53fc172c7a5d74d540c0e8fd8a09cfd508ff23a0f0ff61c277d3083f664130e1bf61c277d7087f31a0f0dfb154efaa4b75ee2d76182b152b8ff9fa7e77b4e510afd05d28be9f239e0df5561bf31d08033c5be8268ae9c56c2e5be0ed1451df0a3a91fe8746fb1ee23813bedd6dcbf91b9eacf02966f254ee494236776bb5d4d8e770b7041f90f027510f717648a1b8178d8e5d13aedb9f650e37975c156f15727f9b731cb5b9d243457273f8fc3fc48977f704cf8b516a8e79d6f813cb70799a0c774145b00cf71796e17a183647ffc604f7d4e5e476a2fc76dd88ab3c6113aa1bd8572d93b32a905e2c81d0ccd7d03c6161309a099d70ae4c2f5da4b94367be2dac4a734cb4f4475ae53c1fe08b3e2f1e1625efe67b77170933ab105bbe96799b44dc377a052cc4723040051a407b0604b4954eb83813268401833a3ae17c4550ef6c6c39cd8aa0ba1892220d92958b8221a987d94c1f9dcde4a7b199d14eb112bdbdd4c7e0f4d5c0e916104e034c783f5d57727130e10d31f2fd75e47b28e4c7fa9a0e51536f8481d943371111104c634cf89e1ae19f0414de44279c8f360d301d6dda5a2799bfbf976147671b4cf04043c1dbea04f3f99c41d9084eb351a62966da8375a6ed1eeb318be58bbdb9a902a5e67b75b7c3c21fa20b7f1b06f7ea8e627c2fe160d07e0b12f2f658c8437521b7f0858c6bc0eff2366eb09ddb3b60f96898aeab54152c1f35c3223a5c1751ee1177025b213ac44b9c08715733958c6f249dcf4a4539c61b593c8a078b0fe4564dd859529fd6ac93d41cd37b844e6fd74fba5bd6f29b66c6b12316f6485dd82d7dc6914e879a99470b4c9b513a6db8ddf8fd99bb1b6a8384d8120b71b42e44e94aa057c8ae045a615aec8d0ded482dc27225d01ad3600c6e83d55d090c175e3f1707f499df06abffc69ad67f6d31c9e34c25b7d349e65e91c667534fa5f18ad41e537982a9ca1d3095271aaadc11ebc2ec13421766274cf8a41084ef8c59fd64c3befe2e98d65342d0ba13267c6a08c23b63f637cdd4fe76d548eed1d1b94c70ff6536b8e897eed4c373d3bfafce8eb4a36bfb89d135dea5a2d5171b53eba24b773e65b47f365921cde6e85c4cf07443c1bb618267180ade1dcb0207986681ae98e499a692bb61920f3495dc1d933ccb54721e568ecd0ea11ceb81a95d6caa764f9d645e8ecdc9c6ee783e4704e7eb04f3fecedc6c04a771d9d00b035d1202e8020c47a9218e422c7fcf33ccdfbd31ce65869c8b30cef343e0dc07c3516e88a32f26f82043c1fd30ce0b0c39f7c7385784c0790f0cc742431c7b628217190a1e80715e6cc8792f8c7365089c0762380e36c431082bf9979896fc83311e5521f01882f1586ac86328267899a1e061188ee521e0188e095f1182f01158bf6fa561bf6f24667bab4c6d6f14c6e39010788cc64c64b5a189ec8d093ed450f0180cc76121e0188b093f3c04e1e330db3bc2d0f6c6635aaf0941eb0998f02343103e11137e5408c2f7c1841f1d82f049ba318d9d9ccb0477f81efd9846188733a71fd138261b2b9d80139b8c99ffb186e63f054be7e34248e7a9d8d8e9f18663a7d37406b43337a0795bc480e80ce784ac87c24e144361bb337c28ccecec717d4aecab4b629e12276593c427e2fdd8fdb036c1c9a66d82fd31c9a7984a9e8e493ed554f20c4cf269a6920fc00a80d343280066626a9f61aaf68198da6786a0f62c4cedb34cd59e8d0dfb9c6d38ec538cf566cf31eccdcec1409f1b02e8b9188ef30c7194602de8f30d5bd0a518e70b0c39cfc3385f1802e7320cc7458638e663822f36145c8e715e6bc8f9208cf32521705e80e1b8d410470526f83243c10b31ceeb0c392fc2385f1e02e7c5188e2b0c7154625a5f1982d60763c2af0a41f812ac8770b5610fa14a279877d6ae31ecd32cc534bed650e36598e0f586829763ed82eb4cdb052b30c9d79b4a5e8919dd86108c6e15a6f60da66a1f8249bed154f26a4cf24da6920fc5ecee6643bb3b0c13bcd150f0e1188b5b4c591c8199ddad2198dd1a4cf86d21083f1263b2c994c9513ac97c51e0edd924635b5cf0d15833fa0ec366f431d800ce66c3019c6331c8779a423e0e937c97a9e4e3b15c78b7612e3c0133e77b4230e713b1eafb5ec3eafb240cc77d86384ec61a77f71b36ee4ec1347ec050e35331c10f1a0a3e0d43f190218ad3318d1f36d4f80ccc961f09c196cfc4843f1a82f0b3b082e331d382e36cacdc7fdcb0dc3f072bf79f302cf7cfc5cafd270dcbfdf330c84f99423e1f93fcb4a9e40bb0bcf28c615eb91033e7674330e78bb072ff39c372ff620cc7f38638d66285dd0b8685dd2598c62f1a6a7c2926f82543c19761285e3644b10ed3f815438d2fc76cf9d5106cf90a4cf86b2108bf122b385e372d38aec2cafd370ccbfdabb172ff4dc372ff1aacdc7fcbb0dcbf1683fcb629e4f598e4774c255f87e595770df3caf59839bf1782396fc0cafdf70dcbfd1b301c1f18e2b8112bec3e342cec6ec234fec850e39b31c1ff3214bc1143f1b1218a5b308d3f31d4f8562cfb7d6a9afd6ec324ffdb54f2262cfffd2784fc773b46fa3343d27760823f3714bc19c3f1450838eec484ff3704e1776126f2a5a989dc8d55dd5f1956ddf76055f7d78655f7bd58d5fd8d61d57d1f6677df1adaddfd5861f79d6161f7006616df9b9ac58398ca3f18aafc10964d7e0c219b3c8c09ff2904e18f60b07f3685fd28a6f62f21a8fd984e389ff7fe359b944c33effdb84e30771ef5bf6c04a7711ef50486e3b710703c89a5e2efa6a9f814a6f61f21a8fd34a6f69fa66a3f83a9fd57086a3f8bd9c8df8636f21cc683e518f2781ee391c831e7f102263c2704e12f624cb63265f212a6769d10d47e19135e3704e1af60c2eb8520fc554c78fd1084bf86096f1082f0d7315369686a2a6f60921b994a7e136b5036ce316b50be8535289b6423384d83f26d9d60be647ceb6c04a75932fe0e26781b43c1ef62cdbe6db3119ca6d9f71ed6b66e9a8de0346debf7b16cb25d08d9e4034cf8f62108ff1013be4308c23fc284370b41f8bf30e1cd4310feb146788f5d9ccbc41c16854be8c96c181be33c2b164eb2f3bcfbd08fd860118274aee23ef77f957ea7cb8e3a934f2884c44e9716397ca7cbaee2cdf0b4c376b87c82256bcb1092f553ac5e68655a2ffc1b2b5a5a1b162dffc104b73114fc1906ba6d08a03fc784b70b41f817582ab6374dc5ffea248b1336b2819dc663e89798ca1d4d55fe0a23bd5308a4bfc6d4ded954ed6f30c9bb984afe1693dcc954f27718eace21a0fe1e13be6b08c27fc084770941f88f18f05c53e03f6192773395fc330664f71080fc82a9ddd554ed5fb1caa09b6165f03f4c707743c1bf6182f30c05ff8ea5608f1052f00f4c78cf1084ff8909cf0f41f85f98edf532b5bdbf31c905a692f968995672a1a9e4844e3237aade86d69783092e3214bc1526b88fa1e03a18e4bea690ebea24737bee17823dd7c384f70f41787d4cf81e21086f8001dfd31478434ced0121a8dd0813be5708c21b634c069a326982e59b4186f9666b4ce5c1a62a6f83911e1202e96d31e1434310de146332cc94c97698dac343507b7b4ced11a66aef80491e692ab919267994a9e4e698e4d1a69277c424ef6d2ab905661e6342308f9698da634dd56e85154ee30c0ba7d698e0f18682db608227180a6e8b099e6828b81d967afb98a65e7b4ce549862a77c0ac797208d6dc11e331c594c74e188fa9863c76c6549e66aaf22e18e97d4320dd0913be5f08c23b634cf63765b22ba6f6f410d4ee82a93dc354ed5cccfa0e30b4bedd3095679aaabc3b46fac0104877c584cf0a4178378cc96c5326ddb1642c364cc63c4cf01c43c13d3016734d59f4c492b0248424ccc7d42e3555bb17a6f6bc10d42ec092b1cc30190b7582792ce71b4ef1f4c640979b822ec2241f642ab90f267981a9e4be98e40a53c9fd30b35b1882d9f5c7d45e64aaf61e98e4c5a692f7c424579a4a1e80a13e3804d47b61c29784207c2026bc2a04e18330e04b4d810fc6d45e1682da4330b5979baa3d1493bcc254f2300cc8ca10800cc7d45e65aaf6084cf221a692476292579b4a1e85a13e3404d4a331b50f33557b6f4cedc343507b0c26fc8810848fc598ac3165320e53fbc810d41e8fa97d94a9da1330b58f0e41ed8998dac798aabd0fd6543dd6b0a93a0953f93853952763928f37953c05837182218ca998e0130d054fc3589c64ca625f4ce5930d55de0f137c8aa1e0fd3116a79ab2988ea97c9aa1ca3330c1a71b0a3e00637186298b9998ca671aaa7c2026f82c43c1b33016679bb2988d95f9e78450e617636a9f6baaf61c4cedf342507b2e968ce71b266309c6e302531ea598e40b4d25cfc3485f1402e9328cf4c586a4e7633cd69af228c7785c12028f8374c28543ed6c78a4d979b300037d9921e80a0cf43a53d00b31d09787007a914e7863e7f28a6c786c830b5e8c81bed210742506fa2a53d00763a0af0e01f4129df01d9ccb6bb2e151800baec2405f6b087a29067abd29e86518e8eb4200bd1c137e7d08c25760c23784207c2506fc0653e0ab7492b9b7921bb3b19155b8e04330956f3255793526f96653c9876292379a4a3e0c937c8ba9e4c37592f9fbb766938069268b8ec054becd54e53598cd6d32b4b92331956f3755f9288cf21d86948fc654de6caaf23118e53b0d291f8b552b7719562bc7612cee3665713c26f91e53c927e82473b750f76603238d5ba8133195ef3355f924cc30ee37348c9331951f3055f9142cfb3d6898fd4ec5547ec854e5d3b05cf2b0612e391d53f9115395cfc0547ed450e53331951f3355f92c4ce5c70d553e1b53f9095395cfc11a8a4f86d0503c1753fb2953b5cfd349e61e8a9ece86741a0f45e76349f88cf3a08b2238718ab8e47bf5a7b212e19fc0f565b050fc7bb4f072c077f7cf733e717d198c4ebe39dc51a354bc3189958aa7e5e2ce1296c766397f268ba7258ec465c21b01979bfa6698f32bbd0794b011ce57ee11b155deb7290f06aeef8472e13bc1ffc4d5afc089e1ac34b1e0676f2e73fe5d05429f227c3748997ea9d39cafca1d3941ecfb028cfab33aeabc04c56238d8f9d712c1c5a53857905b524d4b18779c574a5a90d85c88c5e6395d6c8a94d8a434338f8b4e5690985c84c5e4795d4cfa2b31e19e3a1633eed3a3d8d1c33c3698bc2031ba188bd10bba18755662a4c6a1ccb9bbd4f91d2bf24599f3eff969e21344cfb5989e2feaf41c8cda90abe76256e96959e5fc99e268c909a6235f93140912bf4bb0f8bda48bdfae6972bc3f258633ee49869f199c2e5f07d1f4524cd397759a0e0850364df674ce2e15fce5b879997b1916af5774f11a9895850d767428116736978bbac3dcc26a967bd661717b5517b73db22e8183a5181eab9aa4d7e5589c5ed3c56958b265e2f722345ec46085287917f872d068e7f904e7c922d106e177f4e76feb0ea30faf5cb8028be5ebba588e256c7ff1bb078b6078ac5c9f54e522e8727688f38bd9784dd2f64a2cd66f60a5bd3e6d609ac07c395a948a15c2a356b9975e99258497aa5761f17b5317bf52e256f552365178132bf35acd3c68376de788d865df824e47ab26767035c6e92d1da7a95bacf7919e9039876b300e6f67d31f80a962deead44b0b129b6bb1d8bca38bcd2834774b3f798bc5d5a21ac72eb8f420b15d8fc5f6dd6cda4be9d22e58ed1b76debc0e8bd77b585f4857ff4e15f54685d74672bd1bcada779a57bb94a4b5c1f04ae5ebb118bdaf8bd15e697b77b0b6e1f6c54bd455a2b55196a6aef4cb082f661bb0987da08bd998acdab6238517c862af4c957da809cebf878b760217b7257b54376071fe5017e7dd03b42164df6a91d7f20bab677523a6f1473a8df70c502efaf52e435aacd9b76f83c4ea262c56ffd2c56a689afea21b8b11a2445f282caf662d9354391a56cadd8cc5f1635d1c7ba329c74731e7382fc9b88e15adb2e1425f5d3d167699be118bc727589faaa6e5c4962c196ec162f9a92e963dd158aaf5f1c88cf571187df95b31edffadd3be5780f64450fd6b5a22dc86c5e03fba184c0edcbb4bd53fee37d9f6eea2ec016ec2187c964d2aa61b450b9a8a352df36ec762f079366545f5721d4fbbec4af8747dae9aa7d31d582cbfd0c572485625e264e7e53942db6261555b766c703316c3ffd67c643d532a4659dadf89c5efcb6cec34481983d7ccf47d97bbb0587e954d0b9fa295957dac6b5a02dd8dc5f96b5d9cf7dbc271a6a6710f46e31b1d8d115996c7a3451d6857997c2f16d36f75311d9e558935ce79b94294c5725c18efa5475532df87c5f3bb6c7a4e6abb60a88869f5d483bda16cee873b8b733f16c7efb3a97daac731d5d7e07af2f7b875f1f15c55db29cebf2bc5fdec6257b3d1bf07b0f8fd80f5e9d3c5cf1df14b7d907dad136eaa3d88c5ea475dac66846c9958fe0bfa7eb84c1ec298fc54f3f9e3616216a2dc796bcb96440f6371fb5917b742a61febc54e7981fd16f894dbc532edfc4acd62f108168b5fd2cfa566178b9acd3dd42c8420b17e148bf5afba58cf0c29edaa0c62170d97c7302effc366a182af28b26734fc712cb6bf61ad4313dbcf660c2288fc20317d028be9efd86ac3e0f62e47d24b44d95ce9bd353ee4f98027b198fc818d11d53c2695e0f968cd8c5bcd4adca7b018fca98b418f1ac520fd4c61cd73ccd398ee7f61751e1eaee9185dcd63f10c168bbfb3597b3b4eb4a5e77b5af3ab955bac0df22c1613b65516edabf4e9116c263dfd2c6d4dda8ecf61714be8e2a6ce3cd38c648453863d8fc52c4717b33121b53e8638bfe94b31ca1ae8052cce5be9e23c32ada506197354ed328a95052f6271ada38bab3a46a16f456533e61465dbe9252c8e7575711c90b461dd2a347cdde424d1767447a1fc7533bf3bd75bb1567d3f4bcde3f53216af7ad1c46b8e130b1e6ed8fdbc57b078d5d7c54b1d09c5d78c66b6caa847fd5fc562da4017d37c967e1cc62d47f1d1a5f067825fc3f46fa8d37f7a5a0b345bdf29eb909aaf830d87c8eb1891463a223390fa32c8aaf620b5e0965903ff06c6a431d63a0ac624b56b69b118f7aff0c59cb2a5f02616b326ba98ed1f38666ebb76cba477fa76707de74f22c11d160d17b992af8e9c28bee05755ac4727defaed998c715e3227e7f9727dea3e0f7ba1a30fb7b129c93c9b3a3d1a93b0b5839a1f1227feeb92e0c9b4d49b1a48cc534a4cf7cb0a21393573cfd7ac8e14a58b5b07ce75aec78a9181a5d5cee5c662a12bbdf240f9056397394ef2e46ebe4b75aeb00b5e63cd716cadbe172329cb21dd9993ae6d31dd86a76a072f55737af00d7389ae35b4a6cc5a6cbb95db68d2d9508b6a6461bda1d3dd1520479312dcd914cf5c3d91ce4e6af02363c830bfea42ee2e04c899b18ce2a68226814e5c2b616eee26b8255ef3f5c762a71d5637a7274f91a694d8b613d852d6b6c82bd9170b91a3bd722d0ec8f6ac9b42b61d25b26d05326ed0d0bef6f68ae5d29858d8caf214aeed2971b5f465cc4942c862d1aaf4d7a4aeb59538572b630170cff129803bd0976c8bc544896ca254b1f96211867fbb611cb0ad3d3885ad1925b6b63ebb534bb8a94e2825cc5d03314ab4b54b442dced1f68a05c851b92990cd29416ee303e92a01b36e2c600d4cc1da911ed604a572189eb4be38c05a3b2f05ab057de32353d51007644f8e49216b6967a9961f0b900f7648816c45df8a932079079eab50e675d3e262770d9aa570b5a6c4b535d3357af94a8e793169781c303f85aa0d757b4d0e96a91da9d4d07f5cfa090f826e55dbe83af04385adf175a9e56244256e15c2a6d214b67694d8ea096c5502d5929864c5b6fd5270da4757c8bbe3bceef8f502319b160f5c574d4fe1ea6067e3a2201620eb744a81ec187d2f80d796c5a2791b07588796a560ed449d49657d19df7af250504fee1c5d3de996697e6c72ae210ed84681aa60972d393f10afc1c71fe7a4b0758aae061d19d31af4800353b83a53e26a2c700d174dd66522f8384da1f089648969574a4cdb33d99b1c2682c65645c501da7e07a5a075a1ef82c3d1b2b88d56543448a1caa544d58ca5462bdc0e38bef22e0ee03e599002b71b25b826029c7e7b591c402d9d9502b57b749322d59b137180f52880d5358ab6577ead18dac905d323dda2c316f726eb2925296cdde91b1778d6942fc6015a33b10ea87e5d45b8ba1abbe6ebd08291c657ccf17ec270c7122bc55d2eaf84292be8ba38af58a7791e5c01979ba6fd9e9be552a9dc2cc6337203cc11e46668f7e5663193956b346d68f27581d1d7bd9cafd5f1eddc000320b919d72ee46639079d5ba3654c6adae806a0d577745decdcb4ed323596d54bbcdcaccb44956eba759499df8524b2afcc54b9e9da0baadcf4ef665a9c81bd911ab8cdcd30119a9bc5eac0dcacbbbfb9813a329245362bc5520bcbf50bc27b76721ef5f87fbee6bb275ff3dd934338dfa3e0b65ef2295b2fed3d7b7697f82f62152c7bd7dbb35891aa4fdb6afa4cf28a8d72119e6cbde8346be86bdf946713d99ab471ee4da41a86bda258890ad1e27b6f66b1bed5a7b5c2c3d99c0ae7909c14ce029b70f68b25cec90067a14d38f36389733ac8ecbd6dc2d92b96388f04388b6cc259104b9cb7019c7d6cc259184b9c9f029c7d6dc2d93b9638ff0638fbd984b32896389b839abdbf4d38fbc412670f80738f287096a140a1fa3cb313f68a9a50e1fc96a570ee6913cec258e27c16e01c6013cea258e2cc0155d15e36e1cc8f25ce2a609d036dc259104b9cb7039c836cc2d92b96382f04380753e2dc314343c99fd17bd3a16c4d85721f506e0eb10565412c51be04500eb50565af58a2bc10a01c660bcadeb144d90bf48286db82b2309628ff005639c2169445b144390f58e5484a94cd3d947d9cff4b93ce045373fbfc59a558c9c13f881fc8a341536854145bf1f09625765667b57dfee1616d4ad62c02584747b59d855b6199b76e24029b5c4505ef0c006f6f4a784d01bcf25a93a50f06f8c644e1eda40ff31f241011c0be54003f0600c76ec97a1a8a232d07eb53a11c019a3ce3a8f712553902f8a15ffe557825ce7d3270db5081eb006c707c14fb3ef2bd0a24b2ecbb9c0a5d254037817e53d62cf18a7be81c76d41c61d65d4d85713ac038911263270f6385f3122f01b902a9859deed2e0f9a25db820c33c63cf18ce321e0a7a32fb44b5c1ab7664f4a9c0422751a26b9121a3fbebe942e74ffc6aea56a0a69e6c134cc2e1093298ad01cc2936c1ace6093406305b0098536d8249b8a8850c664b00739a4d3009eb6e3298cd01cc7d6d8219c7aee28e00e67e94305b838650e60d70b3bc166935770131685bde061a48fb53226dc7fc4d78be7f6725f38f9363131084199f6c88ed0760abd3b764dfa8b456f78d8e047da3195b7220ce7fe00d214ab231f55500e501d428f956ce0ae795159a6d9b534477935762f398c641460cac724750aace8c62e7a4bfa2aabee73b5504f0ddb811545864e5eae500ed81510cdde5fba675e149ce110c8c9035a5e6028cb3b6eca42e1418d1a46e1e15d6a100eb6c6aa7557232c33d7d39d5908a5fa66e0bb0154731c2d9abd68c70d601edcc39d4b576a50876b9e2aa83572ec5424c29ee3a2d0656b833b0c2b951b425b3ebabc771d8a33b4059428992bbf398ef73a1c3ab9032ca514cb215410d00b4d22d012d8ecba8ea0368f3a270b1c6db830bbdc08b459917f7b6e05f006159146dc1a02d41d215e6646dc1fb41cd3cdf46aca4db49c8b0ce0758cba31804cebc441a4225acadc956122d02233f07d9b42bbc2fe5de31b2d19f1100e7029b70f68b25ce0300ce0a9b7092eebb25c3390b949f0b6dc249ba51940ce75900e7229b70926e6326c3f908c0b9d8269ca42e20c8707e0d7056da8493d4410919ce06a02a3ad8269ca41e35c870b6033897d884b34f2c7116019c5551ec78944b0e0eaa656b373e03a5e6525b76e1e6538e6992a11c0f502eb30565412c513e05502eb70565af58a23c18a05c610bcadeb144d901543a2b6d4149ba8a9d0ce5e7c02a57d982b2289628c701ab3cc44e9f05843b80c826db4e6029acabedd9f6dc2f86936e2781cc7e28f54a21ff646f046b34c8a62aea000b3c2c0a0b947d9cf2b44d73c2cc4c56468e0165e4e1d428e55ab5dab972a80db0ca23a2d8e593adf345c29291ccf5e2fe00e61a9b60f68d21ccc900e69136c1245c7a400673248079944d3009ab1f3298c300cca36d82d9278630c70198c7d804338ebe7f470198c7da0493707d2619ccdd01cce36c824938314106733700f3789b6012fa392083d913c03cc1269884036e6430bb0298276e493f07b56153732e8079924d30092b2032985703982753efaad00f7390412ba082d611403bc50e077984a5229983bc9b01c653a3d89cc2f77fd7aecd29f900e16951ac11ea296aea7447d9c7d9dfcb7080f3744a9cad983a7e9ed9cf0b61f54236f4fb0a98c739c336a0715c7c7520007a262550beddd23f3146e805986c4ab62ec8d06745ef6a64846787a37c204733e8293daeae460e0268cfb6673f781cbd5d0e0028cf8976dab6a4965538db8069db73a35d3850956c10c5afe1d30458e07994d876512cb0029df1ae7d0317c5c036cf8fa23282036a533ddb5ce534721779836deeb282854ea88bc5d52251b6128e569653a13d06348b2e88a21f94fd446e1c077fff0b8a830b6dc249ea33980ce76300e74536e1243da69d0ce76f00e7c536e1cc8f25ce128073ad4d380b6289f37a80f3129b70f68a25ceb301ce4ba94790783368a2f33717325934ea53639bc5820a7f6392506d99739fb0a9df3d4104f40f00f4324aa0f264bd02a52d1ac1783bd994c54d00de3a4a786d58b64d78bf6b65c22c7e229545be031aef97db089570728d0ceadb00ea153642251c5d2283ba2f807aa58d50098745c8a04e0350af8a6a0e33f5cbebf9a5ca928438cf613e0faaa8aba96788f834c61c87409900584687ab2d15ae1600d735f66cda235c194c368db10c64e46ba95b96722d11f4e32f5f209ca92473dcd81ed8e17a4a785d997f041e1e3c5ce55c4f73d80c75840e6363d810e74995f3c4bd07510f76be2b8fcab5638b1c22e81f038bbd8e12ba3c28bb50599a10ef83b25f07367bfd965c89e92f3b493d0f92959e8702981b6c8249b8e3870ce66100e60d36c18ce3c9a6f301cc1b6d8219c7b51eab01cc9b6c8219c7934d0f00306fb609661c4f369d07606eb409661c8ff8980860de6213cc389e6c3a09c0bcd52698843e0fc8601e0e60de6613cc38fa293a02c0dc4409533a152d62f0bc3dff4ae23877258f05206f8f6256920ffe4aa911c1239b95dc17c0bb230a2bec5d4badf048007273148ef1e079cf2b8093a7dab569e57930cc762725d68eacfa187b90f14c52bc7dc96a74b0aef82e4abc5b7b7879c0f3045c299b6f24200357970a1c03d9fd6e4a70f2b0247f767747cffd59dd7fb0171952b20337cf03b6780f25d2868cf9a62edc33fae297793b011bbc977a49016f88573f519caf673bd8e1522a84fbaf484f182783ba35a870ee8b625ea7a056cdebbc006cf2fe28da93f260f6b9ce1f7954b43c923dce6b31ce03201fa004294f6ed6d7cc84f3e18da8d0e500740f46314ce15f15e42a035b8871deab7b1180f9501430b35be4d23b960368a78126cec336c18ce300da1900e62336c18ce312822a00f3519b60c67109c1b100e66336c18ce312820500e6e336c18ce31282c500e61336c18ce31282b900e69336c18ce312823200f3299b60c67109c14c00f3699b60c67109c18100e63351ccec6403d33fd84b587a92ad5abf0c0cb43d6b2356d2756d6458f706589fdb92beb5e2ef149c2394289fb7c7b7561c8f441a06cad017ecf55f4468a564fe8bda810cff62147b20b17254f5b3d537965eadf70496fa924d38fbc512e74480f3659b70922e6725c3b91fc8ecafd884b3572c71ae06385fb50967412c71ae07385fb30967612c71be0e70be6e134ed27e3c19ce5f00ce376cc259144b9c3b809afd4d9b70f68925cedd00ceb76cf2fd463a6b44d677ff92a570be6d13cec258e27c1ce07cc7269c45b1c4f927c0f9ae4d3849779993e12c0738dfb30967412c716e0438dfb70967af58e23c17e0fc604bba89f26774c2853564c3c8734013fe435b5016c412e56b00e547b6a0ec154b949b00ca7fd9829274e51c19ca01a017f4b12d280b6389b22e40f9892d288b6289722140f969144b15f00611f4d90a172b102ef9223b61ad0c348cfe4d897527a6dba73149085b2cf6a2fbf7f3aafbd2e3ba87e86e00f83fd12e6048d7f28ce3e160db8222e0b3288a00785aaa3c5780ab5dbb4e4d1d012cf4f32d59494171a4a529d932c5c9a015fa45146b3ef39dfffdc7d8f94bcd386f635d09ecf2bfd47e11f841762bd858e6ba45a960c398f48c1dbf0cdd1280fb322a673c111f1142e601610380f715253c3ed65529825dcec639375782ac1bbfccba0bc0f63525b6dd95660e742201779dd77ebf3185a039f40db5978443bc359ac3859a1cdd1421a24c3490089d4c909d1cb03db0d86fb7e4da77ffdc79443ed90ba8b02e0156f9dd966c4d467606d02a2a94c70094df4795c1c70a3b5c2e08c43b83ef0032f80f51751753bf4305d0a5ce4b5c5055d4ce28c85a97ff02587fa46e205531f79890a1ce4ddeaa9ccbdc4d04f16b20b503d87e8ac2a711b7c22a617f5c50449d4132ab7b11e0fb9912df762ce512aa52c9b21100246b2d5e0600feb225f7a4f94779e2b8e7bc1f40f96b54be8de438e4f0a4df565ec14877a3f1f56dd419c0fc5f1419bba89665ec0f00c0df2801b662fe9ef75c96d9dd2d61f626b3c8cbc120eeefb601251c152703fa0400fa876d40e3e890f90800f44fdb80c67166f10c00f42fdb80c671aff9323074f1b76d40099d4691013d07006575226826f5ae65cda4a740332941095077f67336ab87089b4a64ab87fa817233c746a8715c92350040ddca46a8844d2632a8f9006a1d1ba112369bc8a0f60650ebda0895d00b2c19d47200b59e8d5009570f93415d08a0d6b7112a61239f0c6a3180dac046a8840d7d32a8a5006a431ba112fa7c2783fa1880da88122a3fc861a158cc05a77b5323f5f1eb78f23491e81a53a20beeda8cd0613ed93ce658d08f6f6213ce7eb1c4391fe0dcda269ca4e7a192e15c05cac96d6cc2d92b9638af0438b7b50967412c713e077036b50967612c71fe08706e67134ed2a370c870360555d1f636e12c8a25cece00e70e36e1ec134b9cfd01ce6694385b64c009c5f17a3d8e4788fd0f949ccd6d8219c723c47e033077b409661c8f10fb3780d9c22698713c42ec5700b3a54d30e37884d81d00662b9b60c6f108b1f700ccd636c18ce372ee5b00cc3636c18ca30784db01ccb636c18ce31162370198ed6c8219c723c46e0630db53c2acf91162848d24b2b3aede05583bd88895d4cb2619d60a80b52325d60e1aacfac39a467a9ff8375613565213a8e05e04e0ee64335cc2e61419dc1301dc9d6d864b588991c1ad027077b1192e61738b0cee2400b793cd7009fbff64703700b89d29e19a9d3e48381a4076fae03500edae9468b9a3b4d2e4fee3948bb4b1ce27848ed2c83c84f0d55a125c179be698fa526671b239a6a1608e29d7269cfd6289731ac0b99b4d38490f2821c339039492bbdb8493743c9f0ce7b10067579b70929ef74286f32e80b39b4d3849cfca22c3f905c0d9dd269ca427b991e164a02acab30927e9d16364387704387bd884b34f2c71e6039c3d2971eea2c1996dd7120e49132ed3e1875393407e1394a8f971804cb8b08c0cf23d0072af3840261c432583dc13402e880364c2b15432c8bb02c88571804c388f4506793680dc3b0e9009e7b3c8201700c84571804c38844d06f96800b94f1c2013b693c920cf0590fbc60132e1c20d32c85703c8fde2009970993b19e47300e4fe9490831de71b474f7d1301ca3d6c41493a864b86f20580724f5b5092ce2e90a13c01a01c600b4ad2b15b32943dc1e8d85eb6a0249d552043f91db0ca81b6a0241d02a73b451e58e5204a94f0388c45decd2a16913753b2e5c1e7b014bec194f86a7e1a721c7def9d06b00e89a2f12edd16f397f9e7958c2f4273cfa99bea28c69becf27788f3213feb73b9f31ef727b58476d48a6cd5d5dda0141d1a07c884a3566490af029087c50132e14c0219e4b301e4e171804c38934006f9280079842d8d2e52f75e648dae8300ca91b6a024f5454586f2038072942d28491d8090a17c08a01c6d0b4a521f54642807825ed5deb6a024f58e4686b2114039c61694a4aebcc850ae0028c74681722ed31f3d18d91635b223810f612994e328516eefa1e456375fac0e2c11eb04233b08866cb7540540383e0a6b948df6f2b4ed49c2e112b28cbd1c64ec095bb28c84e248333699778a9d4123682225cace8a55facf7872bb9293d93036c6e940163ba24abd7bd09ff960e7ab725ad064e740fd1780de278a1234bfd695a07340093a891261b30cf5b98c29a925aea6c2b81fc0389912a3f4eee33f9f7e24e30706477c2a3d59b67e13c09cb225aba2c87c4c90b531d7805a7d6a14d99bdbe342f1d958562a3e5eea9498119592648da3ab80454edbb253745060440bcbc9663efb03acfb52626dee612d74fe4f393d182deaf152b632f6f6b90a80dc8f12643be66f71160b0bf46775ac5f14c7d3997f062dccfdb7e47087bf5714470fbc03818d4e8faa89e46facd79e0c3f1bc09c4109b38173c15fe62b918779ab8ec97091ed2a6d04701d1045fd9da979eeb744e2863a9915be0fb0cea4c42a177ef5f11aebb52313bf07f01d48896f5b961abe90ebe6228247e71d1fc09b45094ffa20934d9e54fb7128cb7c3e7d1c1b3dbb8046cfec284acba07d1dd275f064bd9d8d006bb18d584937bd90612d0358e75062950e38f0bef9545fd6ef4d3962d4840ae77f40b93ad7269c85b1c4f900c0596213ce3eb1c4d91864f6529b7016c512e7afc03ae7d984333f963867029c6536e12c8825ce6b01cef936e1243d34830ce75100677914383198d53de4128e67928d298d04536b07d984b35f2c7196009c0b6cc2497ae60819cee5a0a15461134ed29371c8709e07702eb40967412c713e09702eb20967612c717e03702eb60967ef58e26c0caaa24a9b7016c512674780f3609b70f68925ce3e00e7124a9c5d58f52509feeda97c0264a1f387ff9b3ba95a26440e4f4e904c11d42258ca3d820a760f96825d45093bd88655c2ee27d9acd25850492db50525e9c00819ca4701ca65b6a0241d1421435909502eb70525e9cc1119ca16a0625a610b4ad2592332941f01ab5c690b4ad2290e3294a38055aea2445973ef4a844e7ec9bc2b9d0a1a46876c490b85e2480f0a205bc9743cc8ecab2951ca65603dc52aa60a2124a26560641b5ca6013b3c94129e5c559cdd02ed02ca3dc06496d81458e26136c18ce37af7ed00ccc36d8249b8c88b0c663d00f3089b6012d6dd64301b02986b6c8249e89c8f0ce6dfa0023ad2269884ee24c9602680651e6513cc38baa1f81958e6d136c124ec4692c1fc1dc03cc6269871ecf16c0fb2f9b136c124f4c84506b31980791c254cbec59f6384fbd8f676ee7001a58e42f03e194632a7133f820c7e7c14e344700b7559f2716df385741fb0ce1328b1eec4aa8f13b9fb2ab9bbdc458ea5f2d9c9cab4eb3a090193adeadc0ad8ed89d4a3479522d8e56ca8b7b1ba8c95825d70f11b1cde09c03b298a51ccec2aa238f6d0f704284f8e0265ca155f49da59c9f859e52e60cae2144a94c177b4113690c84ac89f80659e6a134e5267ba64385f05384fb30927a9435d329c0d4003e9749b7092bac527c3b91c58e71936e124ed5c92e1bc17e03cd3269ca4eef1c970ae0338cfa2c4299d564098d91e284ada682273643a1594a36747d17fcf664182dfbb02a1c59279573819603d8712ab74d157c06aa78bbe1520eb9f4b09b20dcbce05556ac489dc011559a7f36d00f53c9baaa7de94652859f5f419c079be4d380b6389f34180f3029b70f68925ce1d405574a14d388b6289f37fc03a2fb209677e2c711e08705e6c134ed265356438d7039c6b6dc2d92b96388f01382f89a2f599f296c87b40ae90da36b77928a8902e8da26f94cde943713c54ec7700f2325b40122eac2103f90900b9ce169071dc35d40980bcdc169071f425db1180bcc21690844b63c940ae0120afb405641c67d7a7009057d90292701b0119c82b00c8ab6d0149b874860ce49900e435b68024dc724506f25500f25a5b40c6f130d0cd00e47a4a90c1ce558d63bddd152ce6ba2e0a94d9cc4b92563864fdeda5c02aafa74429d712fba7d02609618bc5dc249c48e38b61f9a6fe05ac542c45249f4e23732d75294b01de40097807e7a2d87954e1bcb2820d7338548a17e73a77b948f962550c21b602106f8862a82de84284382e431802b2fe8d3642251c2d22833a1040bdc946a884f53d19d44200f5661ba112f6d9c9a0ee06a06eb4112ae1182719d45c00f5161ba1c6f148db2e00eaad364225ecd79341dd1340bdcd46a8847d7c32a87b00a89b6c844ad8452583da1740bddd46a8713ce1ad0f807a07255479cc682f569b8e19bd8ba5f06d8e62040a5f4a13f7d9ccb300ca3b2951c2135b61268fc00e9753c1bb01c0bb8b12def6ce85ffe0efa98ee4126f6c692c73b71754c4d0feb60608efa644d89af9c7e5f9dea0155e45e2cfd211f582c8acf25950b9dc4389b455861abbfab9433d2987eac8c63f8f03131ef7da069470988e0ce8d100e87db60125ccf264402b01d0fb6d034ad82c22035a01803e601b50c2416432a02b01d0076d034a38804c06742900fa906d4009073ac880ae06401fb60d28e1200719d04300d0476c031ac773b28e00401fb50d28e1803119d0c300d0c7a21847e2af64769616479f9d43580ae5e394285b64b04d3fcac2587a939d0eecf2099b60c6d1326700984fda04338ee769ec0b603e6513cc389ea7b11f80f9b44d30e3e8ad730a80f98c4d30e3b82e792a80f9ac4d30e3789e460180f99c4d30e3789ec63e00e6f336c18ce376ff5c00f3059b60c6f13c8d3c00f3454a983575d7477a9c2dd95299b56036f3251bb1929e5d4d867534c0fa7214431fd939378fe3aee1bd41c67f8512a5990b54c21e12990bd4b78095be4a89b68362a57cf3566a379c3c0ea2762dfdfa1780fb1a255ce9902adbe1e4beb19c901b048a81d76dc2d92f963827019c6fd88493d4991f19cefd41667fd3269ca4dee7c8701e0e70be65134e52df8864386f0538dfb60927e9881319ce3700ce776cc249ea449a0ce75f00e7bb36e12475d34b86b319a8d9dfb30927a91369329cdd00cef72971e6b2203e44063378d641edf12872274be1fe208af128d9259d0b4e284c6fc7715c703b0b58f18751140ad99f7b40387042e61df97b60a51fd9849374a69e0ce74b00e7bf6cc259144b9c754183ea639b70e6c712e752609d9fd884b3209638ef00383fb50967af58e25c0b70fe3b8a99260ca63fa3c7d189e501a0dcfc8f2d280b6289f26580f2335b50f68a25caeb01cacf6d41d93b9628fb815ed017b6a0245da94c86f24f6095ffb50565512c519603abfc9212a5f411c2039e27404ad98bbc57e2b72c2c019a3f5f45315e84b72627381f1dc4f830dcd2a8bcd235a5c23a1e60fd9a12eb762ce54109ae0a89c887525f2a809b00c06fa200985fcb005e01007e1b4505939d47f938ae446a082a98ef2851ca530eb2eb22c60f641e68f47c6f0bc8385ae44e00e40fb6808ce361114500e48fb6808ce3214fbd00c89f6c0119c7e5da7b01903fdb02328e873cf507207fb105641c0f791a0640fe6a0bc8380e540c0620ff670bc8381e5f3b0a80fccd1690713cbe763800f9fb961c8584e2481b40640369e300ca3fa218b028ac6503168fb014c03f2901ca796dff42415799e1629d1a7f8dab1fc142403237bb5300cebf28717217c9c5ce0b73bd80f97eb44542045ff44706ae2d15b8e600dcdf94e0b8d76c8e0a2e4be5beb2e73962e0bdf865e56f0042563782f303f2596d3a3fe01e802f41894f753a5e21cabd3247c8fc5a3660561f0ce1e65022cdd4d081935ca44366aba8509e04506e458952ce18ca7ada3d9a61a4a88f61f938da97f189eb6b320bfd1064fa3a5158e85c968db3c738ba3ae90550d6a54419cc6f4c7e2c9d3d5e07fa35f56c821947678f370098f56d821947678f9702980d6c821947678feb00cc8636c18ca3b3c78b01cc4636c18ca3b3c74b00ccc636c18ce328e5e90066139b60c6d1d9e30500e6d636c18ca3b3c75300cc6d6c8219c71ed0a900e6b651f4d1b381e977f618c7137c1f04589bda8895b4214f867501c0ba1d25d6c68c4f552c733e5a9cf441582c86e2c8a0917924e0d38012daf694d0ccdc3a1236dfc9dc3a9e0bec71074ab4c13d0fc6f1e4aae160c0b8994d38fbc512e7fe0067739b7092762fc970ce04997d479b70f68a25cee300ce1636e12c8825ce0700ce9636e1243d38840ce79700672b9b70f68e25ce3aa02a6a6d13cea258e26c0970b6b109679f58e2ec0d70b6a5c429f785f3850a722778446b90c846903e622978eda25ce5d11359e531cdf91717106ff78cef02acedb7e43a24b8a08b74f49d6cc1cc04509777b00565412c513e035076b40565af58a25c0950ee640bcadeb144b92ba8bf77b60525e9b1746428bf0256b98b2d288b62897236b0ca4e9428b7070d23d7b57289689247b6d3876c7c7d6fd008ea1c45db32b8cf21c2255c643e87ce045877b52593932e7a25cbe4f34079d9c5169405b144f93e40996b0bca5eb144792740b99b2d287bc712e55ea016dfdd169485b144590fa0ec6a0bcaa258a23c18a0ec468952fa35e0a84ac5d9285cd5d1acb6eca02c064da1ee5180ccafa52067019079518074877fe1c02f5f5524cf378deff6be3700c81e519492d9b9638ca387ac09a094ec19854df6aba5997b01b0c97c4a90cd58fa2da732a6a41ba2575361bc1560ec15c5ca75ff54d978874785f3a77694935b813e4e0125ccad1903a09639bf8bbc39c6658cd09137d9b6fc6d01b8c2287c6e14b1dae473e31d90897bdbb3fd3e8efb72f702288ba26dea94a469ecc4d16dc9f72053f789624550f6c70e12e2243bebe91360997d6dc259184b9cf7019cfd6cc2d92796381b81ccdedf269c45b1c4f90bb0ce3d6cc249ba3f970ce70c80734f9b7016c412e79500e7009b70f68a25ce3500e75e9438790cf80e472e80abc977410e63ee8e47326c64cb511b036c036d99bb89e721316340ed3dc81694a4652319ca8701cac1b6a0242d17c9502e022887d88292b4f34886723b30ed30d41694a41d473a5f97c02a87d98292b4974377a604b0cae151b881f04f3e7085972777e6140be170f236ce7b751e068da3115bd24afd43c271f42e7818c8f023a39869ece99bb2958fe3be296f0cb0c851516476ee08bc9cf165207a8f2f23bd0ffc5ead09cbd10954688b00dad1512cebe755ce4226972b95d502ebfc1c20dc3b8a79f0eca6d0485d8d91c17c0ec01c6313cc38563f5f0098636d821947e7b60f0198e36c821947e7b64f0098e36d821947e7b6a70098136c821947e7b6d70198136d821947e7b6c70198fbd804338ece6d8f073027d904338ec77b7c05604eb609661c8ff7f80ec09c4209b323ab3e6234cde131d411348c8d61439c17ab9c17dd7b70406eb0a34139233dd787ec58b9a3c058e7544abc6d986eac739210b6588c2ad59e732217039b9d1695972c3ec851c6aaa21af220f35c3d16c0db378a0c2f97ba9688613979fc6b6a7c132f51e3d86cea0e32fc7ed14f6e4c12f9ae764e6e3c092c77ff28b60bf466b569bbc05b00df74faaa6878722a63284bedf25920300e112eec1778224738bfa58ea8921842dd16409d61cf1120a413c36465e759a0ec3cc0c6b32a488745c86afc1bc14ce64c1bb1923a7324c35a02b01e68cf9ea1383a28db1d64fc5936ad2c26f51443b6b2f8075029cdb60927a9b718329c2f039cc536e124f5184386b33e2837e7d88493d4ef1b19ce65c03ae7da8493d4f71b19cecd0067894d3849c7eac9705e02709646b18aceef1eaab6aca25b0830ce8b62c4b397d2908ff3c0c78d005e99bdc7ce114e6f90b9c5ed00eaf2f9361dffd1977200846c84730fd00f2ab70967bf58e21c0f701e64134ed2ed8264384782ccbec0269ca40b6cc8701e027056d8849374072619ce6b01ce8536e124ddef4686f3458073914d3849776292e1fc09e05c6c134ed29922329cdb839abdd2269ca46e7cc8707601380fb671868874f0836c86e8208075898d5849473cc9b02e0665691525d656cc3ff1963a28b176ad59fa0f00bad4a6314fd22366c9c63cbf66299ccb6cc2497a003219ce6700cee536e1243db1970c2703997d854d38493dbb93e15c04ac73a54d38490f8f27c3790bc0b9ca269ca47b35c9705e00701e12c5b903d8561988328ec7dc9c0c40aeb60524e18c1119c83c00f2505b40c6d18b521700f2305b40c671f161210079b82d2009f7b293812c00208fb005642c4f0b0220d7d80292d0ef0719c8de00e491b68024f4464306f22400f2285b4012fa48220379220079b49de74813563d64e7489702acc76cc96d58d5d721c56f36a80718213ad6269884fe15c8600e02308fb309661ce729db0098c7db0493b0274e06b32d8079824d30092b203298ed01cc136d8249d8232783d919c03cc92698847d203298bb039827db0493b0674e06b32b80798a4d3009fb426430bb0198a7da0493b0874e06b33b80799a3d8775c7711cb31358b675ba3d4ef4e3e8787709b0ca33a2d8b796cf6625a546b4e98fec90ee252c05ef4c6a78558e8045ce4b43d97c510a72efee439974dc13bf4cdc1ac03bcb6ebf86846524995fc353401979761403c2fed331b8c2b5c32bd76860a7e74431202cfdc5e58bbf878a71f6a5ce4be562bcbdb6f88afb14603d97126b6ba539c4f7f3aef0c6d3fdb5391c63271c7c23f3baf938a8cbcf8b626996dfb3e1486189639dcfb8e7385e3145e2c494cc425f03167a7ed4bbd2ddca68aaa30ecffef27788f33aaffd973bef72c04b682db52d15da1340e57441149553df5a5a399d0e6cf4426aef1d4bc4a7aeaf62580df1f5108b9c8c5f2a2c338e47d63603182fa2c4b81d28392b959a3c023b246b6d5e0c005e1c458f1c5b7ee0ef91c7f18c8c3d00cab59428db31f53cb6ec2b1dc2895eb24ae71500f6125bc1122e472003fb34007ba9ad60098b0232b08301d8cb6c054b38384206b62f00bbce56b0844b16c8c0f601602fb7156c1c7b4cdd00d82b6c054b382d4706f65100f64a5bc1124e1e9381bd1f80bdca56b0844b1cc8c05e03c05e6d2b58c2b95032b0e703b0d7500f49737013d80a311ccd875038e24a713accc10e9752217c3ce343d5a9b7e2372eb00d1892be360a4f20d9af07cd8fe59ad013c1c8e97adb80c671c5f2f100e875b6018de3dad05301d0eb6d031ac795cb2703a01b6c031ac735a26702a037d806348e2b984f07406fb40d681cd78a9e0b80de641bd038ae643e1b00bd39ba453cd934f2e3bc44a20968de6fb467da2f8e67660f622994b750a2dcdab970579096888cbd041c045945078e6c67713d00ee569b3ccdf68de5dee2d1a0a4bccd269cfd6289b314e0dc64134e52cfb2643857800ae7769b7092fa3f26c3793ec079874d38498f2623c3f934c0b9d9269ca4c73a92e1fc16e0bcd3269ca4878e92e1dc1a544577d98493f4944c329c3b039c77db84b34f2c71f60538efa1c4c92ff8cbfcccb7f8616ac85298eeb5e7387bd2fa9aaccfdd1ed8dc7d36c1245c5e4b06732700f37e9b60128e5792c16c03603e60134cc2d17432986d01cc076d8219478701ad00cc876c824938134906b33580f9b04d3009e7c9c9606e05603e6213cc38ee426a02603e6a13cc381edf9400301fb30926e10a3832983900e6e3369ed9467ad82dd9996da781c1b6276cc44ababc900ceb5081b57e5d45f8886ac2878a311c3e8a3357e8efce73e709af0aeef28172e7491e1bcbcac557b31d20339c3fc1d262a6f347773f215c0c0d672b59a5b8cbe59508d90b9da75cb32ad6931f68f124378d469e69e426b671fe5ee824d04adf86701e17371d72138d9d378a852f88c5e2fe42c6f739cf15cff89cf02122a6a54ed88b44a84b9c34e13128130e8e96286fa53699ab6f05d9a09e2b26c1b91673653231d7cbca1211d75cb1dea058a4c762df0a6cb984638a304b9e42f3bcf01b385f709f02739cb896092f18655e38ae0c1e3a0fbb820d4bbe959bd8c117ce30e76ea54891b9ce5d4e43e69a2a614409b17f9ca70a7704358ef14523c54ea8c5e2778af3ff1c61413d729dd71245ce5fee82fdbce452fd3c2f0d167a57f27e6699dc6ad24b7b8a9b46425f6a548466ef9962343a6947f3440a970aa9a333c63473fcf0bcd3244daaf4d88da7456d8effd33cddeb7be99ed363771edffc106c2fb346cff0907388eaa9c03ed7ec4be389a23cab146f72354d6c9c97f97e79e522dc1e5dedb4eff0e2fe2c2cd7727a74aba97d07d7e8394afb76a5b93bbb14d923b3889d3e1dd438a7deaa14f6509cb40537b7cf77fe5d92058976a246c6a50d76aeca445ccb85d4854cfec7eb4ddeaee5c5d2f3943c7704e585df09d63fa5075a7af4e4a5c70bbe0cd69367b017ffb1fc502dff254a9e4d80e58f139d01aeaeeb60eb1f2b9756fe72752b7fe51f2b0fd5ca5f8dcaca873a37dd6e6cb908e11f2b9756fe5a752b7ffd1f2b0fd5cadf88aad7038750520311ffd8bab4f537abdbfa5bffd87aa8b6fe3625cfad115b1fed44e81f3b4fd9f93bd5edfcdd7fec3c543b7f8f92676386f54cffb17169e3ef57b7f10ffeb1f1906c9cff6921cc70aaf36d8937b731c179bf44c8e3ffd5fd3fcda6e83eeb780500 serializedProgramBytesString: - serializedSignature: 175b9c7a82200b739d100a8dfab47e7146ddbbd92a701d1a8f380daac56e131f9270df864211fad0e3faa949d89934cc3e78066e2d7531794ea539a2be507703 + serializedSignature: cbfce35aa0513accb8882733448c821c4294b86b2f963f032c27e1bc3c4dd3cb01a9c4651701e39ec1f3c0f51de5537b631d00e89a5b9eda31988c56ce0ef907 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset b/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset index 3e73e50..bf7fbe3 100644 --- a/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset +++ b/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c16c7f3f0f7018243d1e2102894b4051212bc502c58710854a08590849036409a04a9537777a7eeeeee5eeaaed4dddd7e7d6ff7769f676eb3f3e4b9dccd933dfe2ff990cbd9dccc776767f7d6ae413673fec50638bf16b2796c221bc416b062b69aad72fe9ae86c573a3fee9e3a3e87553adb52e777a1736e00cbace54efeaf7facb3f37b9ab357c5aa9d3bd7b022675b26cecf6725cedfd39c7b4b9c3d7e74b9f3bfc4b92ad6c8b96901cb67b3d92cd629d6b116110bc54d55f2588cdb156beafc9ec0f675ce9608a5f843b2c5a94eceaff9ce992a716ea5a3b4ba6e11db4398b5d23957e4dc53c9ca1d99cb84c4a6e7cf63e20fe66e06caed20b9e5209bc9bf1bcabf9bcabfe1f5fc38b76e71926bb3c1b54a668ef33fc3f9ff87dc1fecee37ce94fbb9ee7eac8326a339909127b74334dd873aff1b3b7f3e9782fec9ceb591db6da4bc4d72bfaddc3e2c8f3f0ff6f9f62179fc05b0ef308a554b9b2e93c7dbc9ed239a9c4792c8e1db07018307a5ec175dd90d9acae35de4f65129e345b0cfb7c3c0fdfcfc4b5e790d06c8fde172db073c53d9ffb8a6f7e3f2de72cd3ed3757cfb1890f998bcf7294dff2734fd9fd0f47f4c9e7fd92ba7d10f9aae4f826729bd9e32d8f4ac94f70ad8e7db1172fb8c3cff2ad8779ed7708326fb394dce7329c8e1dba7814e4f4bd9bf001bf87693bcf7356007df3eaf1ddf048e2b79fcfceb5ef9715623e57647b91d257571fc6aeed949fc41e5cd9ee098d235533ef30d4dd7deda71757d2fcd8627c173f9f1373539faf1d1203d9b69c7da81635bbbb66764cafd31ae9d33f3e5fe4eeefe58950fea1a43c6ba7232940e8a550b965a7c6d2eb7e36ab93e998c16723b3e808c962eafc6f949aecd06d7aae74c70ed672a2e299e2f806b547c6b24d3f22ded78863cfeb676bc3172bc0972bca9765cc59017812e2f6af7bc24ef7907ec3b7a361da7c978595ef72ed019ca53e7dfd3ee7b451e7f1fd804ef7b05b9ef55edbe26da7daf22f7bda6ddd754bbef35ed3e757c10d8e7e73f706d6ca2ee9fe8ee3755b1bfaef96592dcbec1bc65ae8a13af336f99f8ba4c0f59fe71b1e2f864b97d5393f3667239cdfa26d1712af3d651545e506cdfd27ce52d29b35ceaa6cafd4672fb36f3966df9e03894b7d92baff943727f67b9fd495ef7a1dc9fa6e9a5cebfa79d1f049e0bcfab34f89f3cfe11d8e7db3f91e74dd7ceebcf9b01d2069e9fa95df79f3cffb1b6ff4992b469a5d9fc0ef3d66bde71d9b5f8a71676b36a61a7ce87c54ec9c3d8a9f318bbd9da757561276de57fc6e3a0f251e593ef4b399f826bd571befd86797dff1b57462be5f3199abc77e5f59f817d203716f39e17fb7cdb00e82859c71a268e89f3ea18bfe66729e773b0cff5da55ee37d6f4daace9b559b357f9c317601fc61bf5bc2fb5e71d80f38fcb1e04f6418c6da9de43e6f863e9bcccd660e5bc29268e2d90db02704cc97e0f1c833e20eb8379c7cb6373e5f60370fd7be07a750efaec427fec3d7628ced08e5d0c7628d91f1aecf828891d1f83eb3f04d7ab73d00ee5434d34f99f6876a8bc07edd82d453b94ec4f0d767c96c48ecfc1f59f82ebd53968c7ee72db5493ff856687f2f9bad8a1647f69b0e3ab24767c0daeff125cafce413ba6c8ad8a459bc0be9307dbf6d5aefb9679cbdf6f99271fc6e56cd6e47c83a4fb771a2ffdfcf7daf9efe5f6074d8f1f343d7e94e795dd4a7fbd8cfa02e8a1ee83e7bfd6ee57b16a13d877ec6b3743bbee174d3ff53e3a5d93b3d92ba7bd6abbd1fdea578d837efe37edfc6f72fbbba6c7ef1aa73f104eeabc2a5bbf007aa8fbe079c5492f03ff629e3250ec43f97fb344dc36ddafce2bff59845cf78ff69c7fb4e7fcabd9a9eee36d70cdc0357cbb078be7ad0e8a735debe64bdc6d4cbd8f6d02fb7cabdedf5e00fbceff0eb2fedbe17c2967a93cdf5893d3b816390f25d1b19079ebe67b324f1e89a977c277c0be23b36353f7be8ee3bc691153ef8a2f7ae5c59a6af2367be56dadda4165fd32d69379eb7bcb34bdd4f9f7b4f383c073e1799506aa9de423b0cfb799c8f3a66be7f5e7a93cbf543b5fe4bd2ed69b79ea97f17d1f75f35833e6a99bc7641b7227d5c684b12bae859d3a1f163b250f63a7ce63ec4abcd7d589dd72600bdfae60893c2eed6165e0d852b9dd8bc5f3fdf01c79ac543e17b4a1c754fbd2de72bf05f3b4a78a7d276d3aabf62b938eea9d5fd51d555e69c9bc75f896f2fc2ac3f357031b54bdb4021c5331a61538a69ed33a61eb10d5ceba529edb0a3cab15b85e9d83e9b58fdc36d6e4b7d1ec50f5f1daec50f52068878a71b07d523d47b54f9aec680f9ed5165cafce413b2ae5b68926bf8366872a9feb6287942dfab2743bb64e624727f0ac8ee07a750eda5125b74d35f99d353b3a07b043c5f32e063bba26b1a31b78561770bd3a07ed68a4c9edcebcefd2dde579f5fed78379cb77fd7e755ed523aabde7d91a0387b5095bba2bffad6b3d40e9236342ac8fd4e75bb0ef5cd3bd2289ac7572ab62b9ea637b07ec731957499d377b9f1debcbbce5f33a701ccadbec95d743f5b7a832663be68df9ebc17128374b5ef79db6af62b78a29fde4f1e7c13e7fee43deebd87e72bbafbcfe7bedfcfeda73f4f307c8e3ea5d21957257e9f6b257b79eaa7c38504b9b83123ed3eb5db97d4893ad7c765b4df6b652b67a9f3b5893bd21213bab1891adcaddfe9aecfe52b6aac71fa2c93e3421bb6fa6261b4bf7c3bccf46d3ffc75ad27f7b2dfdb777758d3f3f9de9aff2ab965662dff49e72907ce60eccfbfea1fc078c09880d00d7f2ed40e6cdbf035db9db283e19da33b2993786676b7273b4f3d2476383800ecaf7066bcc07bbcfcefcc47d6e6f557751699fa7a5fde1e038d47118f3e679b52fe56e739f96f6b99a1eb99281aa271ee1e5194f87f76ad14fdd37483bff9e765ebd8f1fe43daf98c6ef1fa2a5bfba7f86765e977fa4e61f4abe92abc65d7c04f62137dd9ea3b4f3ea79aafea5d241f5f17e06f6a1af8c60def77a25ff68edbc927f8cf7bad848e6a997fbcea32391f37a1ed5ed1aa5d9354ab36b47af5d71ce3b7ae5d648df01207d1d3fcd54f11d8b03aa9e11460c3954ea309a9963c81896c8bf63c0b57cbb13f3c6909d5cb95959524686f68c711abf719adcf1daf9f1723b16e830566e27306fde9de03ebb5f96fbdc7e1be4b3551e55fd3e7a0cc9d7749cc2bc3144edcb18c2c57b62c8444d8f89ae1efdaf92d71debe589c6105d3f75df20edfc7bda7915430ef59e574ce3f74fd2d25fdd3f433bafcb573164b4265fa5c364e68d2193356eba3d4769e7f518a2d261aae60b53355f99c6bc3144c93f5a3bafc710795d6c67162c86ec8c9cc76288b26bba6697aa3329bb6678ed8a739ee1955b237dc780f4e5f528f58e918e18b241ea30939963c82c96c8bfb3c0b57c3b9b7963c86c57ee00bd8d423d63aec66fae26779e767e9edcce013ac87eb9d87ce6cdbbf3dd676f27db3fb77b4c3e5be5d1059a4f1f0e8e431d7765de18a2f6650c19a0628e8a21059a1e05ae1e3ba8f7c5e3bc3cd118a2eba7ee1ba49d7f4f3baf62c806ef79c5347eff422dfdd5fd33b4f3ba7c1543666af2553aecc2bc3164178d9b6ecf51da793d86a874d84df385dd345fd99d796388927fb4765e8f21f2bad822162c862c42ce633144d9b558b36bb166d71e5ebbe29cf7f0caad91beb340faf2b2ee2ee06f758d217adb836ae3fd16ecf3fcfe4d1259ea9d54c59325cc1b3396b83206f675f51eb8d8fbecd852e66d7b381e1c87f2366bf2d4f52a7f156afeb81e1c877297316ffe57fba9b4b963b156d95ec46a8ef950cf2d669ef81b2b02c7f9b644e356e2cac8d3c7292879a59a9f956a725768e757c8ed72a063134de65eda3d7b6932cbbcbe1bf79bc2844c710de01edb5bdef313d877ecca9ee1bd5ef57da3d71f00f487f79dc0bcf9b4b16653b96653b966d332af4d4a3e3b51eeafd4fcf324b955716e95d717c4beba8f6f576bfebbdab527e76cef75f1f6990a79fdcf609f6ff791c7dfd6f4db47d3f317ef71715d33ef3dca06612b8ca1cab641601ffab97e7f59c0fbcb03debf2ce0fd45feee8f3fef875aaeffaa96e77d56c7fb9705bcbf3ce0fd6501ef5feebd5fe5c17819a7f8c8326e908aa141ca38159bab58221fa87a67b594b309ec3bcf1c3255bbae8a796240accaab4f6c8de66705e038df56caf3bf6a722b35f9bfb8760f59e195137f8e2647dd2fc60b4139bf69e7e702dbfd8e555fad715ccbbce5d45a97d9d046aeee4355fba08a83ebbcec94bcd83a4dde664d5eb5578ee82b4a66837a9eaad76d02fb8ebc61cf69d7edafa5e9fe1aebfd341fab00c7f976bd96a64acf61e03cd867aa1cf81dec4379aa5ef90ed8e77a3fe6bd3eaedf815e9f5372e27255bbe5575efd62076afae9d7ffeea6e33055e753fd4ed02ee8834a4e6de993ccc7547ff9c140867ade0656b34ea5ea3287306f9d6a0338ceb7aadde51db0efc818a1c65c6568f20e67def874b826f708edbc6af33c12e8a8ea3f47258ec58e04c7f8f63029e773b0cff5da286534d6f43a5a7beed19a5ec7306f1d46bd0beda53def4bed79cf697214ff8c0423752eee771b9827460fdf15dccbaf2b0de00727cb341991c2b5aa4fe99400cfeb23753f56daf402d877f88c7cd3d56794ea333f559e3f4e5eff07d84f226754b2794fb2bf3d06ea69e26f7edfaef2f9aabda51f722ddf9e008e9d20efbf49ded75f4b435567de0cf6f9f67820e3782943c581bee038b4515eb7a34ab3d3e4f674ef33539a47aa9e7112d0e324295f9507db82e3500f75dd43f2ba6c70bdf28f33e4f64cb99d8ee8a6f162aacf5495ef67c9edd9deeb6327cbebfe04fbfcbc69ee5f2a7e798a66e329ae8da32b5c59a337caebcf91e74fd5fcf2d45ae43c9644178c812a4fce95dbf33406a7690c943fd48581a3e398c5ee3d63928d7f5063212f48f2acbe52de5d49e4a8b2ba3ff0996c70bf3aa6e66df603c7da8273dc7e3537aa1d72bc2d906fba5e3f9e8cd585727b5112fb951d50e7643237caedc549642a0e308fa9637d537c8e9c3b3a36df953d76d724f7489f18abe6ab5233bf44eaf44b129d343bc6b574ef199799e49e4bdd6bc6abfacc65727bb9dc7662deb8f4578acfe7db2bdc6dec7479efdf609febf785f73aa6c697411bd4355732ef3c5e397e28a579bc32bf8dcf4a72ad3c173b03e8d0d3bd6fa2ccd3b1b3a41dff807dbe3d9379ebf967cafb54b973b53c7e7642b6ba975d23f7cf9532fe05fb7c7b8e3caee6995d2b8f9f2f8fff07f6f97935e6f502f73c9f361597a38ef3ed79f27c0cecf3bfa5afc42e94e71b807dc7a6091b802dfcfaf6609f5fdfd04d97891b34b9bde5fe45f2ba46609fcb7d5393db2145b94adf8be57519dee7c5cf5fe23d1fbb181ce7db8df2bcaaefb6d7f4d828b797caeb9a308fbee2b8ae2fb4278bc563d67455879231648a8a21aa9c53ef1bcaaf5e06fbdcaffef0ea06654f794893a5daf2647ac6eb59323df3557e6a8fcb42fd5ea665dcef655a7aeeab8b8fb705c7f9f632c9b4a9e138df5e2ecf3703fbf07873edb8f295169a2f5c218fb704fb5c9febe4fe95f27c2bb0efd83be9e8da19aab81ebb5aca680df6417e6eb015d8e7dbab345dcfd16cb9469e6f03f6d57d300eb4d5ceabe3edb4e3d7cae3edc13edf5e278f77d0ae57c73b7a9fcbae97fb2adfa932417f1ebc8e6f6f90d777d2cedf288fab31c137787d80ddc412b1f54679ec66704c7263b724d266861a9f2baf8f4119977965c56e66de78799376fe16edfc2de03e1837547c5179b73d38af7c47c517102bfc963df1181366d9a3e2d2ad09596a3d97d86dccdb86752b380ee3cf3b609febb9ab2647dd773bf3b633dc2eb72ae63c0ff61d3953ff7079f1e11c825b8e769f5e5e9e038ef3ad561eb2ae9a3e2a667401d7c3d8a1624303b0efe8354df9492de5a5d29775d39e7b09f25c3dbf3402fbcedf3b6769cf45cad3f873757b2f459eabcab93b98b7bcd5f5bed37b7f0df97769f2ef04c7f9f66eaf7cf13c759c6f376af9092bafef01f909f010c7751e40bf78fbc4adccd3c63475a9c655c57a7eec0c700ce4cd065dc13ef7f9cb247b35ce747beff5f1776375bd6af7b8d5bd6fa62c8fd86dcc5b27ce06f25279df91b189291fbd9779cbd17be5f63ee62d83eed5ae5773116ed1e4ddafc9bb5fbbff0179be1bd88731eb3eedbaee86fbf956ae75d5a087f6fc07e5be2a3b581226c938c9390633554c55f32ce458f3063de5be8c35f177f7752c31372395f7941de4735e4c726d36b856a5f11dee3366a532ffe34e79ed46b97f97fbcc59aa4d43e62f26f307da66762ff03d2e4fb64fc7dfb9a17ec9f4e9a8a5f94392692fb0cff5536322d43bdc7640fe76de73b187a58c4cb0efc898adfa83948e77d5a2a3ca9faa6ef328f3c49cd86372bf3738af8ef3ad5cff2d5ef7d1f57c9c7963f7e3524fb5cec3d5400e9497e195173fff843cdf07ec433fddc67b7d5cfe939a1e4fba7acc2946f4c6aebfcb7b9d278d5261cedb730a101d9f62def2f529f799739b223a62d71704d411e6c1daae4be6f73da43eaa7d47c646a6c68a3f2df5efabedcb7677a662a15a6f6e13d877e4ce2bd7e43d0b7455f55ed54f27e36b7cdc8a3abf3f90613aef67ae8ae75c464cccfd9eca4a5821ab60d92291784aa4bac4a7bab3f6c53db9e8c622f233beca277f6c35dbd7b9b5c4b4c2e602b17e6735cb63b9c61536bb88b9aeeae913c5ef42e78a322174db06351e71778d4770e5ca9d9f12b03c6895737c8a585d942f105ae69c19c466385b7ed75236982d727ebc52163a8f2d676b9cbd02e7778590b7d451bbe695b599c49712d5ef99e7c874573a5de91c51402b9cfd72a1e17cf17badd0b444683fcd39562dd65d5dc54ad90467bb5e3cada6ed95cedfa667164864661dcd0b9e62c7dd65555532e53bd670edb3854ffeff14a98f14e1e81b6f2bf361a36c51721c5b2325fe3f4337c8f0027e9a943158208b798ee5b26c5107985783a07f1b6b5a68f66f97f7303624a92d66323cb9bb090b1229fce02f5fee7ecc2b571d91e1352d8f658bea55f75a4c4b0696cbcb12b3cffd989091d128872baae38f99f08bd7c9f969c4ef5e5726aef39f008d45e1e74d00b1bc4081f3c77ae77fb973f178e770b1887f939d8bf842d4bb0bc54a588d34cae1029b08cc350bd1da54c54037308116f5bb827af1736c99ede4a89bc6ad48a0ce1635afce491c127b96a8323590f5269565de9c3964f88e39232fce30a74b73912e75791a96320d4d29d33cdd59a0f6989f2c5d5ac4ed4aa40bff6766d812f1edda74c0083632116c513fbecd75af9b6ff38e8f811a4333bfd6497d30990618c10c1341d153b3208d04673b1aee256b8a7563b855ca0cdb08865d6a58978a0e18c5c6068a399c625b935acd34b5b84688e02698e076010537c504b70f28b899c9a15aa53b4bf273ab859442e75affeec4dbbb77d0c39ad99f3a2279b27615306f6a6e4a1b8e706ba3567ae274c413a70526b95350c92d31c99d834a6e657228d1cf9bfe7a7addca481e6b3aa55c467665c9aad97e4bc8d6267aa2377c3129bd9acd47eaaf09cebd2b1c0e6b459d788d73bfa9b92939d16e2947fbee826626333582f9d30823bc95c9f339f61e58b2ebcedf1577fe36a6e41307cb49936f8173cc6d7d9b24ce96891716f832335fa2e2b238aedaef9829bec3b34668933c797ba69cbcbd44f2f2de566a8db1e46f6b4a217170ef7a4921d5ec56265e352b935a3ac771fb7dc597938a9cdfa9a74f66cae9d35ba44f7692f409475f2c75da9932274f9d3ea954737ae319b3bd29d9c5d3d2db7ce1b60794b3e46d61e664e41d57bd6a04a80d63cd49d99761ed12c975c092a683296938c17e46b50c71b32f9e3c1d31e1db9a858ff3237c6bacaed3df50d789f9a9eb74c2d4ce32a8bde9b9193bf951bb33a6f67641d5ee62ca0cedeb2f0616888fd4f1ee86e5c21157c65fe89245219e25528f81dbc76d060d52c2a79345bb7034932b8ab9ff9a20ed55036a0dbde12883e5efae26a710f9329d2d0b303ad5ad6561a029a14508a8d98690cad3f8d00ffef62d1aaf90b4cb66e6368a54e463e9d1cd94fd797ae4180ccce1060ef66aaa07846c3c2074373d8b579473532976bbe3827b60312ccf10c37cbd66f6c4240f092ab997292388485f5a2fd1917f2f9337727197c90b392af2f14c0df5cc220a9e1d9204a2601a6572174dfc42b2d43091a5e8b4c0b25d2656a40f3714e9427f1f457a6f4cf8881084f7c172c448438ef0555fd806933c2a685eeb8b49de31a8e47e98e4d141256f8b491e1354727f9364de34c1978a0cda349185f9ded8107c6f3b4cf8b810846f6f12ce818f0f0a7c074cf284a092076049393184a41c6812ce5ba1f3e3172784ffe7fcab21bc252e7c10a6f92483e6319f9a6763c0271b80fb8a513918932906261b4c6a27613218133ed520fc649fc27331e1d30cc237fa149e67109e2ddeff0e61e96d4f360f619c22be4e5ee2e9cd53cf75475d708dd418b679ce76b9d0821f570d83c99f95bc02b43333bc2d8857a1492cf58198f456f0098ccd4545db5c5de28bb76559a63356c51a627278de73ca57bcac313e87b7fe2d91bd29fcf9abc4a939ce13786a4e9355be1a79a2099e27869af28478dd5a55af7982575ad788f743fef75a990205e2d989714441bc9d2f59d9c350f88802c8e857b3855fe5a6e05761688f79cc30ac4c9a1342693a1c2b93e61aca245f958011264713efda73491dcdffe04bb3bbcc330447e115f38557f07c84bd72cd771eb942c68bb0ba0c8c0e5a2054e9588367d29191487a8dc44ae205869238ab91bf92781416f5f83ac0b5b6b12409673b6282773185539e95260aaf592b12a35a66ce4c4108265395738cbf5d678ae458290722f33d95b43c91b8e04c21c30dcf15424a215343c8fd5832da945f4413523a3b696081e83fcfec6a4a4da3e7eec6cc1d34b53d1ff3de3198f7ee6ef0de3619febc77274cf82283f04c9fc2c762c2171b84aff0297c1c16def7081adec76392f70c2a79020664890948637f402662c2971a84cf69ea4f78be49382fa90b59f0927a92293e8886e032d2f890ac5dd15b5d0eb7757659cab1a448c492812c79bf7d305db1b833192b7f8a03166c534cc92d5ae7d3db239518c75fb71ea99294937139c3fa916ad7014b9ea958762f3564f721cdfc65f76926e1fcfa15ccf05e9dc98cbd70a98ce4e519bc7123e6fe1be4fc6b52b3832bc928d79d4d7a724df632e899c34310ef096f2012a55c24caa02479cbf42aed3f77d5b067066ecf742cccae3484d9063ec3ec0c4cf82a83f0863e85cfc4a2055ff6b6466d95ab62a29bc9f66739ec405143e519a3c4e1a86aab9c2c675d256ba4998c8f23ab66039ded72e7b7db895e2aeab225f117552e71b090b85c848595e23e2edb4d377e3ed7393fcad9e639dbdebe42d92c2c9f5498fc8fe7937d8239fc6c0c73a509f3d25030d71d66265be7448c32f982b1422450b18cdc998ccf812c16af1425f25523d339c2e5960a2daa9c1f7fc931078b8955869838a2b5bf9838d7546c899ebf740e801eef5cc53d7ddf3a1458d52917586b9879f073f2a76345d53c53b270726b4d0ae949b2064f92f926c1fcc5725d2a8277c305179804f3169ef5a9082ec0052fc004f3d5d39b69828b4c313889f08598fbef67707f3e60da8ffbef8269bebf41f3263e35df15d3fc0083e64ff9d47c372c661e688a99cca47a9298b33ba6fa4106d54f6ee34ff54598f0830dc2bf69ef4ff86293705e1fd8c082bfd3ed81093f2404e17b62c20f0d41f8129370fe367a582a79bf0817bc14f3c3c353119cc4050b312f39c2e0252f76f0e725cb4cc2f9f54732a48ac317df0f50c529c2301d6dcaaebc06e6b78ac3cb661b6b93c518ea6330d4c706435d82a13ece847a5968a8a353a35c8e65ade30d59eb934efeb2562916c64e08218cadc0849f1882f0322c469e143046ee6512ccd3e7e48031726f0cc729061cc6b135497094635e72aa290077f6e7252b4dc279edf9b4549024a93dafc2049f1e50f06a8cf51921b85e854938af879e998ad649eaa0fb608978962111cfeee22f112b31e1671b842fedea4f781526fc1c83f0ac6efe845763c2cf3508ffc5a7f03598a79c1782a7acc5849f1f82f07598f00b4210bede249c0737beae708d72990f74f05b2e57cb32b6b40e951f7f25e8be982d17996ce127323d4ff5f3acfdb0676d343d8bcf125ae2fce438ff8b6a74a3f0337cf9bb4a41d68f16fb635a5c6cd2a21dd062a5aca3140af675d7e0004c834b4c1a34071a2c71def32b45e3b6bfe2f5402c4a5c6a0a413dfd458983b0bc76590879ed604cf3cb0d9a1fee53f30d98e65784a0f92198e6571a34dfec53f34331cdaf0a41f3c330ffbcdae49f7c94ee2219cbf67062c322198746c97703f7d8ae623b90ede4fc9e0462963b94850f66e1c35f2a9c632b447c592f9a5e4bc4d1629f31ed704cff6b4cfaf3813c098d263827aa446455368d92f6ec61687d7763b6fe9eb3525c51151fe2b35a1c2d16d1c36d46de57dce9c7a6234c367107b9367e427bf9141f4768c2dc7f83dc7ffede3f8f343d933bd9f506276be4d3c98ec284df60109ee153f8d198f01b0dc21bfb147e8c4938077d93c9bdfaa6943ddcd7e76c673b441e73b3cafe6ca8bc7698b3f5e330c7620e7333e630b7047698e3b067de8a3df3b6c0cf3c1e4beadb438884279884f31e0cbeea79901e8c1331527762a4c4370b3220297f9c4ec238dd1d02a7934dc27959770fab59d64d1de9afac3bc5249cd7cbf832f04167399d6a109e2de6f42d65e918953e9fe5b3e9f15267903c3e470ce6dc57c81b2f9e9018c5edbd237997e27d2637357629f225c0b344b00a4b33acbbf1345372f241210f985c9f3b1dff94829c85e163b0c6e9a6e7f050f310338469ee7f4bc47c0bb7465224068814faae699f8159f73066dd2375b2ee4cccba474dd6b512d64d1635125e3759e1b1d48f7d676139fd31434eef3bda5f4e3f1b33ea7193519c6a81f6a25c121f119dc9b2c46ba39b65c7c812783b5fc69e63d2870787274cf94a177c3f2ef85c8ce293068a5963fc513c0fa3f89489626723c5f5e225330c86e763a63e6d30f5749fa65e8099fa8cc954beae5ff01c7e2166d0b3268376f267d0459841cf990cea801a344ba4613578b1f163e246ccc44d0613bff069e2c59889cf9b4ce4f3d0b0b855b7f4bb0433ee0583716f8ef567dca598f0170dc273c6f9137e9949388f822f31a46ce11f6ff45fb65c8ea5d02b5800813305135351126b78ab35bd6730beda6785aff4bac2a40d2fd05e6501c7fb5f8925d66b264ff099585761c25f37e5219fc2af3609e755e23758f02af13506e1d962310ade07634f957807b9345311db5b36b5e40bb72bf4cc42f35f69e65fc5f1375df32da626e6a5cf06ac7a7dadc9357890781b0b12fcab88ee98eb77596df3196a2e86453be2fa3a932f72df4debdcb47c51075ac6eab680e07b8ea6bd35f08b4f7ae4d7acc5df238b08becfcc73d46ad303f389ebb170f181395cf85ae7ef062cd06d3604babe53fc05ba1b4dc239980f59cd259472785194c998779d23fd69c3f0a7dd843ded238aa7dd8c3ded638aa7dd823ded138aa7dd6a7a1a778a4f0d4ef1ee747f4e711b26fc3383f06f7c0abf1d13feb941f8c933fd09bf0313fe8541f82f3e85df8909ffd2203c73963fe1779984f35ad8572c602dec6e93645e607dcd90028b7f92d47fadf61ed37378bdf35b86f6baaa7a2bafddba5fe3f25373bd174b90ef0c09b2c26782dc6712ce633aff509e71bd5a1f31fd7e8cd50f26567c22c222f0359f5149bee6c3bb36fc307c00d3e4479326eef254e897847c3cf741ccdf7f0aeaef0f61927f0e2af9614cf22f41253f8249fe35a8e4474d9279b7c46f2c78b7c46398dabf0755fb714cf21f41253f8101f93304204f1a8467f763e4af76e95baf247955fc2f9642bbed7c9cdf53a6c4e1fcfe0e28f869cc9ffe09ea4fcf6092ff0d2af95993645e2cff2f151849867a3e8709fe2fa0e04d26c1bc0ecce715855e077e1e7b5a8ce2692f6071a3412c78dc781113de3004e12f9984730f6d140be8a12f9bc29d5848b4febe3ae11dc618fe8aeb19b154bb7c1bc752f9ea44707db15689574ce9ce179a686232414ff6e578b2bf8a096e1a50f06b98e0660105bf8e6581e641b3c01b98e4164125bf89496e1954f25b98e4564125bf6d92cce358eb10e2d83b98da5b0555fb5d93641ec7daa4e2773c9f2382df3309165fe44b457092d146ef63a0db8500fa030c47fb80383663f9bb43c0fcfd21c6b96340ce1f619cb70e81f3c7188e4e01717c8209ee1c50f0a718e72e01397f8671ee1a02e7cf311cdd02e2f80213dc3da0e02f31ce3d0272fe0ae3dc3304ce5f63387a05c4f18d49308ffc994123ffb7188fde21f0f80ee3d127208fef31c1db0414fc0386a36f08387ec484f70b41f84f26e1bcfd71db54902469a8fc19f3bdfe417def178c4756083c7ec55c64bb802ef21b2678fb80827fc770ec10028e3f30e1034210fe27e67b0303fade5f98d68342d0fa6f4c787608c2ffc184e78420fc5f4cf8e01084ffcf203c5b7cc2844fce4f7f9b4618abf0256fd1c84dc54bcb7162ff61ee9f17d0fd79aba1319d878490ce319370be86c3d054b44eb286430383e06cf1999ae5f5e240748e332ce5a6b0e1a2298c7ff186424bac01aca12989794a8c48258987e3efb18d4c82c537a982d6093230c9a3824a6e8c49de31a8e42698e4d1412537c502c098100240334ced9d82aadd1c537b6c086ab7c0d41e1754ed9626c9bcd9677cc0669f5626c1fc6d7642c0b7d9d618e8892180de0ac3911f10471b93605e839e14b006dd16e33c3920e77618e72921706e8fe1981a1047074cf0b480823b629c770ec8796b8cf3f4103877c270cc0888a33326786640c15d30ceb30272ee8a719e1d02e76e188e39017174c7b49e1b82d63d30e1f34210ded3249c57fce7077c43e86512cc5fd60a02bed364621a2f08a8716f4cf0c28082fb60f5825d82d60bb6c124ef1a54725fcce9760bc1e9fa616aef1e54ed6d31c98b824aee8f495e1c547216e6777b04f4bbed30c17b0614bc3dc6624950163b606eb73404b71b80092f0c41f8408cc9b2a04c069924f36fa517a5928c49be959e8d55a38b0356a373b0069c92800d388331c8cb8342cec5249706959c87e5c2150173e110cc9dcb4270e7a158f1bd57c0e27b188663ef8038866395bbf28095bb1198c62b036a3c1213bc2aa0e051188ad50151ec88695c1150e3d1982fef13822f8fc1845786207c272c7054050d1c63b1b85f1d30ee8fc3e2fe9a80717f3c16f7d7068cfb1330c8eb82429e88495e1f54723e9657f60d98572661eebc5f08ee3c198bfbfb078cfb53301c0704c431150b7607060c76d3308d0f0aa8f1ce98e083030a9e8ea1d81010c50c4ce343026a3c13f3e54343f0e55998f0c342103e1b0b1c87070d1c73b0b87f44c0b83f178bfb47068cfbf3b0b87f54c0b83f1f837c7450c80598e463824a5e80e5956303e69585983b1f17823bef82c5fde303c6fd5d311c2704c4b11b16ec4e0c18ec76c7343e29a0c68b30c1270714bc1843714a40147b601a9f1a50e33db1ec775ad0ecb704937c7a50c94bb1fc774608f9af10237d6640d2cb30c16705145c84e1383b041cc598f07342105e82b9c8b9415d643956749f17b0e82ec58aeef30316dd2bb0a2fb8280457719e6771706f4bbbdb0607751c060b737e6161b83ba4539a6f2c501555e8965934b42c826ab30e19786207c3506fbb2a0b02b30b52f0f41ed7d4cc279bff715a9a464927eef4a93e0deceee95a9084ef2c9a32a0cc75521e0a8c652f1eaa0a9b80653fb9a10d45e8ba97d6d50b5d7616a5f1782daeb311fb93ea08fec8bf1b821288ffd301e3786c0637f4cf84d21083f00637273502607626adf1282da0761c26f0d41f8c198f0db4210be01137e7b08c20fc184df1182f0433157b933a8ab1c8649be2ba8e4c3b10ae5dd012b94476015ca7b0256288f3409e643c6ef4d45709221e3476182ef0b28f868acda777fc06adf3158ddfa818075eb63317f7b30a8bf1d87497e28a8e4e331c90f07957c0226f991a0924fc4243f1a54f24998e4c7824a3e1973bac7033add2998ca4f0455f9544cf29341259f86c1782a208cd331959f0eaaf21926c97cd5c46762c117ce3e1353fbd9a06a9f6592cc3f44f15c2aa4937c88e26c8cc7a610789c6312ce17c07a3e46b000d6b986a7656fe7ecc6f8277aa3b06c79dd962b7fc100339b4f65135fe6a3d7ae61aca9f31cbe48549598115726281993d3bd9463ac1642dd4bb377e0ca0e62f8e4bbb98e51ee07052ac515fc2ebf93f0345da47f99a703be18e3d301d3830f9b1c781e96335f0a21679e8fe5cc972972e605d8d35ea178da8558147e356814be0893fc5a50c91bb1c47e3d84c4be1813fe4608c22fc184bf1982f04b31e16f8520fc32cc2bdfa6f0cacbb1a7bd43f1b42b4c4fe32cde754ef4368033c27b1f7fc0955856782f6856b80a4bf3f74348f3ab4d758401ce6e3dcd7d9f203fae55ecdc1feedcf70f4cb502fe658fa4b3dc83e8d3c8e8b5e6a348b9bb3956db34fc200a6225ed3526a7e0d5915851bd38c53c51a708d71d3e34b9035ffa33d63f09edba698224ee472271291e674ed66bb188fb3145c4bd0e7bda27144fbbdee4b2398cfc5d2779ca15892a6d359b2aaea158bffb53931bf37abaa8acd36b87b8f667f1f78574a86076891bb012f9f3a025f28d986b7f41e1da37614ffb92e2693763b58daf42a86ddc8209ff3a04e1b79a84f3ce9c6f62c13b736ec3847f1b82f0db4dc12b9767e2b27a095ec1bf69963c687d974a1bddbb38af3b3037fa3e0437ba1313fe4308c2efc284ff1882f0bb31e13f8520fc1e4cf8cf2108bf170b71bf5084b8fb30537e0dc194fb31537ea330e501cc94df4330e541cc943f284c79082baeff0c5a5c3f8c49fe2ba8e44730fc7f8780ff514cf83f21087f0c13fe6f08c21fc780ff2f28f02730b5ff0b41ed2731b55983806a3f85498e0595fcb44932ef486cd020588fe33398ca0d83aafc2ca672a3802a3f8709ce6860f832daf14c75662c70aa2dbc7ae456a5568abf135f6f5e2e3a2f78556a5afccac447c4ddaf6f973895a1b5e2ea416c89f3335f9c2d7624ae11d51f2e37714f3e2b89779314b3c9a2b2b5523cc1bd37516572ab6e6eb789f78cab5f9e63e1922456f08ada1ac63f8a9a787a81a83a2a995ea90b9dbbf8d7a6fc50df84516f6ca23e2a4edddbe9b3405469cb657f995b715d22bea25d256fe77ae9fac23528f57313c497b57965945765fd58f43c6651139345e319f6920bb573ade15ffae636f10a7bb9a8a29749cd6b97109e7d2f60f63535d9b71363499e0bede236143afeba2f9be59c2d051d9ac9750fcfb21731cb9a992ceba75936ded1bd52e44bd7aa52e728e73e43e49c52e7ef1535744de4433f7abe84e9d9dca467bea667e29990fe14f16aa53a850b1c5d4d6c61dcc08e87951a2f6356b6c0f251ed564e62fb88aeef72995bead3be5730fb5a9aeceba3d957333a4c11fea63e73aeeba98efbd1f0554cc356a9e474f5443ffc13da9b8f86c5fe35ccb2d658a9638eb0c9beb7e88d0245b2fce467f088bd50a6286fe8c8f365d1eb98455b992c5a885ae4d5a0b6b44b4546aa578595b66f6024da98480c09216d79d4e75fc85d63ac83b975a5729f79ef4dcc8ab6262b46a3569835af929a9788327799d0ae66fd2879395b97dade5b9855ed4c560d4363ba5ed62a3f4a16cfb13309597e2c791bb3a4bdc9921149a277705bccd2fc58f30e664d87ba97b5bcde53e5fcd850977817b3afa3c9bea9497393f7038e754b3dffd2fd58fb1e66edd6266bc7f8f0cdf9326ea49692c9de3fea123ddec7ecea944a9e836fc3c1f39c599a1f6b3ec0ace96cb2666c4a796ebc43b4188c1a0d9ee7eaf686b219b3ad8bc9b6e901de50663b7f276a26f519633ec46cee6ab2191f9453b366afea19ab644b4f325ff4a3f14798c6ddfcd731bc71cbab7729abf9491b3c0a9a3e80e3c7aa8f31abba9bac9a98244ab8564c969d9885862886b7b099a3685829f70966630f938d43d194e36d89cb9c8b94ad331c5b4b9d2b2a45976fcd78187644ff14b3a3a7c98e9c94eb83536a2da7c288729f61daf732699feba39cf5ab7f5df3cae7980599260be6fb88597edf19bd9e95cef6cc2f3006bd5349c564b50abfa958d768f02566419f54da036b46bcd4da6af0d8e73d13563a7d8559b98dc9ca0929d529e63b172f13da160aafaadf5ad3d798857d53a9b727f3447ff5f664e9579728ff0d66573f935d3ba61ce5fd5985a7565d6cfa16b369db54f29c9f788997bff47d59df6156f64fa51e4f51974addeaba46d3ef319bb34c369730da7ee06a3647d4c54a653fef42d14756166fb5ab2bc5e039e0078cd376264e0b8839e1fde5c90905e7f023c6617b13875deb398f50e79e9f301a3b98684c4eb12e324dd4ffecaa8ffc8c593ac064e9a494ea2333c500585e0f513dfc782f78ba6a25bf60760e4ce57d5a2fb3270a4b6ba61e7c474ee578b8a5f9af988d835269ffae6963a2a58aebc9afe3de556488d7e61e4fdcbabab535fe86d9978db5f424b3cf2d971237a45e4b0937d57ec7acca3159b52864cfc4f29fdfebc365f207c664b089495ebc54f68ea7c2a6e37bdbf5ca9c6b798b5191b1edb5ee91f54fcc86dc54c61dd094a8e1948e7f6196e5992c3bb1deea4cde3186f38584d5cc9d26eaa7dc4df47dd7f738c3bf31f2434ce4a7b15447ada55233d1fbd153ef63af7b1efa07b3772896874c716096c8e9eb44fed9db93a712a3db54fe87d162493cbd538b2b7e2cfb17b36c98c9b2ea3a45383596cabcf4885feb3039705c5318f2fc50fc1f467138567b0d4343afefe86bdc508c8bfa0fb37384c9cee10c6be1ae39a92dfdb6f08904465b4662f51dbf63bc4cfdc7e18ef10a9b490c6332cac4649e2f26f9a286e3adbbd38d78abeb48b10618811d536bfd4f3cd5cfe81d6fd98e9f09ab3c6b8859391a1b2d614e83992212ad7072b16b2ddf5f1f9275754dc146986d634cb64d493105531bd19dee74ccc06cdd29b5f621b3ada9f5e3a437551b63968e4d6d1c82d9d27c518f2f13654dfddbd804b3719cc9c69929e7ca19c2672bea6c1db5dd4d31bbc79becde19b5db3c3a77a27364b5a85f713de788b71dd5925d5fe56c33cce209268bf7ac43dd03cfc376d7409a63642662112d7532b3e22d17dc47f6f3550709dfd21698a5f9d8689dd42d55f5686e6ba9bc6b8dc81561e5d99698f693b07901f0a9138537ba2d28aacfb6c03996cf560bbfad2dbae8e7e07d7eac688559313995da1e7caa9fda9ed74afc4c58b584d6989553b0564c3ff155f9da329658fc0ccf2f7089343f366c85d930d55f6e81cff7ea5fe53326f8d1be0da6fd3493f63350ede731f328eb74c4f479befb49da6256ef8c8d54a9dd6ab72dc95b8a278b1261a7643bcca6e975b749cd1f5a2d5a7edd2bfc944c415b73db6336cdc0c6ecd56e93ca55bcfda3526a4cd796d301b360a6bf9a335e9f4a3e9fbabeea101d31bb6761edd2a97b63dd532e0c9fdc1ab36c762a3d0cd8fb9e9f1101e97d07ea84d93bc764ef329f65b47781bfda627cf2b3de6502797fd8f2b4b47574c608cdf5374adf6445cdd6677fef887eece882d9312fb511d209b6c14748d7cd57bb6216cc0fd2ea94daa8a4f4b6af75c32c2d085eaef0babe9f568874b68277c7ec5e60b27b166ab7de123551f46dadb4b82daa0766f9426c1ca6df9a84b70cf233f33f9df5dc9e18875db0d1f3660dc68b76075ec2ce176f5e95a2efc75bd3582b72271fb3e0efadbf2ef58a5e985dbba636063bb5fe9de4f328d31dc532319b770bd2a755fb8c96f45ad91bb37277939503518f75c7ca94d4788f2911b9b6307e3eac88d307d37b51909e8ddae62ea737aa6e83d9b8185ba9c26f7992e33cc54feca8ab257d314bf6a8db7cd85453ab2ea3b1eb3aaeae1f66e39efedadaccf361752deb3e93a289f3138bb570fe9c24eab8fced3cd13254c5b27953a6d04f7d28498d971be419319738ce9fbd52b464963bf95ccd0a497c1c0993b0a481bbc49ef8d73fc6a172187c3892e1db1dea1d0dbe5bf3d6485e7fe7dc2ac59be92087973b6242ff961766855bd3f78e61e4474dd6d56e935a369a8f242c1235081ee997399ed1445aa46439a47903ff1667e9529eaaed65aa36c8e6af94b11deae84db56b51c89fd6d0ec439d6a908579dba4bb2b60167367ffc7f812a04be4e0559e738b4425d41dcec01bb4d63b7f25868bd6fa7498674d4f1f2804a81179b58a5b005e524de2ba0897738364a5ac6aadd889b126190d7278aa2ca344d756a04b78dc2a393e73b510394d46be28209b939140564489acbb40b6c429949718d02d709e522c7d6faaa8e6153377bdfc2ac79828805c9c9500596c27c8c19100f96aaf04c8124a905b7940f2ea0a57a154163b1c59147075ef90c0b59c12172ff4d49b8f1ee9cac0f889e248607b15c4bd52fa529617e670107781ecd62b157b93e299380ae8368e4ca05b4189ae95403759dcc033e50a4f65250aa8ee031592324a548d052a7728756544aa1e39c08ff6a284d35cfa51a168b1e18aae8a4c666b3a2b01696f3bab15799100d9b96f02643925c8960c7fad8a02a8d16312a0565282eaccbc2f5115e2a5d805b53b7397ba539976866802ae8804c06fc62600aea204d8da9365dd39e3e365abcada88785bf9b804acd5d4b57d557d8d6eb5f564506dada0c4d542f8d624d136b7463c3e4aad1abc7d5761da87be8aaab2200ffa517b7fdcd03481aa92125553900155588f02a0c5a09a5a4509a8034be54d717d6432e188d11c5c930c4db83ef6a7ee3d02fe68e37d17bc68e0602bc4d16ae6aec8e0e9cbe0dd8fd6695e0dfb22b29284ecac141bacb3522825b37c340465d5121fb3526883cb0ad4e019e4eebc4077e73a77eb6fe559c62098e5b38d28cb57a4c84afa4292e5b31728ab964699ac3ad5eab36aadca66a12ff1890e5f73476d0eeff05df37fbc2f3687f7c5aee510f837f8f83fb73c5b47599ef59569cafd820f78aa00beaa26fecf76bccd45926c98468eae5bf71aba793fbbacca359396cd3c255fdf540caf4be9c73fa5adaa0debe95fa397307784c32a811a1f3db5c4f1d51a0d36e1e1ec4885f31d50a3dfd7269cb991c4b90df0cefd6cc29917499c1301cefd6dc239249238d7029c07d884736824719e04701e6813ce6191c4f930c0791025ce01069c61ac11465aa1e29f7825c17e2ec07e3025f62ecc5b6f7505556c7135d44700d00de9080ba5686080eaf31aea303a9c2da970f2f74885f3109b70e64512e7ad00e7a136e1cc8d24ceb300cec328716e5d4b1dc09bd187d2a1ec4a85f21f80f2705b50e64512e5fea0083ac21694b991443904a03c927e40e312369cf1af1bab86e169a2f1bb44aef458211abcf90dd103b90164efa3d231e20a2f78b04f1cd618c81d1ed63654586701ac47a76b5837f7c252390b300d3eb91b15bc1300bc6328e1b501f0cab6982cbd1ae03bb63e8b19288e341b37a142f92740791cfd6888448fa0fb0e5e20b3b45ad4a452fc15bd36a4bb00c6e3d3314670b08c8695e9cacc6ba8d0ad02e84e48870716c90e60fd533bca52d28c5c40857101c07862ba46a96e191e380fa03ba97e8b93a8b7415e0cde5a4e4e47661eec796b51a7d3e49164a5f252e091a7a4c323b198e8ade0107a2419ca2100e5a9d453b6d632bef691bb0646f42a313d00aad3a807a3aff08caf1b2f6a8135668647e03db82980767a7d408b62e3411300ed8cfa8d6f512f71af0628cfa4f63f7eb13b62729e18b85926be8547062d9b0a5a5700edac74b409c21a5f6a0b0112764a0da3c2fa20a8fd9d9d6eac58b50536b49276052ca7c2ba17c07a8e8d5849fbfdc8b0760058cfb5691815e97809b2da632380f33c9b709276f093e1ec0f709e6f134ed2e12764380b00ce0b6cc2392492380f05382fb409e7d048e23c1de0bcc8269cc32289f32980732325ce4eb55698e0ebe5e048be603e01605e6ccb989ec1946d4564fdd67fb004ca4b6c419917499415c02b2fb505656e24517607282fa36e4172bf05cee7ca2659fb2d02454c5f90952fb77354d99008360c1f01b05e61cfc89e9111ecf81a01b2f595d40ba4793b2626b2d5920619b6d654d81a010fbcca9ec100232258737c1478e0d5e9a886a73ae583303b934df8980afcf21a9b60127a2619cc8900e6b536c1246c472783b91380799d4d30092b406430c70098d7db04737804614e00306fb0096614671c8e05306fb40926e1001832988301cc9b6c8249d842490613ae0e7ab34d300957c320833912c0bcc52698844d6b64307301cc5bd301131be7a6f7eb106673b226b76c00f3369b601216406430870398b7db31eb86308393cdbad90560bc8312633b969875b3523ebc504c9c8bfa5c875100e19de9e8fbce61894fbe72756bae731be59988e300cebbd2b9ac52194b4c2fc6bb6da3d73d763068c5bcdb36a084e53819d0e600e83dd42bd47b3b2608c7aa93758965800c7d2f25ae66ceceeaf8fabd6a6d673260bda980b503c0eea304d613142889ed649971bd0b884f6370f105e2c2852ceb9602b4f7db332f91b0d59cacda5304503e4089b2abd14bf952f08552996af045ed347827d9f4931b01d2072991f6d04aea72b17067757c35fb2d6d8ed919a0c47e28bd4309aab0ef1445a02ade12f8e3c3e9288860439a7996191f99b19255c8b2ddcdf084ad94455468e7018f7cc4ce097c8485125904bd0e607dd4a6453a493f7240d6fcbb3b08008fd9849374557e329c57029c8fdb8493f49b1164380f06389fa0c4d92de5180a87b292164cc36344508f0211f4491ba112b6b293413d12407dca46a884ed9a64501b02a84fdb0895f04d890c6a0300f519eab64dfeaab9cc21504abde25077aa22a83b28829e4d870f26ded84bc4add5ceebe696f6b67e15f0c1e7ec99434138e68dac916e3b8072537d0e39f0a2245d20820ce69920b33f6f134cc2a1ad6430cf06305fb00926e1a06b3298c700982fda04338a1d1ba703982fd90493f0cd870ce66100e6cb36c1247c372783793880f98a4d30a3b8aeeafe00e6ab36c18ce22afc070098afd9049370721f19ccf300ccd76d8219c559e41700986fa4e33344c3d896f919a24301c837d3f5bd1c25354df0c886591700786fd933299ff0c591ac75e81ed0a4f1763a32f4d02d34431f047cf29d740c41506d97bca57c1d586363cb1a1dbc1ff0cf7729b1b69258f983970bb04a7699a30e19b80c2a700cf8e37bd45351968bcbcb9c0b577816729aeb502911ff0911920dd8da16207c3f1ddfd031fb1ee128f5e654e81a00741f500f67e5d56df879f40221a054cceaa9143d8aee1876780d19d2fba9909e0a906eb671d96fd2e5eec896fd9e0e0a980f6dc44ada524986f537e0ad1fd5e7d480e8af673010a0fc9812655fe6ad59f20f7a547a06b2a63ad8951033d960d7cb4120f8245d1f61e543af13332dd2f0fe4386ef16e0a59fa6735e64b173299fb2b2a58ddb7800f8e367f64e1720444b365d2006d07e6ed3faeaa4dd1564ef496f82acff854d38732389b305f0ce2f6dc29917499c3b019c5fd98473482471ae0638bfb609e7d048e23c01e0fcc6269cc32289f30680f35b9be604918e84237bf55c044af6ef6cc29917499c57019cdfdb84333792380f01387fb0e5a31fa4e387c9bad99a82b8f9a32d28f32289f22080f2275b50e64612e54280f2673bbfaa4238f0956c09a96210377f490756b8c41e5f5b860b9cc6b6b4a5f6c603acbfda33d12a8a43b37b828cff1b25ca81ccdb989c58f06cbef38415e2af12b43d145e3351bc3df187148b23a42da3f3a9c03f057cf8f7740c961decfcf72ef1b3e50c095b0b60fe61cf3045c2ee64b2ce904b4140f8d38ed9e913e4883b3e408734b36f8e1141bd1a40fd8b122a1f66b4c69155ec1ce022e6c96df4fcb013c8d27fa7734db9fd64a75b3e2b6335073944bfb7f366e08bffa4abf79d0b713d314d450d59ddf30ae097ffdab3126714e758ce0428ff978e2a107c3b9a141f190f0774477785d80100e67fe91c1552c46a1f0f1fc5aff3ce04719235b40c28e1ab2619d02a0034661bd028ced8d801006d601bd0287e71603400da9012a8e9dd27953650c2384ad606fa2928981ad908358a0dcb5f02a8193642258ca76450df03501bdb089530a69241fd10406d622354c215bdc8a076040555531ba112f6819241ed02a036b3112ae1c81132a8ad00d4e63642255ce98b0c6a5b00b5858d500957af2183ba0f80da92126aed0d7b51ef43ba0f94f9ad2851fa9ff541b8141059937313e099ad6dc2991b499c8301cead6cc29917499c2500671b9b700e8924cee300ceb636e11c1a499c17019ced2871d6fd7b45519cc2bd0994f0ed29b17632604dd60b1ac575139f053edac12698515cecfc3400b3a34d30a3b8d8f9d300e6d636c18ce462e70066279b604671b1f39301ccce36c18ce2409c4200b38b4d30a338a27e1980d9d52698515cec7c1180d9cd2698515cec7c0f00b37bbadf853098dee10d849524b205d88e06587bd8889574a22c19d6ce006b4f4aacbd0c58cd6fee53e42d69fb5a663915dcc9006e2f9be11256a7c8e00e0570336d864b588891c1ed05e0f6b6192e61758b0ceeff58026e1f9be112beff93c1dd0578ee369470832d3348d81a40b6cce011006d5f4ab47cedfac43715f259d4bf03db1a64f87e36f53691aee244d6dbf40dc0b9ad4d38495b4cc970f603d9babf4d384917c522c3391be0ccb209e79048e2dc17e0dcce269c432389f31480737b9b700e8b24cec701ce1d2871b614d2e0774078add2a541868d6c0a587f50820fa0c4b68dc10b53ada4c3c63dc241398d6344900f07be39300a9009479590412e059007450132616b1419e47741b8c88e0264c2562932c82f03c83951804cd8234006b925081783a30099b067800cf207c09373a30099b031900c7236f0e4bc2840267cbd2083bc15803c240a9009bbc0c920cf059087460132e1806132c8e300e461e998f787b53b2454276efe267b79fe1b146fc36d4149da564b86721df0ca11b6a024ed452043d917a01c998ef159fed7368fe21a14c781cc3e2a1d85935a7d8a5fcc6faf60bcbb7aa14366a26340b12892d4768273235fec78ad731d6f8caca47d2b23eb9f5d0e7c77c72840267c2b23833c07401e1d05c8842d656490c702c863a20099b0a58c0cf2200079275b6a0da48b2e90d51ada0194636d4149ba420019cadb00ca71b6a0245dbb820c65314039be3e17a949db58d7dda8508e660994132851b69328b9d7793fc091a6b5d0c9865d960184132911f6d6caf415a2650a6ba39a27deaa8a9cdffc8153e5b5843efa1955dbd4f520bbe75302eee0ec143ad6178b0ad07c59092a724ef191ad4562edfe32190ac8300ea0f2d32ec04f27d5670104c5917a24d91cc29f00cac99428fb6959bec2f9cdb3b51b37dd6afc7c96cfa63b95779ed14be4b139e0baf1ce5d65b4a0efa7027d16c8fa53a8b37e329f559692be761650617c0ef8ebd47494f2353fb315f5527e0940382d1d9e88d539139e4898a1c93c7104c0b873fd1642aea872ea4cdd970ae52520364eafcfb7a07c51515ac6c8bf06f53e15caeb8057cea044d951a21ce2fc4fcca09ac6b6944f10ae0320675282ecc3f477213e50bd385eabdc72179dbb1764fb599488f957f4ca9dd3eb44f99df8fc60f4226507e095b3eb33527adf7ca2b816da7a80720ef51cd30a111f55a69e27326fa1c8f264e0e866f1017073d3b1864f4e8d2af89653ccec0160cea384d9d4d929934549be1cee153ddf6b0e70cd4fc78206894f64b9d97521e353c9d6888bb6b42f899e0dcae382fa2d5ca2fe46733df0d305e9581b42f96989f1339858a75914bf92f70240bb301dc3bf5269fcf54e64201c5547b63cd76290f977b1112be9105a32aced01d65d29b1e61862aa9f56f50201ba88ed2d1f992ffa880ad3d348f71615fe6b40b0d82d1d93d0f1b1a20b3c91770865b1d6920ae7bd00e7ee36e11c1c499c0b01ce4536e1cc8b24ce4b00cec536e1245d5e960c6735c0b90725ce66cece72d1e6592296e0728ba6e855fa3b02607bdab4e209e982b164effa19a0eab4c4269ca4cb1a93e1dc1ee05c6a13cebc48e2dc13e02cb409e79048e23c0ce05c6613cea191c47926c0596413ce6191c4f90cc0594c89b33fc3dee2d5d416deacb7d2f9e17ff30ee13542e4a478b35f81a096862189b3a9600f05d5a8125ba61790be6092b595fe0e502eb70525e9cb2519ca55200494da8292f4c5920c655780720525ca81ccdb39c26fe4fd9e958ea00a31d086ab840db181d74c1485187f483173c7801246d6f954e09f04e1a02c9dbd52e50ec8aa2d7a2cd3fdc0a7f7b2735102c2b59fc81625381678ecdef6ccf488e2574987010f2da744b9154b0cdb291155ff95e91aa64336b9703ef0c395d4d30e968bd345866267a2289078275df4dea13a0384abec192f4f386b98aca1f931909557530f5d542df3f39d0bb9f7153b34cac5367a3eb803f0c10a4a706d9d9d2a61778580352d5ef39c270777af6184332fc93c2f1300dc271dd51c5583e4454769fcf496360bb30c64e8ca744cbc86b1912b512de607af623b8bf6a48aa4bd998480c9fa321b02bfadb267dc7c143f7bbd1b40596d532f3be9ba34649e590970aeb10927e9da346438ef0038d7da8493747d1a329c17029cebd2d1620461a6fe8d3bc255eac8a6618f0765fe7a3b07dc127a2cd980dbe100ebbee998009bc7b6cc09b06b40d6dfcfa6483a9832bb9345d25d01cefd6dc29917499c97029c07d884333792380f04380fa4c4d98de9f3952a45775cb5e854dbb2deeab3405174503a8aa2443f67b2810cd12b8a180079b02d20a33877ee4590cd37d80292701d6f32906380471e620b48c282870ce40000f2505b4012f69493812c02200fb30564143f2f310b803cdc1690848366c940de0a401e610b48c22f739081dc00401e4909b205c3568d2583d68b0a5a1b50d539ca9e914384450bd97b4c6fe07f47a7e3e5d06f4b6514db29bf03fe798c8d5009c7b89141fd1a403dd646a884ef3a64503703a8c7d90895f0bd870cea6b00eaf13642256c272283fa2a807a828d5009db8cc8a0be02a09e682354c2772332a85f00a827d90895f03d890ceae700eac9364225acfc9341fd04403dc546a8515c15ec6300f5d474bc9ce2bd9751efd23809a03ccd9e6905845ed9970ae59de03dfff474f4a9ab06bb95ce89d2a438a3b89cea7d00e7199438f9e790f86838b8a85f811050eafcf0bd496c3de323e9e0156440c93ea1730ec8ea675202e5ab0caf716455b0a8af17df1e203b8b7ade9a778dee058ee462b18824ffe8983b42ae3c82054c2b80f06c4a845db5a8c887b7ae93551d6f6c4cd37bfa1a2aa4eb41643c873a3242a4bc63830bdbd28a9af300d073d339af6db643a29a457f5e5b6f90c9cfa304c897e157332ab99abc5426c345b7961cc075be3dd3a908fb81c83ad7f603282f48f73480d4d6e3206c5f275b8fe37c10112fb4717605e9d23d640d175301d68b6cc44aba4e1719d65f4110d868d3727da4732dc88aa7b700ce8b6dc2493a39800c671f90e92fb10927e9d415329c1300ce4b6dc239249238ab01cecb6cc2393492384f04382fb709e7b048e27c08e0bc8212676b0657dde2cd70699a804a5685bf1994e257da34c58f74397db2297ee500e75536e1245dff9d0ce76d00e7d536e124fd3a0119ce7301ce6beab31bd79bd1a3385de05f80f25a5b50e64512e581a0f4bece1694b991443909a0bc9e12653f862dfa3cc7b9c905bc25af447c19007d032568b5ce2b7ff072815ac95e252f895e6b7c0cc4ce1bd3d1bee97f1967429f245bc6791ac07a13f50cb6d5e9ed93cca682d60d40bb391df32753ab1245afe8790280bcc51690511c6bf9280079ab2d20a3b87cc4fb00e46db6808ce2f2116f0390b7db02328acb477c0640de610bc8282e1ff1110079a72d20a3b87cc4b700e45db6808ce29bf75700e4ddb680241caa4506f24700f21e5b40124ed32703f90300792f25c8c68c2f6852246ce7e3cfa3d77fb83540751f252afe11ee4453d9eecc5d5e990c586f2a606d01b0fbed59f785b0724dd618f61f40f9403abab872c46fb5759599c4dc2f48a9a5bed5f72ac87092cd7a980b703e68cf4c45c2f7e7be5428ef006ddc0f51a2ec215156b3158c4f1dc13a0e0a44f32c1fa1ee7ebc6b256d0bcfbb5460af053efa703a273ba9d66d33de79f46ddf1fc588905e037cf5117be64a1036e49215483b02ef7cb43e2368bee86458c6c8678cbd4f85f20ae0958fd939ed84d043c93a5f9f071efa3825d64eb596f1decc1ec52f96ee0a7cf4099b6046719ed9ee00e69336c1246c5223833903c07cca2698840dbd64301700984fdb04338a5fe79b06603e6313cc282e7cbb3380f9ac4d30a3d89a940f603e67134cc2061032985300cc4d36c18ce2777a460298cfdb043392efe800e60b36ce10271d3e4d3643bc1c607dd146aca4157932ac9d00d69728b106fbbe29614db4880aed0a80f6659b269292d645c93a827f66099cafd88433379238b705def9aa4d38f32289733ec0f99a4d38874412e70100e7eb36e11c1a499ca7029c6fd884735824713e0970be49bddaa01a0fc217b2e555a1c972f1bc348c04211bbe700a28cbdfb2655a29694308d950c2bf00cab76d41991749946b40b67ec71694b99144d903a07c9712653b1021bdcb2fa769f517b2d7c7492063bf478990afef5c243e74c81fcdd55c28cae8358c740a3359e1b21d00f7be9d5398097b29c9a6309f08b07e604b74241dd741161d5b83e8b8d91694799144790840f9a12d28732389722940f9513a66f77054ee6711b8aad344d95dc2d6a7abe42603b92788941fa773a597c4c20fff37567ab91178ec27e9f0d8c15ba8c72e061efb2925c80eb544516529a93f1650617c1660fc2c1dfe38720bf5c71500e4e7e9e8955411148f975bca0497db41ccfcc29ed918511c045b02bcf44b3ba71010f69b9395ead7020ffd2a1d9d15a92e2c3a8432c3932d2c7a27f0d2af6dc2493a568e0ce71c80f31b9b70e64512e74680f35b9b70e646126715c0f91d25ce96421aaf61bafd92d16e32ce02d8bea7c6c647b655c9ea3a2fc1f319f1521364fde02d00b61f6c697c232d56c8de787e01287fb40525699142867225a83ffe640b4ad2e2840ce5d600e5cf9428dbb044376e952c58aad3d58c41f6267313c8d4bfd8b3144f14e748e6014ffc351d2d94399ea635753a4d1e49867132f0c8dfd2d1b056dbba3153e40db0a79cb461ad9c0aedce00edefe99844955ac35a6e2467f1de0f60fe6113cc28cee27d00c0fcd32698519cc57b3980f9974d30a3388bf71e00f36f9b60467116ef4500e63f36c18ce22cde8b01cc7fed59ab90b09b8cac71ed6e5075ff1f25ca6eccb48ae63c216cb5a8ca6f396b69ae04fef91f25d4ad0054b7b9b72a5d6f4164939ea70078ac11f13749b9c7958a4598f715539bcbc5a57c9c4665049b7cfb0074316a747c407f95a3c01ac63f62b4da11b15a8c532f62516c2ddf06a06b4089ce8d8393e28d1713053637e2ed2d32ef04e18f7b4b91939d2d7f312e8e600be556006a434aa8755f6d83b0624e162177036576231bb1924ed623c3da0660cda0c4ea7f2c06e18875b2deee7d40e66f6c134ed2b91464386f07389bd88493743e0519cef301cea69438559785773ec596d265b117c0d88c1263b0158a081b39c8a698e680e2a8793a323c96dd6bae5044d8004756c17f03786a0b9b7092b66792e16c06bcb3a54d384987c590e1cc05385bd9849374583519cebd01ced636e11c1a499cc7039c5bd984735824715e0970b6b1f3fd9db04a4ff6fede0d606d6bd31b12e9928e646f4885a0c2d4ce269ca46b1092e1bc01e06c6f134ed2613364384f06383b50e254b379b1fe746f468f5e1bfd3000b2a32d20a3381c7b1000b9b52d20a3b83cd90c00b2932d200947c391819c0e4076b6052461614306f24800b28b2d2009470e9381dc1b80ec6a0b48c2191764208f0620bbd9029270fc1b19c8a300c8ee9420b761dec54cca9d4b8bfe8f2c0575137833ef918e060fff8b3e1296ef648b3e2e03bedb9312ab1a539c6ab31c61eb1159a3dc4b00662f9b60127ece930ce6eb0066a64d30a3d85cfc2080d9db269884cd1d64301f0230fbd80493b0002283f93080b98d4d30099b3dc8603e0260f6b50926e18b2619ccc700cc7e36c18ce217551e0730b7b50926e10b2719cca701ccfe36c1246c062183f90c809995feb7f742c162b5c0b7e5bebd9f03dedeb7a384ec6fa19428ae9c9009506e4f89524d0ce46b622ba9691a6b4cb6807305c8ec3bd4af1fbaa2dc59bf84257a5f2a9477013f1c908ee663ef823d5ce12d632dec7ce09303294176d50a205eb8ac932d985eef84ad9a84c50dd9e4e94ae09b832891f249ac55c2ee0a919527b2a8cfffed09bc313b1dd97ac4169aad8f072073d251d460dd6bde2a4f145791990d500ea644d983e98b9a2d74684c74942e1670d5768273319fbbbe5654ddd788f84908b63b15d8cb00d85c5bc112b66a92813d0380cdb3152c61db3b19d8d300d821b68225ac329181cd036087da0a96f07d9d0cecdd00ec304ab06a752455bd5f2ed60071db8d92bd7c127a2bd9cbe74650c11f4e09950f3e8715fcd9e266b7692e7acd70bd802f8eb0a74e4a38d683ac4eba2f4039921225ff7aaff7c3c789857faa2238e2a83100378a129cff39e9511c73d41844c21d6dc249baa60719ce8100e7689b7092ae3843867309c039c6269c432289f3588073279b700e8d24ce0b01ceb19438f94e99ecdc8d1ea666a0c41e4789a9ee9f41246c7c23ab8c5f00bc6f7cbab1629571ef7876c25743b229fca300d6093662255dfb880cebf7220834c9d0844fae215c7581b919b44cbe000e6253c43b4b894052e4eccf10ad3fd56ca9036491f3e32f2df6707e4cc76362d8c224b69e5588a35c5eb190bdd239cb35ab62393c4b4fe4aed15aba46568c7fe9acd0b80e6d56ac998cdeaef6bb33775530f778e28bec89e3cd9de36b9ce75788e31398bb386bb13cc387fdacab7186cbe20d36bcef2b9ff1c55ab9b364c51a0bbd5c926b3dd28bc5d0a112c753dc6d56ac9d90b15aeaad77454e74de22799aeced5cd901b57606f30e4aaa926c12f6cf135a963977a8730906de734d9d73fcd9cb9cfd5221b9545ab4563ccd3dc29d2a166b2bfd6895737c26e34b76174a0b0b1ddf2e7464708fca1eee5c16e3c9e7b6190e8ab7160e926bb6ad947bea78ed32b917259796cf5d25668e22e5a1f97f6d16b95996dfef36ec9508a9d36ab5b476fbf0bcd43249aa648fe069b125db3f89a7bb4c76e1a69d84bb2f00998f3707bad98bffcbf87f8faa4e8f84fd0300 serializedProgramBytesString: - serializedSignature: 49c3e50b69de488eb9b52d3030b289fd5f93e31bb33a3b7f4e4c3764706a2d12a811c9f1c8ac5e889b747203b1269f015bc37c43f51db90184b300bb54e0170a + serializedSignature: b8c157479e699e43c469ee3358de4f8cc0660dcd231998a8544f1c2e9919e3dfd69d9c856c6772ad5df180953f0e439fbbb96d09548768355f9f82edbe385609 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset b/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset index c1c782a..6cd4efb 100644 --- a/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset +++ b/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7d6c0e702c1bdb8060f1a0881520ac5ad50a024502a144212424a90922075efebabbdbabb0b7577777777f7be5757be99d999dcb37be7dcbb7bf79ecb2c5fc38f6cd6ce9cf39f332e5b279ff19fd820fe6b019bc726b1216c3e2b63abd92afed7247e5cc9ff3967fafa5cb6961f2bf8ef127e6f10cb4df1a6f8e917ebc07fcfe067d5ac86bfb98e95f263a5bc5fc4caf9df33f8bbe5fc4c5c5dc6ff97f3a762f5f84bf3d9643687cd66ed636d538858205faa56d762c2ae5843fe7b22db87df2d974a8940f2e5adf6fc5711bf532defade44aebe776678ba4592bf9bd52fece5a56c5652e95121b8e19c2e41fcc39f455c7baead88fffafcfffcc03d7c5797fcf731df9ff46ea6ffd6c07702d471d2f50ef0f00e7e2d8425d1fa8ceb5fc8b0c322ef6c8b8085c17c70bd5fd41e09c938fcdf2c8d1ef5da29e1f0c7431dd1fe2b90ec317f7f395ec73d4f5811e7d86baf5a9338825b74bdba3595caaee0f03e7c2aee7d5b996d71a30abaf8e6dc1b5b6ead8075c1bac6417a8736d6b3d75cc57cf725d1b7fafaed551d71aaabfa1ff685bb5bc61f1f7077faeaeb553c7e1ea7899d2019e0b4e9738efd579d8f3de8014efe9704c7a16aa63b334ed1ba18e2393d8a7395f0e385feee856f70c75beadf34eaf83d5f928f09cb0a9d0f3dedd4974d3fe760573fbdb15eaddaf9db0eab551d7af54cf8d00e75a8eb8ae6ddbce79af434b1f5c463bcff63c569d6fef845d6fb90a7b7f1ffa5fe5d1ff2a25639392f1b2ba7eb547ffab11fddb8223646a4a0763983b1d24b375aca3cfc0337c3cabc3da04c2dae4d89573893a1f87f8c2268fdefabdc793843b9e25e60513d4710786fb7c7315d6b6016cba0684718da35bfd8dea7c1262d3351e9bf47be7240957fbc7b51effb856bdfbb41356fd1fd5f5eb3cfe711de21f1381ed8d9284efb5fb7af0fcf58e0e0dd6a8f32988ddd77becd6ef9de2c3ee1b3c76dfa0de7dd809abc1d7eafa8d1ebb6f44ec9eac8e37abeba3c0b938dee4d1f52627bc86854e780dab3c726e51cf6f07cec571aa47de688fbc1392d8de9ab9fdf956e6ceeb6f5532749e602a03a7a9a32ed767807b5af71dc1355d4f98c96ad3c7a02bd4b5e940967e7e27e63fcfd0be731b78ff36c786469bd4f91cc4776ef3c4877eeff924e17acbd8db958cedc13997d1b84d1219daffee606effbb43bd3bd9d1b7b1f6873b99dbffee0472a0ffdda5cec7807371bc5b5d1f0bcec571b63ab651f7753e36d7097f808eb79d03c4c73c75cc05f151c4e2f9a338ce8ffb414bedabc58eed4dc63bd79b1427096b813aeee2917b8fd2731c381747535d42c7c1bd9e38b8571deff3f8c67d8e7e4d993a5fc8cc3e85bdd73b893df7aa67c638329b96a9ebf77be2fd7e24deb5fdcd00735db778105cd3e1dcaece757def81389fa64f33b77f3f00de7f105cd361e87a3a0cb31578a79f3a6e03aeedcae27ea7afedc6dc3eb6bbc7b687d4fdf1e05c1c17c5756fa5e3760f75ec0ce4efe93cd3eeed24f1a07d7831e0a9750852975da28ecd93bc1fa45ea0f3d98799bb3da3f3729d473fa2ee4f00e73cbe9b6f02ef8b637fcff3c3dccfb7acf13cf728e0f8a847d663ccdd367ccc23a3b5e7bd273c3ef30473fbe2939efb4f7ac27b5cddd7758c161ef94f3177dbf329757c9ab9cbe4a71d3d5bbcef79ee19e62e739f51c7a91e3993dc725aeabc52d721617959c2dcbebdd413a65fffd2360e00e7a09ddc3c59b9a57d69be3a3eebe1f1acb2e37e47564b9d9674fa2d06f698e46bb9cf31773a2d55c717c0fbcf816be2f83c73d7639e77746935cbd1a55595e7bda929ded3f57fbfbae7f97c2e19d745eaa8f3ee97946e93c1b938bec8dce5c38b8ecead977be494abe3cb1e392fa79073813ad7e5f01e296cd2e12d53c75794dc29e01ce631af32777df15527dc6d5a7ae455f894f79a47de6b4ade128fbce53ee5bdee91f7ba9277bd475ea54f796f78e4bde1c86bd3304dce6f2a79533dd7f7f284ffb67a6e1a388769ff2de6ce27b5bc77801e6faae3bbcc5d6ebc05ae8be37bcc9d87bfe7d8d8b6cc2347bff7b17a7e3a3817c70fd4f519e05cc811e53c4fc76dbba8a396fb8ee7fd7798bbfea6c333d9cce5b4d9df23e77d757f47702e8efd995bbfe1ccad9f4e537ee352cbfb103cf70eb8268e1fa9b06682731e56bb5c47f776d30386f921784ec89d95e4d964f9d427eafd9dc0b938ae50c7eeeafe6c1fb2e68177b4eebacea4f3fd4f95bc39e09c73689fe77068bfc4f3de67cc5d7e7cc6dcfeade58df6c83b3c89bebafc58e909eb73e6f6375de699da0bda07db015b3b027942ce5c1fcc56a9e3ea2461f5746ceab087279c4e2a9c9d99db0fbd3a8967f43d1d47b02e6c6aa399e2525feb06aee976d317ccdd6efac2d1b9e378cfbbb08e6f6a0b6876ba1ebc86f96f6b765061d638fc3a1e95e41dcdf04b255febb7b73aae05f7c5f12b8f6f7ca58ed5eaf8b5ba5fe491ff8d278ebe06d7c5f15b8fdc6f93f881d6e5bfea9d62702e8edf33771de07b8747a74d9ef7ffa79e9b0fceb1f7c5f13b103fdf2999df7b64d680fb42c60270ae7dd8eb333f787ce6074776675db7d1bebb8bc3a1f3c1c05fc47355299ed3f5b82e2c795eeaf19fce372b39c9fa7fd7a9e3fa24f1a5edfcd163e78f4e385d7439a3cb1f986ebb3177befc1373f7e5fca48e3f33775fcecf2c9ebe757a837d399a094c731b983b8da9fca68b6efb770432c573aaafa3eb64208b3fdf3537803d1b59bc4f09cad271a9fb04d28cc3ae4a7ed76393bcd3531d7f616ebfffc591d14d8fcdfdead1fd57609338fee661fc1b73a7092d7f378f7cddd6da47ddd77d1cc9ea1890a9ce3f61dada571df763b85feabcae134b4c93bf33b7affeeee89aabe347d7b1745f4692bebbeeba8feb00753c501d75d979900a6b0fe7fdda30bcfd187f30773fc61f4abe8e5bdde6ff93b9ebb57f7ad86939c33c72b49f1fac8e87f8d4b39162d3549d1faa8e87f97cdf6f9978380b56068ae35fccedd37f295d4f503ae8f68feebfeeef796fb8e7bd979384edad631ca98eff52475dbffa9bb9cbbabf19eea3baecfeb73a1ea18e9b3d323627917134b0b191474e7b96e0fbe24fe8fbf29cdbde53d7ad1b38e73d74fa3f461d1babe38ab80eed14e79ec9e2da541733c5ffb120fe854c3d06765c8af053f84a2cc65cfdc9f25c1ceb30575f903c171cd4f85fcf1f3dba6ecf92e6cdb572f5dc9645e09ccbedd5db91db6b0cf2fc9ee0dc4778496daee7b159e5f1b11c8fcd394ab7fb956edefeaf51296cd6721b786c563ed4bb8323b7f750e4f93dc1b938d68f8727ff1632547ed25b97336dc17d90f6e5b90f9d93e62b3a8d3464ee34d250e9f2631219c7abe37fd451f50dc51a29598bc13996964d7309e0f88278bf3173e55df29cebd6573fe719ab8b35f13cdfc479be8fee5bdec6f35ca1e7395dbee8b476a23a9af27d8c8d698ce424753c39098f5398fff18b5395de4d953e4bc0b9e0a3e6fff4d5b24e53c7d393849faeffe8f69df61f3deea1eb56b9eaa8f2c6989eb7b6009c739dfbad01ef83f7d0e7751fb09e4bd2431d4d7deddd3d3ab4f4c86ce9c8ccd369b695db86582bb71cf47d5d3f3ad31397aa5e1a036306f26ff18eeef7f4fa726be6f665fdbc1e57d775f85eccddded5d77b33573b35a6caec18288762aa9e9ff7b2a36f9e6ecb7601f7613a51cff7d7717a96f35e7f5df730f98b7e67947a3659bf96a99dd10fe8e4ed03d1e3c36733f77876b2f242b79f4ac0b9b8df559deb394f3b807371bf893a6fe789fb768e7d0386023940be9cdbe85337dd4e1ba8eae472ca2c6823c6545d30a6ed1f0bcec5fbca9698ee47d2ed17753fa6db7bf3c073305da836a69c192b9e5bea79bf8bc7a7ba80e7c5b1ab3bdc9866aadb8aa5e05cc855f5ec98ee935c00ce0187daf0b55e0b7db0d4f9532e73e74fb98eec413a0f57cc07e9fe5acda087c7dfc4b59e4a56193817eff6f63cd7c3cd899dcb5cf941ac07082b59f9edad87abb43448b793ce63fecb0c2523d61b84a9faf1637d98bbaed4c709677099e7399da70c00e7e2be3eefcbdc631633c17571d47955b9476e2f8ffc658e5d830f77cba90dc72347bfcf76f4c8a9f0dc9f9e8277327eaa5e3444f75f9caf8eaaed19d3f3be8b3ce7c63e809c98ac1f4e67e5ac84ad61f9323011437ea7e0eb37534fbe97757ff14bfcf493c1d6b07df8abe5a619f0f3e5fcfa1a9e13171867c07794750c1dfa24f9bb843f5129852e8f25047147421042b92afeaf1c4cdfafe6d7a7c9d9ff62027f25bf3384cde247f1d6128e7877fecf2d65010fb68aade367c5fcf71a296f09573bf1c9542689a9fede77e67199ce4a8495fc8a06ba869f57490d8be4eff552d372a9fd0c7ead46ae8b58c52ad8447edc28434bb47d2dffdb1466b14266d6d1bc2001bbee2c7bd0d134995b23b4cf97edad7f62644bc4886cfa8af4217eeae5cb9ae6d10931f10f432793c99185832363984416735d2b60f9720dc8bc0482c16d4cb4d0ecdf0eef91ac30a92d663222ba3b4b0be2315cf9f30f05333b771f9fe3366d38cb97cdfb2e294c4b0656c8cb9335d32026e4e4d41b2a14f5e28f99f0cb6e8ca22ce2779eab94cf058f80fab2f0734780acda17f33f36f2ff5572f957895c3c562a85ace2c7b9fc7a09ff5b289d104f4385d006127562419a4a5d0c761d13ec86d9869d3a774906bb61ad5d71d8e2c74cb0114230950e18c1ba2682b2d6b79e94a0ae8615f1f27626d75ae4e69572b9e16a2079b52c514598d5b51e570efe72a4c4df841e18afece93092c783e82e1bec8907731c349171301a5440b369051693f54c3129fbc677cb624cc6ad73aecf971ee8b5423f953c469afa8e91663246ba25c448306d30b23926b2b287638f2d4e562fbe0d4eb779ad5571baf9b28f21d727c76461ab8e48e7a7418e39da5aca68cb447058d4d537459decdc2bce620121eead96524af8b3c18b08d1a33ad05b449891b696483b2418975a050c610303c2a102e13606ad62398d3c5a098510c90d31c96dc24a6e84496e6b2419407263934335cf7ef5cea92b552155dae4ee24aabadd136a1cf727d6ada547b547eb6cc975c0fca989296e04c10e46b52e189f103dedf1e8698a09ef68147ef0b820c29b99840b87e864ca4ae5b48cb04592e8f3ec27477ed7c9e76493382741e966b8d2cd31a5e510814769115c10e12d4cc245048bbeec84a2db2bb8252eb8a52999c98bd96fc4a657ad1731dfde77b5be3b4bd6060d5aa96f658a16412f1753ca1b35ddf1a8698d09ef6110fef7e6cd9b8308df06cbb87b86cdb8db6039432f63ce60109e2467688ba9dddba076a092ac1d46bb4f06a2b2bd299549e7a9244d6589cd2673530936a6e27f4fe152d7ca5410b489274627ba1a98e1e9b29f4c97831372f14cea8ca5e20e9853e5854d0b1d4d92459da9bf9f6cbb092eb89349b04864033290c83a63c207664078170cf6a0b0b0bb626a0fce80dadd30e1433220bc3b263c3f03c27331e1433320bc8749b8a8f40cf3e3e0492a3c3d31372908eb26bd301ec333c0a33726bc3003c2fb604c468465d2d72459b41a47d63e1c97bcd954d568840bef87a9bd6d58b5f330c9a30c9203d506fa9b248bda80589f1db6363000133eda203c1650f84083f07c59953c8465a3aa916a8ac034b93b5f399bc3abd57b31676c37b180d763c4f3f87199d4a25c8e7c94fb985a90bc6ab27d2d1fd08494b5e129ccff44077a2bc4e4aa3ab26a24a653e5c94debe6f3eb954c4c62982263a0528634c4a88d08017b5eb3d889898d07d7c9d8ce41ba0e7790a1dbc506abc80dc212d63843c23266634912d660937091b0c61b3c6aa8f0a809b551389179fb5fe386e9bf26f2d7967301ebe5548775ae1a6cfca99cc43e891d709d8760f9fa2443be3ea88e21a74992afe79b848bb25fac450853f60fc5b49e62d0ba2aa0d6c34cc245d7eb543f5a37c005176082c552fa84415ed17f562c87622bf83fe1feb9726285188e0a12ea70cce5a71b5cbe4ec0b2a4108b88198688685a3758448cc084ef68103e2ba0f0915864ccf41b19a2e458cda32448646c8b9934cb60d2c1014d1a65122e5291980e1eaa1ab51da6f66c83dabdeb05537b34267c8e41f8dc80c2b7c798cc0dcb648c49b2787e6786e4f6a2bfb4b1c8e803e5d063313c45063c637282e1d9c124bc3173564e86c9a1c7615acf37687d6c40adc76359da02439616b4df7302a6f92e06cdc5a86610cd2762bc1786e43d09d37a5783d64b026a3d19d37ab7905a4fc1b4dedda0f5c206c1b49e6a122ef266315520218767cc203d494e3e0d537d9141f5dc46c1549f6e109e2fbbcdb339e63241f6948afa46f031973d4d9e616c3e883577a6f196e4a16315fc19a66811e496f871d5c57894ec688a1239d890cdd1666ffb2d58a494f88e94a5cc3cd29c2a7c2c5a669ae8c901959db348cfcf9c5e33b952dfe4ca24b9b60956259df68a509b657266418d173c0903c6cd4c195819eed03b99848bfacb3286d45fc4aa94e0f597d9a6704487a7584018b6c3730e960b571a72e15302e6c27331e17b19843fdc3898f09d4dc205fe1518feaab4f0cfc3f0afcc00fe228cd02a03a1bc26c108159b840b2f173b5485aabacf374916f599357e0a8924f59905188fbd0d3cce08c8631793705143113b4425d467c4d0a09ebd9a2b734b67f83337502d67216650b5c1a0cf031ab42be69a3506d7dcbcf9a08382b8e66e58fa5a87a5aff569a5afdd31421b0c846a9a0523b4074668630612ef22cc9ff6f1930a9238cd9e18927d4da9202092c598f0fd0cc25f0f287c09267c7f83f00ecd83092fc13cf200cc230f4ccb239762461c64306254cb6046949a848bdacec17e9c66292eb80cf34631289590bbb5926e2a3ac16bf8ffa5b29e582aeb89f93ce195f0aba5bc7e11c469cbb1f00f3585dfc815fe10a9417ea0f09661e11d660a4f4c3b1cc79f1b1b288c0a2c8cc3b130fa060e633916c611a6301a483b44adb884175b41c3aac4c23a120bab6fda61ed65082b5fced2ca668b65921cf0599b468b456c79d5c783642cd266115b5c99da2cc942c7da2c2b4c71248a2cb17f56d822ab0acbda8e36646d8fb70f96b5adc4bceb182c072aaaf52d770dab8aff2ee167c1ea5aab30e38e351857d8219871ab31e38e3319d75819278637a06941cc59630a511477c733a4b813bb32052feef6c6b09d60c036a653306c6b316c279ab0b597a7713f70fa5cca541756991cb22d617aa5fae880fe518de972924917316235480e19ae966b43d30db5064bcf271bd373b069fceb4cc245dc9d6288bbaf3b078bbbf518af534dbc9a78e22e5e6e04a1b50173fad330a73f3d2da7df88813bc300ae43d760e0f6c1c09d690257e00127266994a963a9ac22ad9252446210d74b647619c79bcb9f59a6ae3809c6f934a7186a5d250b1c67714b9068d817c3739601cfe1dd82e1d90fc373b6094f23239e20c6ec8f19738ec1988f031a738049b870d87331873d2f2d873d108376be099ac85f16d7765fec2c2fae93fee3acd10982ef2043c8f97242b72870b7dc743731e16a9dac5689bfd73367d253b10c3bbefc3ecc44b60b58d039f617325111745234bdf65815f260cc272fc27cf2e2b47cf210cc272fc11272dc276733b1fd42b0c2e150ccae4b31bb2e4bcbaec330bb2e37d9d558da354b2e4a5d03b2aa20961d8e59760566d99569597684291c5113bf2a99ab7b03e88707702496d75e6dc86bf37a04cb6bff85c5cb2653bcb4658915125d3ee6f212b344e54a6581ab744761465e6330b22aa091ffc68cbcd664a4a8a5c617e4e4ca0a833038a849479b42153342c49740bd3342ea9a9c22c98c9063305ed71b787d1f90d7b158d2b9014b3a37a695748ec38cb8c960c49a9ec18c381e137eb341f8a83ec184ff07f3a85b4c1e255a1b9365e1ececff5522fb2bf6553e055be9bd784d6e28af0005f1b313b0d8ba158baddbd28aad13319b6f37d9ec64e1bac19e5e167e1216857718a2707adf6051783266ce9d2673c432ad78d78a539bc03a5896c9ac63a5cc1f9dad8f82187d0a66f45d06a3170634fa5483f07cb9de6f0ddb9215cf224fca88f748cc93b2c56cff9ad0954ff129d7ba1e82f9725162214b5dbdcc948e03652fb078be5491ab16e58188b5a55c6da1f4a4da362a93a9d45831161f6ccdcbaae658e5f834cc65ef35b8ece3015df6742c9dde674aa7a2953615d443726506945e4a3c0333eb7e835997f40b66d69998f0070cc27be705137e1626fc4183f0a6fd83093f1b13fe9041f82901859f83097fd8207ce88060c2cfc5843f62105e382898f0f330e18f1a841f1b50f8f9582278cc9408c452e8dd41995bcc16f2c6d4e8147bf22d0a58bfbdc0a493a8df8a2f43855d6d78a149b898e5f2040b39d1e6224ced2733a0f6c598f0a73220fc12937051cf129f1e093345e8520cf63361615f86497e36ace4cb31c9cf85957c0526f9f9b092af3448ce97fb162c615b6ea73898074c9021a4b763dc0b262f34d65cc4e777f3e4c6e299d20cab995c85c5e54b61e3f26a936411972ffb498c2fe28237612abf1256e56b30c9af86957c2d26f9b5b092afc330bf1e12f3f598ca6f8455f9064cf29b6125df88c1782b248c9b3095df0eabf2cd98e477c24abec524595457def5032349bde6564ce5f7c2aa7c1b26f9fdb0926fc7247f1056f21d98e40fc34abe13f3e68f427af35d06c1f972079f6c2e8b992cdbf04b597a9b307ecc35ed61a82f8a1f73a1fa09332f8f49a5075674de6d8a1ed1bcfe94859f34750f96783f0b9978efc5dcf5f3b0ee7a1f26f98bb092efc712c2972113c20326c1a23522becf1cb635f22026fceb0c087f08f38f6f42fac7c398d6df6640eb473017f92eac8b3c8aa9fd7d06d47e0c53fbbf61d57e1c53fb7f1950fb094cf80f1910fe2426fcc70c087fca245c34e47ff2e3dd491af24f6331f973d8987c064b90bf844c90cf622aff1a56e5e730957f0ba9f2f398cabf8755f9054ce53f42aafc22a6f29f61557e0993fc5758c92f6392ff0e2bf9152c716fce40e27e15535bace70fa5f66b98e45858c9af6392eb8495fc0626b96e58c96f1a24e7cbdd34b359cbd7cb11f4d707027eca28e6b7cb2c2766aedda70a1fabddbf852581fab1f049e06d4c78830c087f07cb231b9a6006c823dfc5b46e9401addfc3d241e3b0e9e07d4ced261950fb034ceda661d5fe1053bb5906d4fe0853bb7958b53f364916c9b2452c716d9341f451b8e84f4ca24583bb652c7c83fb538c48abb0443ec3d263eb90e9f1734cf03621057f81b1681396c5975814b6cd40147e85f1681792c7d798e0f621057f83e1e890011cdf625a770ca9f577987b740aeb1edf63923b8795fc5f4c7297b092ff8749ee1a56f20f98e46e6125ff8849ee1e56f24f26c9a26b393796a4bfd61bc02778003f6349a6470692cc2f18979e61b9fc8aa9dd2b036aff8609ef9d01e1bf634cfa8465f20726b96f58c97f9a248bba53bf0cd49dfec2d4ce0babf6df26c92223ee1f32c7de8c091e1052b0fcf8b889c5c0b02c6226c9a2cf7f901f9593f4f9d7c1541e1c56e5ba98e4216125d7c360e487849183a93c34accaf531c9c3c24a6e80492e082bb92126797858c98d4c9245ba2a0c99001b632a8f08ab72134cf2c8b0929b6292b70d2bb91926795458c9cd4d924511bb5d068ad81698daa3c3aadd1293bc7d58c9ad3020633200a435a6f6d8b06a6f8349de21ace4361890711900d216133e3e03c2db614c268465d21e537b6206d4ee60122e9a1a9332d4d4e888693f3903da77c2844fc980f0ce98f0a91910de05133e2d03c2bb62c2a7674078374cf88c0c08ef8ea5a21dc3a6a25c4cf2ccb0927b6040666500484f4ced9dc2aaddcb2459ec173ddb4f6d2ac97ed1bd4d8245bb714e06da8d7d301e73c3f2e88ba9bd7306d4ee87555de785acbae661828b6286253bf3e429fcee637cf98ee94b927ae2bb3e3aefc6df8153e787709f582c9faa01bb2a2c96cb73e36389ee4f807bef2ee0f72a036e12d31f23506c22308e9c805e8c9c09db0660b6cd37d9d687b9c76de3fbc83b9a55d4c64db91c71ae61cb13b48c7feb37889e03313d1798f41cef8903375b679f1bafeea592eada24fa8a3bfea506b16e1066dd2e26eb26786221aea16389e31b220ec492dc6239b29e9812a05db8bd78ca0a62df60ccbe8526fb46a7117bd394e78589bb20160dc12cdad564d194342c2a4a69512a8999c81ff2313b77c3f2bed49e3981eb5006b6cd0bef99e9e5294331db7637d9361989c3d9329e36c8bc6385da51c1b17606bf3f87df5925f36e71c5fc4940d327fb3297f6866156ee8159993a06a7a9dd726aa46536e4300598958b4c56ceaa8d4bbd4100dc1e6046edae7a6227206726d58cda27e33b72cd937155ce63713d289dc5d5bd6530c22a7ccb824ca4cee198d57ba65f6e4c91da3bfa0a4fdd92b15a88d9b7d864df0e1efbdce1421b453a14b3cd9cbdc62a92c44af2da64fa968dc02c5b8259162cef89d7c456731f1582603d32796998b85c3588652331cb4a4c96ed1ad832a75c74e7ab416c09930ba79346b7c5782c35f118e2a3a6e08ee129b245a1536a26eb38a330cd4b83d4dae6cbb455a5ca7b6756aa2e1d17a87ca62c81344d59b81d665199c9a2febee3a298ebe3ccb4753cd5ab31bc1744dfd198bee57eca6e186a901cde6d097e2753b1b23d66e5329395937c956233649ab6a7241b83d95861b271fbc0b9a2d3fed1f3bf9d5a99334b5c58532453d26ab93d6e758255706565109bc662362d37d954e889b749521f47d71a573a72ec12da24d334d16be3ef05b16207cc8a4a93155313d2583c54e87f4552cf1ad9a22b456b176e5bf13b99b1741c66e95e7e6a5389b9891383a5b2f6943cfff69bb3a79b4f8ec72c5b61b2acb7ef7cdddcab90ae9613302dab4c5ace0cd1129bc3ff8ee7f25b32df9b88d9bc12ebb74b6df33c79af44c640596d1d704bf4204cc2ac5be52fef3097cf7ecaae6c97d193314b57fbc9ebb1bca346c56262994463c514cc8a35262b86a5b46286f2c08d3cc52d0b64437afe3615d37f6f93fe0353ea5f2cc7249c9557f1fe47afae894f04d1791aa6f35aace61386b9d69536dd4fc76caac6da74c979faefc336c909a2f90c4cf31a93e64311cde32db8d94cec54bfd4980bc7e32253e977474cfb7526edfba6f425baf1aa9998a6eb4d9a4e4c51ee15cbbeaab99266b5b1468895067149a2d44c4c2fe9c7c52cccc20d260b8767a0f68fa784746bc43b61366c34d990c74fcd7d47baade5f62abd4e3753dacec6b4ddc74f3b196ba9a41a8dc96e1b650e66e3be7e7a3c60db22488f477aad95f4d3ce5ccccafd4c561633ea1905a297b8447e01661effdb4f3f62267a4677c628ecef67fc2df3149cf2b738c3a9761e66e501262ba767c9cac9ccfdc1b44c595b84597ba0bf3ccadc224a9d47a5d31a4ab71d5f8cd97890c9c69129f3e119727c71152f9d2b6b4b97e4b970a6f2a1f9982507fb6b0f992c99cd5f989d25fd1760fa1f62d27f9acf12d1dfe8767ae562fab6ee82d97ae8969985a6af64a2245888d97698c9b6b9e4b615f92e093261fdae98f587fb99db4611b3253c28533b231deb76c3ac3bc2df1896398da69add96edd4b93b66e59158bbdadc92109fd759ca1faa0035b3c4922bd363d47b60daffcba4fdb1b51e98f9d93345ccf988e324e98135526efc1d41477b6b199b2a6b302b6508e9b4881727b122fe0d3ef317f832417d1146fd28ac4f35c83c07775bb4923fbb937cc3899bcc79fe9e9815ff0e32b2e9df8a19b2bfb846ea29fcc73d132433362dc66c3a3abd91b2a972c476a571a40cf7548a91b2259865c7982c1b9b34a5fbfb1c8f3b06dd9f0bca5c8c9560761d6bb26b149aff9a7b729cfa6015d33d3a4e19522affd2dfd25a6798919f6e2b6a2966cd71266b66a3d6ec24e36439cf89f5a84b95cc31936bba25fb7f4a31cb8f37595ee0dbf2093c2d994a89cc5b508659f01f6c9497b636a77d58b4cdf4dd4c8fab9563369fe0671eaa771c6412687f79737bafcec5fcef35099e89f714a73786b50cb3ef443fbd1a89f6893a6c62cb098ec0f9b98e5b994e6da402b3f124938d6352d8e8b4a0e22ff8ef714dd7aa06fc5f4c7e6a7e8a94e08c98ac96be2e524e7e377e4bd6bc537d664e5f17618bb12d91268ab925f1bde7934b389903ab5f87393ffd6202768d72d3d8320f37e7cd2a29393e4f48cc919c26d3bc53c296f2f359b2f653e3fb5384a67af810501387d6f9ff20a1775fce98fc082094c5498b658a5b9da5a788586daf62b54e7eaeb071609ade945a8b53456875cd3e94b87b2aac0d9a747704cc56ada59858832b12d750f97b3e975aa6b2dbc4cfc1a70c1ba66453d883a5009d4fa714371f640026711da5c3391dc26b5535b2777dc61ae4d4192ae2e4344a70cd19fc4e7934617ddd2c0eeb744a58cd242ce1ccf1ea49bcba1c0554a7748ea33a8312555389aa58be52216b6c6ba508514f8802a8dcba7150675282c2bec61c05480d3bc4219d95ed8417ff107c14502dcc8da33a9b12557d89aa3a52b992f8d170cec9b61fcd932db3322e360aa88a3bc6519d4b9f813bdd7ca202ea748039dfa68d02a81306c6419d4709aaa10425fa2284024e6f7a14001dde330ee87c4a40db3058377794d015ce2ad5308a4e65b34b8338b60b28b1c945c1b20f563765a280e7fbbe713c17d2375cb4574d5283a6a2a2191d5f9a9b13877511bd2f452d0bef0df05c4c89a711838d60b1247163446a4e639ac7115d92edf69c06160550e3ebc4415d4adf9ed35b7945ab3db70974a45c4609a935d3f5f0c932686cd4350ad0aeef1d877679b693a0b319c68a48801a552f0eea0a4a502d24a849b24220463956f08b7a75de5ad95b1d055c1b7bc5715d49df772ef088c12521069f0611057055a00a7a1525b826ccd42b25e67a4501d3c2ae714c57d367f6baa6ae27a28adea90a0627a546025a2301ad418e47b8771d74fa2383c148e36398220f9cc2abb16be45521afcc3ba6d9833f629de69be098645e426f665ed28aa8f9aeee5b37dfd525689ea1919497b295991768e4312f405f489eef749387d639b5fef8f05e1ed2f6c943c725f25274a29aef178118c4b34df3bbf18efe3c63675b9e8f023fcf7795332f50799867e8a6d17e66ee3b8d4fea304fc6182a26755cf3ff7cbec55031dfe25a0141ecd52c7e9c72ea3aca72aa834a6fcef49a55ac2ae964b2c562b342af0e5d1274707fdf56974d266d1ab94aafd67e0c4ca704bb95c58bfdeb6dc25910499c2f029c37d884737824717e0a70de6813cec248e2fc03e0bcc9269c232289537c994ae3bc99ba0743547e96c9756b6296beb7924806af2515bc1ce08bb764c3172b506f84ea8b727c241dce46543817009cb7da84737824719e0270de6613ce8248e25c0770de4e89b35d8a82078a5b2c3f2a4384b20115ca7b00ca3be8274755a9259545aabd8af4ce650e5c7b2a705d01b83bb331156198ec08d07bc9ac911d1ee2113274cda8d04d04e8eecad62c8e12d9cf9325748ba9d0cd00e8eedeb2391f5c0938348209f86e80f29e6c79e1d691807700e8eea5f642acbbd6c75cedcca1ec4785f20880f2be6c78e1f0adc60bf301bafbb381ae60ab413719a07b201bc548a91a36f02e5e7557a0098b11b20a740140f9e0964519f512791e40f950361274e15693a0e703740f534f1313813aebc575f34d7c6582b0d790cce31a036c8fd8d4834dda6b48d6837d07c0f9a84d3849bbb9c870be0a703e66134ed24e58329cdf039c8fdb84b3309238eb80e1aa276cc2392292385b029c4f52e26c9f02a7bb1e392c9235c94e00e65336c1241c222083d919c07cda2698051184d905c07cc62698843326e8c66000cc676d8259184198dd00cce72861765230abf84302a4b371ec0caeca46866f6d46580c75a742fa168b237dde9e71eaed22d8cdf62d40f90225ca6e0aa5d80c534c86f26e7aac8f13f9c362befe7a5629bb3fd652174913a9d01e0bd0be4889d6999a5fcd9ca17fbd34a23c71455304aaeb6d01b497ec19881d15c182a72d28785ece4629ee777214613e4936356a02f0cb576c8249e8996430c70198afda04734404616e0760be66134cc2ca3a19cc6d01ccd76d82b96d04618e0530dfb0096614e7e68e0630dfb4092661d71b19cca100e65b36c1246c8d93c11c0260be6d134cc2ae3732982300cc776c8249d8022783590860be9b0d98d81c22ef501a6132276b99f70330dfb3092661014406330fc07c9f1226dc8e62a50abc446e4591a5a959643d97c300c20f28117664ee7e75f1a29820bdb5f5aa3f0e807e483f50a1fb2b4ddb8d880d4d6ad806296245841733b501483fa2442a26406aa05365f07bcb1d63c479c2568f1100d70480fb381bddc0fe265213f60f91e593e500e527d9984fe4bf7f288a15f47301ce4f6dc2493ad5800ce71c80f3339b7092eec44286f33880f3739b7092ee134486b30ae0fc82ba8ee96fef32f8495332a0f750013d1500fdd29e991b841dc264e5fae700e5575bb23dee4649bac2820ce67e00e6d736c1241cf72183792080f98d4d30094724c960ae0730bfb5096614db42fb0098dfd90493b0779d0ce65a00f37b9b6012d634c960560398ffb5096614d78eaf0430ff6713cc28ee64b51ac0fcc126988433dfc8601e0260fe6813cc28ce5d3f0cc0fc8912660b161f44d352b3347c5646056f2680f7f3966d89c389d684ed1dba519e581ce52f9428730d289d5514456c328fd1897217c072754d6f3e2b7a9226700d2a69c7255fa4c27b25f0d45fa907d1045e11f0320957cbaea45c4b9143058e0170bf518213db7d88153b7399d82e0cfd7a5ae69035a142561720fb3d1bfde7fa1325f84730b4471276f7924d73190570fe413fcd45ef821af740a73fbd92215fc28a40e1d20920fc734b8e84477fa26a5f80f2af6c246eacca9338832d8a73d86e0238ffb609674124713e0b706eb609e7f048e2fc00e064752cc25918499cbf009c319b708e8824ce86a0c958c7269c232389b327c059371b38fdcf718be22ac8f34062af67134ed2215c329c7301ce1c9b700e8f24cee301cefa36e12c8824ce550067034a9cb9ccbd8e42f4543a8dcd32feb7e8f470c86c5dab2a3e04781b52e20d36e32d8a63e4cf00948db62c4a386411c5edf2be01281b53a274fad4c5cc1bb11425fadfc36b01c035a104e77c8d78033f15bd97ce57898b14c6e855d0bb006c4db39174fd8d7b4771dad55480b219254aefbac7d2adb484ee0d1a8fcdb7ac6f46bd58a901bed9624b96d093a5af2e657ae35032949f50a1fc09a06c69530f11e95c21b202e83180b3954d380b2289f30d80b3b54d38874712e70f00e73636e12c8c24cefaa0446f6313ce1191c4d90ee06c4bdd58747f403dda9bd9d607c9ba1d25b856ccfb294c4740d4f778590400b6a704d885b9db3afaeb65f8eccaf9ea09c2160fd957cd9e02583bd8943f928eef9025f3db00ce8e36e1241d9020c3f912c0d9c9269ca4c3656438bf00383bdb8493746c9c0ce75f0067179b708e8824cea6a06ed99512a7a88b5545ba36d907785e374a54ad6b5189ed4766a949d5f1af818ba15a514d274348f655f0f60061f72dd9d53b87bfb21713e3df35b475c8a554284b01ca5c4a94fac331ce4a097d9c2b5b35d59285c364aaf4ce95b51573f2551364bde87b00b43dec993210c595e0b700943d2951f661ee06e41a165f7c1774911ee17005d922bd7aa01cef1515d0515c0d1903a07b6763ba56fa8b4d09778821c37b3fc830fa50e26d93a286a02d25f5d2322a8cb300c6bef64cd58ae267623f0128fb65ab13793157b45a2ab2520a88f222d4ed01c03c7be61e457167b70a80b2bf3d5365a298ac77052807d833558670d611d954990ea04a34d0a60501a44bfdc816049c0d3c73904d3849974993e19c02700eb60927e9ba5e329c47019c436cc249baea9c0ce7128033dfa6e10cd2ad6fc9ea9af7019c436dc25910499caf019cc36cc2393c9238ff0b7016d884b3309238eb827ae7709b708e8824ced600672125ce7e2cb171a9277595c96b93e448d24af9f714fe7f9d143985ad67e5d22c67cc290b03231752c13e08640523b2317c175f4524e6d6ad552027b1e57220cfedcff1ab84688fa242fb31403bd29ee1bb286e97fb3540b92d254ab8c36bb9cc4957b22c4d9e251ba1df11c01b958d245ec393ad58d7ebcd4df571227f78b9dc28b252f639ada56ed34fa4427b3840bb1df52ae032e924ebf80b62367c856a905644b0846f08b08db6675488704d0659f771475059da3e9be5b710e47ca4534fbc498696b0fc2643db03a01d4389b687c14b9d41369137aee219b8a877ae49daeb14c57d38eb806c60ac3d037251fc3a501940b90325ca962c5e412a93552431db234b5524b2a4be02e01b4789afbb27175dcd96f17fd532b16fadf9687b908f8eb7a9a79e74053b59aeb927f0d50936e1245d724d86f34c8073a24d3849370420c3b93fc03989be2012b2c4be71ce6b7af261743f149f0bf04db6c91b0b2967849079e33900e7149b70927ee98f0ce7348073aa4d38874712e73100e7349b70164412e75280737a36bb429c4d0226c8e10cf3008673cf69291156e173624468df04686750a26deb415be901eace43c94092ed31f72800b9a32d20a3b859df4500e44c4a90cd9953cf746a96e26577af67f4ea98dd00ba59f68c4b46f13bd29f01943bd9339041d88349e695bf0294b3ed5ecf46b86736d97ab61b01de39f6f4b547f173b39500e55c4a949d99a99ee908d9da16683f07a0ee6cd31c3ad2963ad908fbcd00e73c9b7092362dc9703e0f7016d98493b4e3830ce7470067b14d38497b39c970fe0e70ceb709e78848e26c0cc62b17d88473642471f6013877a19e23e74c9b59cbc5cc61abc05655d1c3d60024ea8536750e932ec822eb1c5e0870ee6a134ed2154464384f033877b30927e9fa36329c1b01cedde97b33dd6b2f60170719ba2654e83a02747b64636980087899f4422d7b957a247aadee1880b7281bc31158228efab8cec500e49eb6808ce2b8ce0500e4625b401276f892817c10805c620b48c2f60b19c80700c8125b40120e9691817c12805c6a0b48c2a13232904f0090a5b68024ac7693817c17802cb305e4c808827c1b802cb70524e1d82219c83f01c865b680245c314e06f27d00b2c29e492e51fcd0ec4300e5724a945d9977ce5a359bc336f0d79d4d9d938f2b46af8b3717f48c57da0a96b0354e06b61900bb97ad60095be76460ef0559c18a6c74fbba3ff6e028338539fb7238bd9759d891783115cee90067953dd30709bb3bc8a60ffe0c50aea444d9c993e4aba41f5630b1e9c9d6d515f73040ba2a5b9bee68fba3bea27c3680b79a7a44474c572d672bf82567fbe622e66cab53ca080725c80a999e00dd1a7ba6aa125684c8aaee2301cabdedd95c9c303724db5cfc2e80722d7d6ee88c2b7a17363bdfb4228347f6a1d91e005e3525bcf629fcd09ba4a3d81e6f045a373536c124ac3792c1ec0760aeb309661427f1ff0d92f97a9b6046b1ecde0c606eb0691aea30cad147b25ae5ed00e7469b70164412e7cb00e73e36e11c1e499cdf019cfbda84b33092381928d5f7b309e78848e26c0170ee4ffdc569d1a5b69a5f10bb0b96b105fc31f1d76afe90d8057329239da64ad699d60a24f003b2d93f5923951508376e65fd93af00a407522215cde26a2e60157fa8982d570a2c97099bf003f2647d934d01b883ecdd109cb03949b621f80900edc1f41fe9d45e191f73d43d458ea0e81535db008087d8bd0d04e1d441b26d20ee04780fdd929f358ef6a73df602180fcbe6048332993b964816ab658d121fc68de25ec15f02b087db33f643382793acff68194079844d4bf40a23b959fd5900e79136e124ed2a26c33909e0fc974d38874712e79100e75136e12c8824cec500e7bfb33fcf6d067fc919ea5dc01fac925d205998e74656a92f06388fa6c4d990c156515447cb9b015cc76cc9591b592b66c8fa88fa829ecb63b3bd1dfd2cd58f19ddad42bb034f3c2e1bbd96fe5ae34ec2266de19025ee4b00d2e329918a932a39fcb0268245462380e93ff6acdf215ce548d610fc0aa03c813e0f5c5f3b62532c7b782a18fcb851f4f2c0ce00df89d9ed2d9fcf5fad94214c91422a6527ef34f5c21c2e622f7e2c6535b479e1582ab40301da93ec1d8820444b36107128407b7236a662f9eb482b886457daf900e62936c18ce2a70a4f06304fb509661437a03f1dc03ccd2698519c58fd1f00f3749b60467162f58900e61936c18ce2c4ea7f019867da04338a13abff0d609e65cfaa5bc28a1159dba815e85e3bdbeed91a849e4a365be36ae0a9e7d0cfbbd4fde61a5f956c2bc10984d1eb006e0d109e4b89304722ac542df6e875b87500a0cea39e4d295e28e10fade089d73da1257a79602f00eefc6c7e0ec6c90b1d215bdbe760de01502fb0693c7b18e56e5864e3d9bb039c17da84737824719e01705e6413ce8248e2dc17e0bcd8a6d53aa45dbf6425f90d00e72536e1246d7b93e17c1ae0bcd4269ca433d5c870be07705e66134ed269a964387f04382fb709e78848e26c003a34aeb009e7c848e2ec0e705e4989b3b1c4b937b7bf5cfe2f8bece4bfe620415f6553dd9274db07b2ba6511c079b54d3849f72920c37912c0b9c9269ca4c3b76438f70638afc9c676dfd8b88e3ba147af9b77000079ad2d20a33861ba3f00799d2d20a3f8fd9de100e4f5b6808ce2f77706019037d802328adfdf391a80bcd1169051fcfece7800f2a62db9cd9db79148d8f94bd644bc16c0bcd92698849f8f2183793d80798b4d30a3d87971218079ab4d30a3f8498e4b01ccdb6c8219c50fc75c0660de6e134cc28a3a19cccb01cc3b6c82495835228379058079a74d30a3b8ede25500e65d36c1249caa4a0673138079b74d3009979492c1bc06c0bcc79ed5b9515c0ef50240792f25ca8eccbb31a8fed28e1b289c931ec52dc49a8331c7fbb23791752e7fb09a55b2e84e64ed0d3cf17efa75e2d5cc996dbeb5ecf0db12e07bc09e652584151f324ffc0da07cd0ee652584cd47b26525d701bc0f512774b10549a9dcc50ae213824aa4d8e825f47600dfc3d9dcca5b6cfeb0812bb3967927fc3bd7045cd2329bec4398bd4099fd08f53c2151d82ce317d6f1476a223b4fa81ef0c247edd929358a4b957701281fcbc66ebee96c4342381c41b609c9c100ece3b682251c3423037b0000fb84ad60a3b87fffce00ec93b68225ac739281dd09807dca56b084036b6460c700b04fdb0a368a3b680d06609fb1152c61e73119d80d00ecb3b682251ce22003bb06807dce56b084fd5164604b00d8e76d054b38f84106763700f6057b1ab1844d02b246ec7280f2459b56ae91ee984036c2f908c0f9924d384997f893e17c1de07cd9269ca41b5090e1fc1fc0f98a4d380b23893307743fbf6a13ce1191c4b98dc4d920c7237c6a82f049d258616e29d3e3e6d5fcfa3456ce9ccf1956f23b43d82ce66c44b6841726bbf37fc1e26011ff67ba1e8bb5e01a4d611bb97ae2aa905726658b4168a159351bda833ff29a708906ca25f2e41882a87acde5efac06c3d779e8e8429e0cc97dc7bbc95a9e9c4fe07e66961c3b5b21f5ca8b89cf763a5f8059cbdf9bc3ed9d22877d84eece5df1f652feaef3e9890ab578b282df1511a13f0620a226263f20296c1543f03b49a9e2531525f228366e5f2ae325bf277f2c3692ff722aa2436aaba04eecade4ff9c337d3db54c1117c9a5bd2e80c7cc69b02a635e94ca22c7f1c5fbcbe41c8f722975464a4b53db877b64d324b1922f761adbaaed7f0326b43af962424a6c58067c2fb5466f8a90eb10e5fa3ebe4a645fac3ab9db1af9a450338c578b7cd12daf52869bdfc74e8fce9ced6fc19cac4e7edf743d3ab8466f537ab423cde9a3f0c89ee6c33a733c786d8e3fb546fa437c9348277d8b0f7097f920d155b6fe716913f85985b4b5524a5dc9f48f282945bd506444ef50f26ce6ca21bc55837ff20a51131379c5bbaee4345424a7f7fef1f38cfaf9fb943cd398f9f9ffd8db3f48f4f60ffff1f68c7afb47943cd3dc55fbffb1c77f9ce8f19ffce3f119f5f84f2979b67279fc1cb641b9a7f67d47d03ffeaefdfdb3447ffffc1f7fcfa8bf7f41c9b313529f2992dd0e22b2674b933748112b18f215c4ffc729e0cbc414f0d53f2920a329e06b4a9e4d5c29007658ffe3e3dac7bf49f4f16ffff1f10cf9b8f8d75ebae17cfe6e995a5534873f5f26e5899f9cff030fab985940ae0200 serializedProgramBytesString: - serializedSignature: b3db9babf29ef16130829027b9c782adf17d0d5ecd81b5deff04cefcc6fe133e668b2f94063ed65ed53186a44c4ee8c64476b90f91f8bdcf476c38fcbf7dc201 + serializedSignature: 405a34e1ba47d467e01f9826b5b70101c299ede434b9fe84a508e1cdf8836fb13fef11b37595e8d84ff6310bef069c07c666658f77d9650cb1707b01fd1c320c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset index 330b6d5..d00a0d4 100644 --- a/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset +++ b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c5b531b3714d61a6c633031376348b8b5691be702362149dbb44d1b2e21341032dc1e9ae9382498840e0e0c3669f2d8d7fe9f3e74a63fa88ffd019d49cf392b617957da0bb60c4e63c62baf563a3ae73b171d499b44720c3ed60db86cb13536c7a6d826db6107ec35fc9a83b2047ff69da87fc28ea07c09d76d7876834df8f4c4cf156b08ae4b70576615e879cc5e40b947cfd759117e2f41df22dc61ed2e7c8bd0ca6a874e9b6c9eadb2c72c63a57d486c51a732afb3502eab03aeb3ec1d3c2d125338488e1e65e0b20e4fcaf4ac044c8b764fd9cf2456099ebd803e476c1f683e278a1d7fc3d522994461d7c33721fdc6320edf187c33d2bdc5bf583fe441437ca38aba182fdbf8ef61079d84d44794edbced45a9afa8c732e2a025ee2f210fefdfbfff97d777f1b253a2dda9699be6f523d23d9649a9ef002fbba5ba7e5e5e90ea0679d923d525a5bea23d9629a92d96bd9c8f51057f58f64934fb78db31d1366a91153e04bbd866872c87c05857597077113dfd1d85308f70455ea1612b609287404061ad9be40b1536c36e2aad75d84a4a7ccfd1751b5aec11511ccc31c49fae2190b97df82b4aae5686fa45f25474b63d7832c596a1c45ecfd83438cf5307952d18761fdcb5c836e07a48f49e01dbee967e22a15b3afbac014d3b6a94a046007a08f7fbc4e13a5ddf10a745e27e09ea2a14c35e43149b85f22d8de696fd087eabc6dce090a97954070f5dbd1da2849ae6411ae43e47fef9512367a1110aabe3dc0ddb7314217f7769e223867690c1096a89d398b6a7a09aba9b2c87b756d185607819dd120afb1681751d3ce811208d789440432f89f2127f5ead9b87debf029d7d28b721185783b3a0202456e3874631497256ed205a2bf80ccbd1443de223b817ec482f5b33db344ec068b43d8f62385568a95448a9cbba5115d652b6dbed513b2f8354ab2716443d796c152784ddb3abdff83af4222af43a9a8dde2a70f80b9f24c2a3d71118bd84063dbff175e8b529d0cbc7798ae96229e160091b6a08b7eb0877d54938aa239cac93704c47b89b92c35ac2160237c1eec237cc187195b15226bc7786d1da2f942d00d52332a6b0511b1708a30ee8c4476de02932f049df005c0fcf3a67e8505900def60431ada85eed091de1de3a0977aa08a3187d410827f484bb74ced0af728638192fee0fd8a6580ee5144995539064bbe7d8298aa7708781c0713e4d6e70ad6e375073a973806e9526c8147e6aa2266681f3b224dd26cd624e29442b6fc40703239e21c4c75c8887e34687ec0515b264f8af8c22bb0975f6fec3023ddda345eb145b017e2bcc5ebe6e7379746d05962bb49b774c5c78a33e1418f561421d37434d71aad3484aa5117280df9a62eb7ebb588bb4d95bacc9ecc4b807242f7224b631d6a0dc252eb01eb9f0dffdf2d6e1c5137caa3acc91192fb0e07b71e6a5c03dd0485eec7a66ad092577e2d72cd07c0563bda1ad9ce39ae8586d158daaad759446385ff2ebecbb4765df64f485339c5537e0fa16fa1e938cb84db30bbdc3cea36381e3cb3869ecb2ef3c1a942f1ddabdba0c6fa2ce0caf4f451893a34f82104eeb09f7ab08e38cf46910c2c37ac2032ac298445c0e4238a3279cd641f1599d500caa08a3ab7c1e84f0b89e7046451833e12f98228b5e3eb152616d550bf5df6f9a6205f8c3271528abcb1facd5510dbe880a93cf0fe9a4bea292faae87d4c1f9b3a5df80dff23e12d6c911447e1646a2619d44599544738ef82a8f6af37900b1b5c0ee83043b94c7d8c70a5edc7a3d698c8c1775325e55c978cf88adae307bf568f76a94649774925d53499667ba5c741ebecfa191d0e2323b50e02fcff4ce675bd0630fe40fc3fd888efbeb2aee17ebf0a6e2891f21ef2276d4133f8a2123c7a84ed61b2a59ff6888acce27d53e4ec9c51a4f5e071634b6e25cb5144e7ad9399c9cc1d98755d87697ce8bd107964e5a2e40de6567896b645545a0f8865aebf5a2ce66bc34e9efb361f438a6d3e3a44a8fb71aa4473c80c5acbaac881dde9e17873fcbc21c6581903e829e4fa807de95598e92e93c0b9ef7e3d82588047878bc019c3ea74cda3f9b9f62fa3712dcbb61a73d9cf6e341659153924dcad2055f67ba0fe2e35c22410b90a644fa4393145ff98ab573ad467294d35f3fa535f97381761a6b53db50f873379bc063be8eb570d950e0614b38e53277c6da2d60df91fdceac26898038ad6dc0eb39686e76d275c479fc076ae2d1481e35326d12b618c186ddb7a149a525c019b1aae0dc34094eaf874d5593c356808c49f6346312b2ce13c8e669687b37e65d4b80f417d9553cea20fea06141ff742f36b8a7a71425046f29a938227a3bcee98a7651ce1be7b7e4e9261bd0bdb221427bd615cfb25a8bace656ea9c288fb9d5edff79da93471ddd411032224ba018f2a5c91892248d15a883ad497bcfb900beec18ab9e57aa123511251a4490d3449584147abf32095b1749a35a6019036ddc14688312685f9bce7fc40a780d1cd318541953500d4850dd3509559cbbe531df60c8b72058dd1258df98cf830a8e1dd1697390c54d41d62641f6ad49c830abf1de5031065eda14786909bcefce66cebcd582b0f549b0dd33091bbe92e6dc123506d7b029b8fa25b8be37095717b7b212ab3d0f313815244c81169140fbe12c403338191803ad5302ed7ef3e74f83b1ccd8fc1993209b3509592f13f999ee9522a38e3a620ac09404e09c4900f1cd15bfdd08fff3a8d65ba13209e0799300eb931483b1d0186c1d126c0b26614b73d8fc6dcfa8831b03b25702f2814920531c48ecae3a8636089eb19d921e09bcc5e6cfc80677e48ccdc8ed12640f9b0fd9ed1684ac4b826ca9195344c9f59e8a41e734b630bb20c1f6e3d9ccac332db8fc4f4ab03d3a1bd80c5a5bca146c7109b6e5e6c7358390198b6b9604d94af32133e89cc6208bb20fe6943cdf4f2a92d49e55ee08665dc744598fd336fb60b997e38101055f1fae5082be4d65f5903947ff28e10e0bf7ca95374dff13e05514d9525bfa7ec3f4d888536d95a4f59c70273db492a37fc7f121cbff84d9ffa5157dd04c3364c69ba0f91d6ef2abd0d83e6cc14ff43fe1586c64154e0000 serializedProgramBytesString: - serializedSignature: dc2163db1044020ecc32ee9c00aab1d529ef562e7cc4d5581f1d5986b58fe0172de871af4c51894827fdda927d919205a2a053881677ab7ebda727b5c144960d + serializedSignature: 672b7f5efd27c36f28ff355aa73f02303bf8dd754a1e4494358086e117788e18e345e5f70da0a8d0b2d43df027daf86b3362bdc2540f54228fb809c94b53250c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset index 7676868..e3970a0 100644 --- a/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset +++ b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d0957dcc811d60063c0800df800db60e30333e69a017c7bd736e063c9fa0ad726713618c3d8b0069b65c06be7dadd64736deefbb7e4bdfca0fc88bce754955a438da65b23cda84696b3f0981eb55ad5555f1d5ddd6a899ab4053f8941f898b7a6ad496bd89ab396ad17d673f83609e53afcda474efd036b13caa7f0b908e706ad9e1257e24f5fa2133ea7e028676dc195dbd61294ab747ec6cac2f729b8360b4758fb04feb2d02a510717cd5937acfbd63dab2371a0048979ba28a7ea122857a2013e27acd770364b4c6127693ad5011f33702647e7d68169a7dd43eb63126b1dce2dc1359bd61ad07c4c141b52c0538264a2625895fbe0af917dc7b20dfe76c1df59768c65adaa3fe741c369dbaea9ab53d79f67f49c7a2c93aadca5ca7a55d6a8ba0b565e041b25d7f98b3ef8dacdea1a54c9db94a2e3f0bc97d5f9c5c191b35543cf39b747f170891d63d9a2ea2fabe3265536bbce23efc9376fdefc57d5ef576507eb734c959dacae83d5617948950714dd2b01e91d50e541571dc859bbac8e33aa3caca17584d51d6675c8cb7baeebbb58db2ed5e67d753ca2ca6ed6c6b9ee28abeb667578fd55757c4295c759db63aaec61e7f2d82bf9b80e4695dc5fd9e7eb9ceb1cbb39c5689f52b4aea9e3b42a7b599b5e559e56659f2a53aa3ca3685c57c743aa1c6434fa5539c0ce15d84f324151ec03882b8bd6869546274b2065bfe1d6b9b274a025ffc50ffce9a36eb720a46d00014db49ba358ba059632aa8d768712cd8cef49fa5c8416ab44143b7375f1afa22e90b935f8cdb2509d83fadb14e93158afc29961eb0e9478d52330b387f05b48651eba5d83709fb566e17383e83d02b68b5b961209c3bafb9a69a0698f3aeb50e300ba01c76bc4e10c7dbe244eb3c4fd14d46dd118f81c46c109285f516fc5b26fc2775d9fb30a323d8ffac1c7546f0f718e9a6e8034c87d9ae2e1371a89422334bc8f2b37ac4bd388f4759126bec1d00e3298ac4c291a230459a2a06ed44a533ef3651182c1652c96d0b16fbfc1f836e5bc5948481f5b9f282f72fa7d411e841c39de380de513e202eb971436de7d3948e971afcbe3b3633f69caf36e061852e4a5400e6bd294787695509c97d9a064a9448f5634e7db045cbb028cbea470b60dd7ead84b2693857635666590bd7aeae12d032f59974145bb9d23a1730e4abe67449da390b2dd6e95da79b9bade801b28352934e00426b7e3d0f83541344dd02d03294c379ec1d13218491618da22f5662dbd2a1b4995c5894e29864d70d7e8e06eac36dcdccc82c38dd3b42117dc7af49a0ce895eadf845ead0e3d6427315d45f44a8d9c5ed861fadbe1c20e7ff4f8b5107e078b64f3e6c0845e9d06bd0ca2b7c7c454a38b29e4c7403ca9530d4d84d74555330775f6ece1269d5da56839ec72ee5b04cf3a48671b9ce92a474d776955679bf8f15628ae3574bbb0ab53799a5ea9ada4544c4be4793799c22e9db668b962b68a8e84e75e109545681bdc99701d67c06db77ad0db09f4ce22e14ab36082b05ee74d08e13e0d578922576a37bb52838e321eeed7246a1954252edeecc62fc9a27eeacdfd34eafac1ce0feac6531cb936a15d510f8de61e76eb7ac0f61dba21c44db8c94cb8c90451a709a2436541d46c82e8b00e22f4ecad02dfb5a7c6684c37c87f1703c1d76282ef4885f0ed318d045d218c047b4dc4bb4320de6a227e3404e26dbaa8484a88660cc3a4f539dd5dd8748d09e18e61c774e6a40da33d56a9b12b3c9e4d81b75d6702a8a5e37ebca2c7acfe7d3af593ab3c8944fd936a5288f7c4c255f809df0a3f490aeff75078255c9a54bc5fa7098a2b9ba29a70a6d03310ae3f04080acdd99eed0dab563b73cbdbd60390da3dc3c4e34f09d99c4adceceb1cdade1a3ae55b43bda4a1f3965555ee4d9a3ba0734e1c45f17e4871ae16202b3a68a2dc5729e50e1d65b4b6949f80d26b26dca9219ca6116c35a280e26423387574ee48871756cef836da7e32da21cfb05229af26133d644a21064248210eeb54de169dca0b87e051f0de70553ee85be54325555e39af26951fd1a91c1d71d88f87f79bd5dda5238cea4efb213c6426dcadb323ca7c5622b1a3bb347db1c71194275c2bcaf8b6a211b2a2410f2baa9453930d1dd5698452c6a76f816787ab8f51dffa18237d0cf8f6eab0b4714ce7787878d6322c00e0c6a8e00b003dba7e700100132eed3d07bcc7fd1154ad92fe513e7b01ef0ed421d2736007cbca46832c061cd77182ed2ff809351e8b01274c89d5c54a13ab9326ca972aa57c4a4719a76a97fd8071d24cb8574718bdfc8a1fc26366c2a7758431ebc00d5395661d7d3ae2a872dc69655c9d7677d06aee206572b7ab2677bb5696bb9dd1f583a9f8753ff07ba4e2fd2601c64d024c9425c080295e4c563b5e0c9ae2c58d0ae3c590c9ab6f6abc3ad0c2f7b0c9ab6f55e8d5691d61f4a7db7e08f7980967748431fffbc00f618ffc6f4447b89d0e7d101e31131e3569ef5b1aed058ac9633aca18533ef4c3b247927d5647187dea8ecea730f0e8330cbe52356c2dc0ef530bb7782f58b830bfa98e0af3156ca5a7665ee80ce2a5e74cb2ddd5c9665e7835735328e967d07e19bead502dcffe76ee2907e1ffbc89ff7b3afe472be67f05ca55385aa1a33024b86092e0be4e82cf8d1214cf5e6dce718f03c67333b7e67a3f3df1dbc385940aef6d7a9ff3d7174a1504db8b266c1fe8b0cd5ace1aa6b385896f60b27141fb78426b94386f9acab7bc09b3297b93145ad21259c94b6a3dac9047fb297cca649ebc1e67898f0909b786f81e9fc2337cff8afbaa79e8017d2c084e974c387d5b87138eb37a8bb1657d0119c30204109c41614eb14177b297c842ecddb9e5d86218be76d924e7b44ece1b1e919c2f0e8e43891a7d1dc0e34cf66ea21c44ca2b26296774523ecb5bbdb3b65ebc6a5fce9abd8dc52cd0784d3bb1b7f2b7a0834befd72a0aa34a10ccde336136abc3ec76e028ecf8ff2a9ccd02995c99761086b7bf6f92754e276b2ab0ace3e0f1e8f3e1707bd5c4edbc2936e9b975afcbd9bce6d4b8be4e33a0e7beb3afe27695ca79cd24e7473a394f07c832b93f87c1e97513a7dfd171faefd0e2cb8e343b51c6bf86c2cb71c2cf1116f254c38dc17aadd6c36f228133ec9bc40d46e80764077894b3d274fb3b93d75be9ede388ed3af080316b369fcf94de14fe5dcbfc7057f19e87729ff32925854e6bc34c6f5c3affcf3a143fd354af24726801d274bbfa5d93f47ba8d55aa5d59a34dd381f28d39a4a73f190f756f201c152fbe66d02f7540c4de0fadb025dbe489b0f4bd22fb5b37c8808388f8784f03c231ad53800b34c812a07bff8539facc920eedf9704a79ec0d966eb83718067ad76079e8f25e13942f0a089f2a0bd0180b983b6737b6e8d929178c0f89f04c2589f7411bf155a2c2bef019de2a8bb97c6b957f420d326d15b764761da80f3b671fe036e9ba9a24894aac0be521ad7dd490af48379663f5df2ff3d5e6770bc7e84209c7586378a238b9271a499805fa00b6cfddbcfdc2d80b7bafaaae4b1c4c6829871d28f20e5c48d7d6c747a2c095b9b826dcb2393cfc801d82a05609201b82409e06e05e09a9a122dd2444510b27629c8ea1964cb929005bd9f1a3f284719945949285b94f52d1389f8bb6d1f03ee4934c3c50539d886a4603bcc607b5a8d68b7945f78cdc95a5abf14644718642b9290d52bc872d0604916ac3129b07a1958abd570cb75ba2136a516f75ec9c2d62205db6906db27d144b3891826bfa7186ccfa281edac1c6cbba4606b60b0ad49c216f49d1df11b4f330cca7549281b2c277f736efac6712ced64703d97846b0f49b3b30bcc7db7520cba1129e84618742fa4a1b3d3909da51ae7e402b02c065da314743d0cba0d49e89c35926de36ba744dd566cc04831003f8d669c1d9183ad470ab63606db66742e2b98a288b9ec00832e27095d9382cebd81521034b1c5a42106da5614a0c57131f300036d3b0ad004239b18680719682fa3004df0568d18682718689f45019a60ee2606da4906da2b49d09cf761c52fcd4833885e4b42e4e77d58f19b938e31f87e28095fa3724bfecc4e1c172b6b19603f9204cc3c1bb814c3097c3783edc7d1c0765e0eb65e29d83a186c3f8906b6f1184ed98f31d87e2a099bf7dc5330b9159b7b3632e83e97840e5f0151ce7eb3c24de9f173e9fd0ce02faae1d2f64dc2495a8b5b8ded4c751783edcb6822a1e00ca2470ab67606dbcfa28b84823356b148d8cca0fbb924744877890ee277137a9881f4952448ce969ac267e6e33883a86390fd229a4816c7db301683ed97d1c0361943d8fa196cbf9284cd99e0f3c72105136031f7dccb00fb75b5018b633cdbc300fb4db501134c2cc4006b65807d1d4d24bb18c3dd465d0cb6df56c3ced6e82509f623d57174cc430cb0df456367e76238623631d87e2f099bf79449d0e2c4a64c0906dd1f24a13baaa02be73d06a2d08a2d1b9d61d0feb11ad1ef65fead1ba26edc2405d82003ec4fd5064c70038d1860c719607fae366082330531c07633c0fe526dc00463981860350cb0bf561b30c1d55bb1078a8e32c0fe566dc004a7566216d662bd332f92c820227fe74a4fb195e254e0c74b52251f0bb0dfdad0a6b042aa77a9dd62feb98b9d3738a4e9dfc1f07fd4e3e7453cde3411296f6aff4038127a1f580b4dc761bc3242276969f9ccf6d2eca19534fd13987759fe7fa2de95dac94c3b689b1f7ffafd3e34b6df70863fc9ff0194d9ebfcb6870000 serializedProgramBytesString: - serializedSignature: d1aa2916213e055d6f5911e38df842c2ee2ffb5b776c8efde3070c179def5d25e35187344c7ae3a46301e10101cb406ca24fa7212a973ccc1d8615f698f9a70b + serializedSignature: 733b945520c985ba76837b1e1865d0f723882f4d7ffd3b459f4b7b4bd8bc88c36d8bd9a6e17a05139149fdd5af5ccf886fd703fac542e18bcf5a4e6bba9d720d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset index be8821b..1f54a37 100644 --- a/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset +++ b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c59731b45109e95b53a6cc9576ccb244e702010411249760eae10f045303847f9aaa25254a238b2a3201f48cac55b9ea8e2297f84375e78a7f805fc00fe0974f7ce4ab3bb33bb5a49632c13a9b4ab9da3a7fbeb9eee9e19d9913c839771112e9b6c952db01cdb608fd83edb836f0b70df85b7f56497df6555b8efc0b5087517d974404f7c9d3726e1ba0c4f3556879e4fd916dccb54bfc64af07d19fa96e0094bb7e153825646143a6db0457687dd6619633c80c42675aaf13203e53212709d672fa1b6444ce12079aacac0650d6a6a54b70b4cdbedeeb1ef49ac5da8db823e5556019a0f8962e237b81a2413dd4c7eefe377e438069f21fe1c814f12fbf1ef629f04bfc7f86758783678bfa40f1d3fda6e7e465ae893e26d478567e86facf0e77e7e4ff3762784676c3765d1321679f9206f37263cdb74b07c9cb77fe0c35bd425c744807c03fc3923a3691a64515f838e8bec80e569900f4298bedd33d8e891742c62d909583f0e5b07f33a000212cbdb20bbaeb3cb6c566a796f192981ef05ba16a14599884e7a87f8dd3304325781774998363528bf49b30e274e196a726c05eed8eb019b818970cf45651386adc0d42bb175b81e10bd07c0b6b765904838c5dc7d5681a6e50176a1c406f4009e2bc4e11a5d9f11a725e27e19caeae48ff6c023cdc3fd058de695bd0adf6563ae73c8e43cca1d81aadc7237b69a16411ae43e4fb6fa4623ff854610fad8249f86d13c79935f3c9a7883a1e56430102c731a330499e1289b65798a15ab1e04c3cbe895506edf16ded7d8155f59e4c8a0ba4f91044d0dfffad7d89faffe7efdb3e914ed32cb53d89d0a10cd0f58a49735263c14fc4530cd68011975c36fc8e08f63e1da21c26fb52b53bbf00a885164722ac0c08cd30e9a6bec31545481d51c5b02268ac4768533b941225528cc9579d92d68630d540565601eba43edef00334fb82ff5e8b6808cc4493ddee01b24a24a411199821287ada0608fe4a7a04443aea682f0254730a94030880715827d320429e37da215c10d28b352a725aa2d53bcc5c85b24eaa22da13caaf6368ab76861f19438f1c71b53df4b2ebce5580f10d6399a2bfab85569262ad30ce5ffeb8768db58b74f548ad036bc7563d27cc16ddd72b8d304f7a447b8601654109a12080b38df062573ee1f7899491763381314c46332e2a89f21a9c86eca6935e5b84cf3688cb44cd3a7797b39b50679f3b750875ebe44b91996df058a45181be9cdd108cd2598b387bf450cb73cff46c820ce098bc34e3953194a42a64b447c54c6ac5b95236a552665aa4c1d768072bba77053f844cb0a1b5304a7a0f1556ae997a18713c77875281321682f42e6feed71f7c9e52347f6627415eedbc405962317c17b18fe9a196fe0d3d44c9eb6789658eb3b2afaa5c07cbc1fa79329b79b0cd9cdd1e259659303325781363929514681020d7c2224e74992735a2aa7fd6d1eba6142fe8cb6239e02cf325e4dd3e385326a2f945285aa539d86aab48af254a79407552ef974872e7948461843ee192659295d65aaec4f668239761fde3b0cb7c2efd3f6203aa467f08ceea7024688f5e2647626371e39e26a39865572bc2d93e34ac3e89c115115419d92e0ee97b8eaeb9e14232a29a665525c6f431bd6c1c49ca00b7feeddb59b505786691746aa519554676552cd2a74739b387f4ecefe07be3a76ea65599b5e4ea824784726c162680990f33b50b3d7e0bb75bd764fca319594efcaa4bcd1b69e56a06e8b0889330d5b84999361241b5749764e26d977a125b3669553836164e944dfedccc809151eefa934adb6300b817d90c3920277cf5e12563bf0dd3e4708e765dab7e18c4ab2f76592ad34346da71262d263ed21a196b6297a61a2bcdc68b944de135bac92664adc9f56392258fa230d835259097799862eb39f7c90f1d7671cde8681917f89c646acef520f7caab13c05f48234a992278f38f62ed817e2bd0e7c3d24dc8353c2f34c7da0b8cdba75b61424854c4739414ba274ad2f30bce768712e914d0b90a694e3b8499a45ad46b95623794a482eb4694dc15ce05177ac4f6e43e1f7c52d02b7b9cf343068dfa7619a8eb906ab89325f03352767e0c8414bf64b44c03e8ae9c2e93a9adb1c40f6885669357863ca1a372305d4c8873a614b126ce586b559797b2f40f48700d1059d10c50822ec8ec1ae37c061023817758233da98768b34b42aeef50268af09b4b8e922fe55d79c7e7b679bdef0344409c10bdaefa912bd47ee7045abb0a3c6f92531dc643d132b1bc289675bb6bcacc2c735732b794e54409473fff3b4a780690f9e98c786ec2c817c4a41a74f99267dd91adb834661d75705374f9dfcae22e9f03c23ad08dc8ef719145cf68c4e78d31c5e1c789bc0b569e342441b70a62ee0c45837ab1338dc316ec537399fb05def59635c00f5b24e5027b8356e716f59772d9045e6b54eeca42e284d01ca2b3aa14c1135f96f92b4c136a00bb63e01b6ab3a613b2b0937c8449d4ea0f6d837fc87b4c7cd2e2302c0d774023ca40c387bbc8936f0e2bac03304f03e3aac686d5b64734f531b7063ba804b0ac07dacdbea30cd16bde012599c95df6b4c75d2bac08b0ae07da213bc33dceaea94e0d4421e5968f486dac24dbf00eda73aa1cd48c28ddf59894630b5d9694a00f3b3a304e64c0f829916c0bcae13ccd39e49ef3c2d53ff4c47ab959ed405ec8000ece73a8145095a5938e231ea73a155ef2d1b1302a43774423ac56db5c0cfa383c16d2651bde702e8ef478ec7ce7401f76dbf40d330b869647d17aed636ed0897147fc1788b945804ca45ba37b76cf3f4cb1d5ccb8439c0f4a719bc9ffaa5288c4b4395ae69a81b7bc432493bd92f4ef968254fbf2f3acef2cf897a8fe4e95747335db0bd608ee65998bfeed6bd6e3a7a3ab6fe45c401b544363bb1715c1738e9597f0a989f389af6dd3dd9179cf69d69d7bec373b4a8d3be2d6a5686eba27db305e9e47a70cbdc6c7540f6d03c8eb466fb63867f04178cc469da1f57539b83a71d92b54c547799fd8a9bf63b43879c1bd0d7f230185fabf49f48aad4d2fc179c15e1bc85450000 serializedProgramBytesString: - serializedSignature: 7279b3186f835eacfca058c5be75e4cf307d2e08e83e535474a61acc26aa37d977d3d0ef51621382f64a0db2184bdedebf43dae1f450c127593ac4eb09c69e0a + serializedSignature: 2493f38c63164d83550f56dbfc84835a47aa601664bbc44666c6fcd09d77d6fe53de2c4df676378ac40760f2a169583a8cc31acdf40e77c50e35554dc033df04 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset index efcce68..95f9b41 100644 --- a/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset +++ b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd4fd350143f775b378620a222607ce00d8cb016487c970f81449030c60b316340c1990dc806888fbefa1ff9bf99e0ef9cb6ac6befd60d680464cdfa71ef3d5fbff375bb254cc2474de2b4451b344f392ad03e1dd311eee671ade2709ebcf175aae17a8873097393341641c99f713582f30a9eea740aca33dac3b52cf379b271bf025a1b4f3c7a80af8d552a05a2022dd0675aa3613514c1624b88eaee9862bb540fce73f403b3b628c5424c991ac6298f99bacc55a1b4b76e9bbe885955cced81a64615f0dc158e3dcb4c2b36c925d978a4ac7b9f70afca3746beb134be6c99717979f9c75062e532e496e8844c217edb853b3cca684730eb74c255665cc49ec2e41330d0a05110ac4f699666b4688caa3e9fdef3722e61455998b2b08088df2111ac5c0587ed73651de34b1209eccc326672f40957a6daa16938673bc0650b622b08079b36713e117e3b503bbc32ca24767b9066033c9da8ac62c403f404cf15d1302fe773d1d416ed5730762a3972842c99c3f542a4856dafe15e2773d3854cafa33e385b8d3b29e0b96901d6b0f6a6c4eda347fe854718fab4e1a661cae41c51bf429e78c4d0293286147d87c7b453469bc666c8e447f5338460f736862df4e2bbd362bc243dd146c3daa56f6e1679728f258358232f1b37703d102d787ccfc5a6bd2c0f293deea92b7c1af16372bf518b5db494f8ad600d136686157b13e1b87661c3964da831ad69dedd1c68bf42d173296767a0d5a9671846735ccd92c5ea6544c21d03cf4859ece86072285d7270f557f95893a399b3b3ae2cebdaa5ba3e8059dda94000eb3d9315cf84f72d51f25ba197d0a067b13abdb25b6a5649b1741bf838de5c737d6e64039af2b216f2923a79fcf84493c316473aefb77af9c608c9c9b496936a6557bfceaec255a47bb1e78f3ca7d170641cc85e8f2363e56ae5e2151e1b12f736f03e97d5392ae2c8cbec3e389e89bf986f83c659d1f0a4df8fc1b92dd096c1498f770687520ce3a270ae81725d28f8a94ea66ccaad2e729a6557113bbc39da84e5bb9225d199fab4cd8efbe0d6365f5156e8bc96f3f9cd6f5de70d28bcd1ccb81679bc8034e7ce83b37480bdeabdd4254cc9d777d78ca6682d9eb1b464a76f6d51d5cf61e0d52b79852b8a9855698e750c2ee0ee3b462265f93b9c4ed69430f0faf72dbc7072807d0048fbd22aea38f8c3e91e60fe31a6179b4e7b5b383706a41a5dc81ea026fcf683b9c2beb8739a0ffa637da26dbc34caaebe5c5a5c769fffe715d1e28af88241487905c462c85ec699e5facd4a40ca4df6e1d9a64ccf7662c275b23d21d9ee0036142760fd12e6450d6845b2ee2170ca07dcabf8fb4951089849c97da98915b6745cb0910fb6e138614b0bb712a60f897fc9be7f50251f4e23b6388847fc7d6aa245059d0839cee98183aed51cfbab325e8294925c1bfdd0e42aa3de53771bc7f63ca39bd5a8bfa107bc55b9530d5867e94d9a715f1baf98fca6f6a0ed7f4dce1f4f6e51cb18c3b2552bc0f30e73fec5aa26ff8fd5648df11714f5ef581b1c0000 serializedProgramBytesString: - serializedSignature: d9b85ad50e4e9d8f4d3a2b153620a9f90c9314fe9ea05d6a1542c2442e1915131d4223ce5cf041fb6d374a9781be817d0294e8485fc8cc4c2c2c146874a53b01 + serializedSignature: c29016033d5c1356f9a993e1b7da003673b698512c1907d31aa7ce4b8d2fd1fdff14608b7588ce305368c6f3d8ebd1b5726e2f386585b3eedb37956ea7595705 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset index 6fba8f9..7ab7952 100644 --- a/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset +++ b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a59531b4710ee155a1ddce0d8e09cbe126473ec82abf290872406db09558e7171bdb852b280852825b04a222ef217f28ff2df5245ba7b66d1687746ab058d8888a5d21e73f4f1754f4f6faf321ee0c759c0c32e6cc21a2cc10e1cc07b38c1ab353c1fe357dc85ed6fa081e7233c56b06f01ee25cca4cf9c338bc775bc6bc229cefc03f6f15ce5fe2d08f07a1de7067847ad87f80b709493c5493bf01c36e035cc38b71348ecf2a4a66c73482fa780c755f8137b03168a9878dc3583872dec6972df310a1d8e7b0bbfb25ac7d8b78f731a50439a7b4cb1b080478775e2d3285cdc4251b976e42f87bf71791df66722d7741e93e721396742b947149c47117e598546d85650da0a0a7ffa4d46f8e595b139a58dceae6c9b5278a9ede3115a23ca3df54fcbb13fd2f9fcfcfc1fd7614bfe8cd856a00e1e4f7c9cc2e5c299c9cec63264a411e698ed299ab58e043416df617f3a85a7b0a2b5f85d6754917b8d8f151c5165a2c42cc2e2ef180b12ae86df4071d726b6ffc4de4e0e5bc59e257885679af50e96d101df46a8ec22db1aba7c00db78ac33bd7728767c64924ae4dad1399b4853acbc636c0901ade37d8d25dce2e307963460e9d7b1ed94e3c0094682553c9f31b7b8ee0dbcd6f1dc9690e965d42f4053bb58e6a1999ea33624bd476be7a345aec5221cc66ec96598f53882fc15b3c4470c4590717963133496c5f6d1d6b6021edd3ae51882e9758c6b18faf70eb689c0f6827babbc1a04f6a45980634f59834e23432df59891232cb26e2ddbbbedca3e058f37a4cf1394ed0435d12b390f397be88552ae9bf549f4a8a91c9da9781bddb26aaa76ca625c95c775723cbd4972bc51b69bc4a1c61a0e788f0236e1bbb88dfc9c4c184a9a6d354920139c191d9c9cc96cf611cea448d3094c12762602267df4f81519bf3b31dd3a4b60426f48871ee778db7d446f95bda6c67bf1c925101c4659e7a308eae11b61f86663ca258b608230ab81d077658a1d8b5bc58850746720ecea08d3f219eb8670de4c38a733fa70bf23d00662fabb4ca8d29b7cbc9b4dc10f9f8a74012789bfc9de799d5908bdc96ecc3261364bc1e448535774a4a28e30719b36459e28f1a299f8b089f8ad1e101f3111ff4443dc49497cd484f7ed2be23d6692fa8e46ea624aa9c74d51813c3cb6277f0ba67486529430955982327e9b40059132533de3ab72db925177e868df2e2e9c2a3e5ca7094313264d66759a3c8b2ce0d67e27a4a7aca38ccf5f14849aa8d96f1cc8a372b66699dbdb7bda378634fa4d9af4bbabd3ef490a4b1da5b0541a89a74c127faa93f8fb884554ae42ce35de06f6714a5c4635fc76eae98d66d326cd3ed369f64357bef60cfdfd80ed25ea0157f7b5568f5eb73c7e1d8782e20b1ed9c0b96f78e5d15d133c8e973e745f2423eec7883779f83602b0c79e9e5c32a3072d53c9ec107a553d49d242e045f30fb9c4163e91ebb44bd6c95c29ca4b8d425a88346f1e374dd32fc8aa61353ae3f13e367f496f4a96e24be236a4f7a1f4cf8782c06b7ebf8004c8640dce5d5fc947d2440e4909e12213084b083da813938c228834e4b6451f5ae411e22f7be667972b02c457c404c7a033148f5a89de41748570a2f25f93fc2bd5c34b1a2f6985587d68f4a9ebdeff3cfaf914fdee1308e361b0f029583cb0b9a289276d9855f936afc2a945802d2b515e57290316db56b9db8d229759e9055ee902b6873661230627fc76638f7d6503bd2574f6a63de08ab6801b53807b6413b822531309f64b7eb95c433106cfd34615c0beb60958412ed00a0e38c2185606df1e5c13b6e0ca2b707d733df16c7900bd2cabc036d70f2f1304ea76bdcc5a141b51e02a5d8f975984cd9a978102db63dbc13f84ed803781c1f4b38c02d8139b80e5256001033698600d2b60cddb046b4c82b5cf99777b0dc9227023b6801b52805be847f01729863fa029464e816bb11f51ecc34569d36a7291b70598ab00b6d46fc02c7a9835c01c0530af1f8089d4822a418319fa8b70630a6f3ed564e81dc04585aa6478962d251407442d6c4a624079e32f10b0a10ff8954e45a98b79fc368f5e37a6291677a6995cb4a23fbe5d94f322b6abf5cc76bd28c4e934bd4a516eb483553c7ef37893f55f01f1af71fe909bce70c976072d2f8807e8ca0dcedc1b3cc6fd1748cbb878b4300000 serializedProgramBytesString: - serializedSignature: 563d0a13b8bfb5bcc3a7f3cf7961f8de6e48cb076a0f5c3c02ebd4bb5a20203518a0989e8e3c454a6854349c6a2eac2ffa83f487f0ffd077afe9350eb16ca305 + serializedSignature: afec843ae2564cff781c89d08249bc682fb11752b3820a823ec24eddbcb74496df88e26b794aa795b6913659fd9e85398c29ce35f8f475351333193b2e54210d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset b/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset index 44a0a49..5c6a4f8 100644 --- a/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset +++ b/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c5545d6c0e701217442ef10442428901010bb4817454108d8508c244034149380e0da7befebda7b5fd7debb6bef7dd55d5757ddb5afabaebaaef5bb67ee4cde79f3e6bc77efbbefbccc65bff02393dbce9cf39f337deedc56e5c2fb498cf27e2d1073c5143146cc173562a558e1fd35c50b977bfffc237d7e8e68f0c2a5deef6aefda28519ae549f81991e8ebfd9ee91d358a26efc9d562b117d6c9ebf344adf7f74cefd95aef08ce2ef1fed77a7725da780fcd1753c56cb1b3e893e89545c402f950a33a9700bb12edbcdf93c53aef6aad540a22299797fa78bfe679571ae5b5e59ed2fabe3dc55ed2ace5deb5c5de330da2de93b9af94d86ed45021ff107ed059855d54d8d1fbdfd6fbb39b3a6eadc203d4f9eee818acab57c75d8dfb4bbcffedbdff45deffe3d5b956ea5c3bf5378ebfa30a75bc0d2abe1ee818e27b298bbe252a6c34f46df49f2faa31ee6bad7482bf755c4de89cbeafb70abb2bb93d8deb7dd0b3b6eb7d55d893b8de4f85bd88ebfdd5f95eea78800a5767d0b54b165d5767d17560165d0705d475880ad764d07570165dd764d1b5348bae4303ea3a4c850766d075832cba1e9845d70db3e83a3ca0ae2546b816e9bc1171ef08151ea4aef746c710ae4332d6a9f03722352fc1b12d2fe9f0e0107a1c6ae871a80a0f41320e51617b74ae4c8587a1733aa47c4a5fef839eb55dd7e93492b8aed36963e2ba994e9ba87014d20bc2d1ea3ead4fa6f2718c90656949df00f7b636c2c333a487be47a7c791467a1ca9c223908c232ce951aec2a322a4c75111d3a322607a646237d6e7dce72982e531486e25c1729c0a8f33581ea7c263d5f9bee818c2a3d5f97ee818425dd71dafaef747c75e3e2c7ecdd7b95d27755ed7a527a8fb0718f24e30e40d4c95d7ae2203a78e86ac13958c41e818c293446a997192927db8d2f5ec0c7168199baa70bc91aefafa04c41f429daf3653a1e6a1753dd9d0f564156e2e9adb2a1dae0ce023a64f9c1ac2274e377ce274159e66f8c4692a3cc5f089530c9f38c3f089337cceed3f56f6941ae976a6e113a7a0f358dec054791da666e0b285c15bcb3ccbe07d568ebc8b55f85b256f083a86f01c75be141d43f83b757e283a86704b159eabae6f808e213c1ba5675be399f3d533c3d0318417a0672e50e185eade0dd13184e7a9f3c3110f082f36eebf58851719f76b9d2e55e737427a4378993a3f02dda7cf4378b9ba5e868e21bc449d1f69c473a5118fd6f72a239e2bd17908af36e2b95a855718f15ca1c26bd4f98d91dd106ea5c26bd5f54dd0fdfa3c84d7a9ebba9e3dcf78fe7ae3f9ebd079087fafae8f46c79eef77d1e9a1f9fe41dd37061d4378833aafebc24b5478a36197b6f726e3fc8de83c8437abebba3c3679dc62d873333a0fe1adc6f337a0f310dea6ae8f35ecd3e72b0d7d6fcf923e7718fadc8ece4378a7a18f4e9fbbd4f971e818cbbddb907b273a0fe13deafa7874eca55bd79f0cbbee33d2ed3e15de4ba4dbfd44ba3d609cbf1f9d87f0c12ce9f69061cf83e83c840f8b543f7ed8e0f58821ff5e741ec23f12e9aacfeb74cd54e66e2d64f9dcaf9d3ad6f5d8a322b55e7fd4675db29b7f7f497d06d95ac6362a7c4ca4d6858fa9b0834896a53afec78d781ff7e3edb6103d03e113c67d4fa8fba61af76dabc2270d1d9e54e153161d9e52f76eeadbda1cb7be3e115d87e3edfcfbfacf52c793fce362dd070ad3c6781ae93359d8db185354f8ac61d3b32a7c06c978c6e7d2bdc4d7a97ba93a3f55a4b67fc3e8f8bc08de0e7ad1d0f14515be2052db412fa8f03991da0e7a4e85ba1df492486d07bda4ecfbd2b7a787ae83743be86591da0e7a0e9dc7f206a6caeba1d33253db58cb7a45a4b67f5e51e1ab22d5475f55b22f54bade9c210ecdf7352563023af664f4ac30ee9ba6c2d70ddeafabf04feafc66e818c2e9463ca353e3e95562c43343856f18f1bca1c2378d784cfdde329e7b4b857f369e7b139d87f02f22b52cd58cb737aef734aecf1449fff498f7da9e787e7a80e7b3e5136debdb469abdedb3ec5daa8e7750e15fd1333adfec88eec1fae8ebb3843dbfeda4c2770dbeefaaf01d14d73b482facb3a7639f0b0db93babd0ec9be9ebb3097d74f83714870edf437fcf219edf45851f18f67ca0c2f72dec74f877746d2e217f9e0a3f34e47fa8c27f18fa425885e2c62cf4f5f9e859dbf50522c517fbe876daaeeabc6e6f67f2315d0e7e84f4d3e5d1c722b5acfb089d87f013915a767ee2a779dfcf0d39fab94f456ab9f6a90a3f13a9e5da674ace63849ccf0d393a3e5d7fee66f0d2d771bf1fcb1b8c8ee1fa168ae7db01f8e93ee61722b58ff9850affa9ceeb7ea0e6fd2fc4fb5fe85e08bf34b87ee9f3e8dfd788f36b23ceaf0d79ff56d7b742c7107e2552fbb75fa9f01ba4d337ea9ead0d9983d13162d54fd76fd4fc4a2686ba6df5ade107df2abb0ff6e3e87f7a06595ac6ee2afc4ea4e6c3ef54f81f64e37f54f8bd48f5f3ef091bcc38fe6bc4f15f15fe80e2f841853f1a71fca8c24eeabc6edb6a7e3f211966bc3f1bf1feacc25fd033bfa8f05723de9fd0f984ff27f63579ec312fd56d893d54d846850b45f3184ca9ce9f7baa6713c9f8e5dff07f2f75dc5aa48c992454b99968859ed169b948857b8b947cdc7c7d1f640bcee713d57d6d10077dae48a495ef89b622c5dfe4b1f7eca02f53ef13d5447cfafabec25e272c5672751af746c7107644b67744bac3bddb1ab26ab2e8504be8b044c9ed62e8a0fc2cd119e9d0d960e58583b51f183e48dad415c9eb8a74d636c23313d1b1cd661dd7d22cba97a0b84a8cb88ad433dba9f3457eda0e7e4ad9f5368adbf08f663f5b66c832fdb02e9579f3f9fd0cbbcce7f6279e23eaafe6eb46fda5f358a258a4d603aa7e906b00d0f984797e52aa1c3d5699e82052f3aa4a8f049ab749e8bc54afee9d6c9c5faece4f31ceaf50e775bf5ad7ed3add5aa9ebba7ddfc9b8dedeb8aecbb3c1e818d54b03328d2be87ef89eea99e919eeb59dd3f5c2ca2497d4fb8a12d207b6f77267b55825cae583307a1974c9897e32fb6213c90d7ec1cf08196d9358e73d5a6b5bf1315fae2769f27ad595d6151ffd647ed6b14f91bfabbd3beaa4d01989b428ee498b0294abf7fed5a2e52a8ddef91972b50b2c58a9f3ae8cf13a2075f2a97dc4582f21f634a42cf0a2ad17abbda32aeff72a296f1f4fedf43bb399044b5bcc67e67a32fd9537cbbd331ae82aefb85e6a384ffe5e2335ad95dacff4ce35c975402bbce269b217ae95b1a5dbdee0fd6d8bb34a21b3eb685f80439df797f9e8649aea5903da97cbb2ffff53a42552443673207fc04f9b7259bb9c989612ffcfd02f64a0629da9648c95c81229e72a45391c26e6a6110c6f63ba8576fff6794f10e333da622703c93d405a904ce1f99f9f5fda76f9c8db8a524d1b27caa1b929c709339996092cc82b93ada230261415b5a900454dfc091b7ed964985740fcfe7d75f2bef009d056567ea909209b8655de1f6bbdfff5decd73bcdfd5dee3f5aa9c833c96963a156d5543aacc527d66539242dcca86b85da111672f5332216ed76c571231fcd809b6270866d38122d8da4650b6bd16b2124c6f7ce9bf267bcf2ef348ac9135ea6aef795b632d335368608f3698da7976943c4bad4dc8701a5184dbd808cb1ec07eac84e77be7fce6e53479b54eb649a075522da5cff6bc623fd576017ba8fb35d39de4a2e7d55293ccf43b05a6df59d28769604e6da99429b2a58cec3f5515b0f4806b2ba5946aefdef0e50774de37318b683beeae1277df34e3b2ab40216c6b4328bb98b52de2dc500cc2738be573d0389f1bc069e0a9cc904b02bb7437c978640697ce5d472a158a2da95001454c779bdaed0db521131282dbd992578e6a2d6ac1e4f5db1e5193b447e024ed29937458d6240daa17958ced6dc908277b0549c68e743276a004f78e28b8a3cd3fe468e2fe2de21f5ae64a790cb1e95770f257bbf509ec377da5df9467f09bfce84bf953275beac831e4952d923aba98ab926f7cc158c91269cd728654ea173895facb541a972195f2ab37955a9d6d99140ae001960ec2afde4f5a466d4f67d42e36579043fc851f0ac8ad9b04fdfa3e81bb498344a69e7cd84e52572a69065b920606c8c3244d0955380f89583877b3a5b93c59c8ceb1d9700f97eaa581b3f15061ef18678b9f4af3eeb66481b4dac0e288ad6d693e884e9a1eb6a491311ec19a3441a7496cbdaef4ba4a8f9343f9b8446a01e7418becd32b99937d58339f24e372096d9a083ed9c36f052c48ef20b3a0dd29874ba7744b67cae17bda1c1e7a161b09cb182038eb224f4b181d81daaec6bb58275f8a5ed93c1e087aa5e58a623a57f4b2e50aa9d6fc021658782c927a813bb3f78eb079af34ae5f9a1d41628325b36d85fa29265c6da474b5dc22a05ca237e5121bdb5ca297748945a2c2fb5feba1f75d75a6740ee818c13598f5f45ff70fe3187d283d36a15dd3d763996cb0d528a7c85d83be9406a36c1af4b492d85965eddcb5e8476931daa64557a405c4b6d44bf5dce3ee4fc53dc616776714f722594c2d559303610b8501b6782189cb2db9ac02ea888a64a16cc6339c8e672065df58da3e28fef4e4ee14e56b4b6dadb40cf60db2c50b0e5469b30ff2d838a33830231b494736d81619346a60f5b0d9a891ab7c42346a865029b529955213724aa9522aa536b3a55497e694f2bb6f8bc5fe39a7d5502aad36a7d26a8bdcd36a032aadb6b4a455ab906935cc261cd26a2b2aadb6ce29ad36a4d26a1b5b5a756d4eabd95e29a59754e49a5ac3a9d4da964aad89b9a7d64694a1db518682394d9eb9d1db4d23a8b827d9e2ee2b924573661de0ae067947186dca28d79a4cb9d6949c5c6b2465f5549bd5bd9b5d2b696bb240f09b47f33da7abf1ce348574b48d29479b4639daf4dc1d6d130aef0c0aeff639e11d45e19d69c35b2cf1ce54c36072903b04c0d196b8ca65e3135637b65c771806f356cbd632fcaddb715532eee46285281d5d788b68900153ffd8dbf9f0fe51997c73b410da533d833136ef8011b159227d44eceea2702362e536e1e0e23b512ebe734e2e5e41e5dbd954be9d937bbe1d4b11dbc542acb4381cb14a9b70c870736d99151a11bae49f22d7333408b3b31626fb8ea3629f678bbd9f48af7f282d72ab81c6dbf401ef8069fdf4a9725372575af2a694a5f329cedad235cda773ef824da0625f902df646c5190a47bd5eb5d6631c26f6cd2807ded5e2c07ddb8773e0cd2dc2cb65b77f396b0d107eca27bfd354f06642b0f1eddd65b93f56e4324d95af29aa2d2817d8c3e202c77708e7025bda5c408ebbecc2ea02e1d7ddda93125e7a686f308044b327e742999cbdd22ccbb83c9520b7958d9c1c2b2aec4253bf51519f133d78ad6d487a43683b3bbdbd05b58e34b30e14c1ad29c75e6471ecb292708ebd0d556cef632bb661d27e95b1a076aaec9454872aaeb7a562ad0e1aab1eaf0c13eb442ad67d6db1420a8791be1d954c8b2dc954df2d5c324da284d758841f1c52f8648a4bad8d0b346975d3c85c5c0da577b587b33e74053e85d261894d878122bd99965997dc1a6b5329ec4b2dd84bbb87c33e8d327999cd6418d46d6a1e13982adba4d5420f4385316aba2d5e2891ebecc55cbaf0bd69e13328a3f6cb6ed41ccf9446d90e086fd4f654bcfbdbe2d5cdcf71796afccea462afb7c58ee7a274e3b70a51d01b4f4315d7184a8f1d6c7a80b1d050b52e5009312cbb2365e48a4c882bbdff757998669b45c5bed2167b4781a778a0f908430c555e1826ce9da83857d9e2ec9912a72deedc0aa19d292d0ec8c4dd77ae263562983bf7d954ec0db6d8bba630f0372ccfbd529843c5dd688bdb9f4c9921e34cedb3cf976dac3031ef42c5dc648bb94f8ad5b406b9a5ff5c4a97d5365d7a901476913734e6c4631ea5c31a9b0e03b3f23075c98d4c15a5d581b47f2cf29e5b2475a98f902be65331afa5d3c4e77180c5f2dc745840e9b02e9bf58b52a6adc27bc3ae54cc07d96286d6f59e29331bbb79a5f95e5e0fa84a2efe8052a1d493b3d2fb0dd5a11e032a4d6bf497a2c602f4a0f6f522f0cf2e83f697e57e084b3d3b57caa36a59a1ae94afb6fbe522c47ca06c722c93d74b65efd2d733290f7a9d434311dacd46082a25d815dd1ce54b979c61946f778afdc136f6ed447ad7298c1d7bd86203a18788f40670a781e11ac07bda84c3eb00b0bd7b9437431652820f8b28782f9b6018063a5ca48fafc8217f53f8425af8de36e130b37044f305636601b65d0f3fb3b088f2a0a36c1ed4c1e24161a7d0f6a1623cda16231c26f3799878aaa9788eb1c5a35b4ae3f3d442dd978afdd84cb1e33a32d90998efd5fab342c5be988afd385becfd84adad6ad722b7bab986d2e7f84c3426e4292d6aa9d84fb0c5de2d635ae432d4b4848aff445bfcfd03a5065ea2173e3d96521a9d44e5faa6b498c375469751319e9cc903c6e6a94b5e47c57e8a2d76bc2430d9258776417dc894df8f8af7d44c5657e6c9eafda9d84fb3c5ded16275f8d660bd25ce72b922137caef0d3630b54fb1146d6c7e5794a0c36256c6d602c97ab4061e90b8f46a55ef36262f217b1c41a3ec150c6a805353bb1dc96fa72bd6acbec20003d4bbf6ddf20ef8067f3eb0367da7c40ae94cdb457403ef4f2d25fa4fe22dde12c916df3827c284439c50a5b310445c2d9167615034cab6c0dda33e80268a52d36a8c1e0d31f519afbab28c1e744147c804d3094c6f0f19148ddc3064af2b95125375292cf8b2ab9c95684c8d5e0752d5284a4bfd294df02e47c9bf75873f10532178fce908ba3eb4ae5e1d5b6f48654b93088f35f4027f71a4af04511051f4809be38a2e0b536c130b0714910c119de825d4709be34a2e0836c82a19b735910c14369c1bfa14a81cba3960207532cae88c8e2104af09511051f4a41be2a22e4c32847be3aa2231f4ea1b826228a2328c1d746147c24c5f8ba888c8fa2185f1f91f1d136c1d0cf830f45459d833d86e27c4344cec75a0497cb97a60abf07032c260dbf480bbeafd5230dafbd5e856f68d13b3050f15335e571948fde14d1478fa70adb9ba316b627504e7a4b1e9cf444ca496f8de8a427513c6e8bcae3649b6498d6bd3d88cabbd3824fa140df9107d0a752a0ef8c08fa349b60280deeb2673253f48db4e8d3a9cc7277c4cc7206e51cf744758e33a934bc370f697816e579f745f4bcb329c1f74714fc5b8be0f252d162dd35ee65f00fd87859ab15f8445fe6ee1adff2f7736cc90da9f25090e47e904eeedfd904c320c8c3410467180439d726185a608f04119ca105769e4d30cc78c1a70da32e703c9fd2fad1885a5f40e5d7c722e6d70b6df955be2d5ed322f935c88692e173e9e3c2322a2b5f532fcb901f73d5053256fa98a5b5507842160a1c4a5045c14594ff3f9907ffbfd8261cbce9294b02546c908e49b132a37c828ef2129b03cb4d025a7e82a932cf6efcb4cd8d3714212698c26b94d5859f1161e696c22b4039f2a5365f03459f0d522466a8d32eb30986f989e76c4e1c757ee2722ab6e73962bbc2161be496176cb16d9825a267e888aea452e7c588a97315c5eb250e5e5753b1bdcc11db35b6d8a06c864f86462d9bafa584bf9a07e1d751c25fcb83f0eb29e1afe741f8ef6dc2a167089fb18dd433bc8152fb8d3ca8fd079b70c8c86fda1c334246be91b2e2ad3c58711325fccf79107e3325fc2f79107e0b25fced3c08bf9512fed73c08bf8df29c77f2ec39b75356bc9b072beea084ff2d0fc2efa484bf9707e17751c2dfcf83f0bb29e11fe441f83d36e15054fe5d442c2aefa5d4fe471ed4be8f72f80ff3ecf0f753567c94072b1ea0847f9c07e10f52c23fc983f08728e19fe641f8c394f0cff220fc114af8e77910fe47ca2dff9967b77c94cab65f44cdb68fd924c3703d7c123aca70fde394ca5f4655f9094af25751253f49c1f83a228ca76c8261c9edbf8308ceb036f7699b609821fa2688e00c3344cf5090bf8d0af9590af27711213f67130cd338f065f0a8d338cf53a0bf8f08fa059b60988a83ef8f479b8a7b9122fd4344d22f51cef16354e778994ac39ff29086af5069f873c4347c95e2f14b541eaf51927f8d2af975ca3960679428cef1279b607ff3e8e835ee1b94d6ad226afd26a575eb3c68fd16a5759b885aff99d2ba280f5aff8512de360fc2dfa61cbb3811d1b1ff4a1521ed12d18b907728b5db4755fb5dca473a44f491bfd90443a9d73188e00ca5de7b94e04e1105bf6f115c3e1c4ec2ebcafc3bb2ce1353c58edeb56af9d2d41875de7f712ab96b69ea5d99677d3adb8858a762ba24602a66b0bc33776da809970f2827eb1ad1c9fe4ef94249445ff8874d30f842b72082812621f8430a45f788283ea2ca9f1e79287f3ea684f7cc83f04fa8c2ad57d4c2ed53ca3d7a47748fcf2895fb4455f9734ae5be1155fe279584fdf290845fd884977a87fd83689d61ceee5f94d603f2a0f597542a0e8c9a8a5fd924c3e2a64141786458dcf435057a7044d0ffa6040f8928f81b8be072f9e5007899bdf0ab2cf83e015d1ab8b61d2a6b5bd8429f434baa16fe9672f70da2bafb7736c950a90d8b58a9fdc7e63cf2d30f85f9527ba64690feb054f866d986811d6578c2fc527bae1a514ef13d55c06e948702f6bf945f8c88e8173fd804835f9405113c9c6e9efd48e11899071c3f51c237ce83f09f29d69b4464fd0bc57a5444d6bf523846e701070c27590bbb31510bbb844d32d4ede511ebf65636c1d0f4ab88d8f46b6d130c7dbdb1410467585bdcc62618a60d2a8308ce30bf5044091e1751705bca2dc647758b629b6428b9378dd8806a47099e1051707b9b605819be5910c119568677a0fc6df388fed6d12678b877b845c45e79279b60283cb78c587876a61c79ab888edc85d278eb881a77b50986e27e9b88c57d894db0fc345910c119be32d38d623c3161d99c087674b6b7a6d3f73c9824b716852deac6c80d8df452647f13da64d32ef985ed4572aba3b0d2c3247c77cadaed6cd66e2984b539385f3694eba59e75aa390cbacff4fef21faf53bb9b633b71afc4bc060de895b2a90d2f2285b1a80765d1249b4553852075f26d58e9515ee4b1872d51ab958debb2d8c26f654fcacac9362b6b9bd34d7fa30a7fa1caf737e8ce2c11d5aa3b33b3f9cee477affc37406a3d026be4dd63d0f6c9c9fdc061333088ba416e5fea6fa86cda8dbfa81b9cd6022f86ba909b33f7a2384db1719acfcc09b60c842d861b65ce5f8e9ec94c283a87de1487a9360e7b30729811d95f688f0943a40f45649a8dc8c92de61953056c36ec6ff05b23a62b62b5ea4bc4c17215ae51682b925fbbb37feb2e1f7ed897a23edd46bdd2289da7483d7d76ba7c862deb933b2284a963924f85b1a01f65c10c9b05634359a0eb7cbb96743b218cfefd29fdb7b7e93fc9d03f1927ae1d6709ff2b10556ac3ee4c2d1abaa5939f9a710065df4c9b7dc30dfbcc369afe6ecb2c991f960ad8823b3fe93090d273079b9e3b064a8719724050ef97a75363b6f777b2fdd292693388b279c720b91fe765339d66a8740a6a43aeb5c660ca8259360bc665e81d54cb72a0bab9ad3c5df605a076c01fd1c5f7d9cafc5ccae021940d3bd96cd88ab46186aa89d2dbcc3ad734a56d2440f768d2371d0863532965d3ce369b36236d4ad722d5227fc3db649b8dc396a1942db36db66c1da2079a6acb524bfad136d9523b8c551b5056cdb159353d07afd39ff030ad36f38cfe406098de75184b875196ee62b3745ae8f473c5ce0d293be7daec1c4fda497f7533d55f1bb2faa89614c68ae19415f36c56d0b3ac3aee549de1931f75ded1324bfae04f2d86d178234ae32a6acc26b7f2a170a5f708caa2f9f92ebd53bfdd46db93ba0d75185bca285b16d86ca90a6dcbcce6fe43a3f5ae39b24590b97e4ab58e83c2488ac2aee1465153b76cc06ddd99d277ebe5047c5ddead0dd796df98b276379bb5f42e2b366bb5efa68f39e65a7e6c4269bbbb4ddb29462b1cc78ad363aa1cd5a893f94be72deab94c57f263e328cac63da2d838c96b69d718e547cbd9389ab2714f9b8d3302da68ef43e6c7d2dc7b8e63285b1752e919adad01d7167bb6fb4b6c6ad2befac9518a945336ee95bf52646ddebcaf82d2766faa3d1fc4fbe679b7ef2bf4475ddcc86763294b1745afcba839c0e016e6db0b2b296bf7b1593b3be79ca63fe592af9c968f91917194edd536db370fe8d3a03d8c1aac133bc93b565bc7eef3efb7e3296bf60d32134a59936dacb7d035c3a694958b6d564e20fd153e175725e0835e4d868736a9b3dc737413284b6aa89179bb25d41c76f01633cf9cf566947db5d478419099934c5e95c98e5c73d5e694154bc2f555615e0f3e0dba54d9324bce87ee2a4b8a158457e57b767c0bca96a5365b268a207310d9dac8e1e71b729b5fd992b26d1935d790db9802d45db0f6a5467ae86a611b89cbcd82ad280bea6c164c0e6d811e47d4fae7b20e29dab8cfd69485fb851bc94a2ff1a60afff3c5b0ca605d8e255d2e396a1bcaa2fd6d16cdc9a1f594cf556441620963fdb694f5f536eb470afb6a32fc12022ee7e9da165f0ba3ef444adfe56156bf617d739997cc26338c45db5116ad0832c38a39469d61cd354d265116accc4fa9a7d7abe5368f978f32623265e1aa70f343d97a56f5023e220e82e6a930688f715c5eec9c42d97900b5c221aa9d73057c42bd5a64ef3bdabe2b980f9ba7523637841b2b086e736efde5fca4f034cada469bb5db88e0eb39e6652d6d38dbc5d329bb9a6c76edd05c2fcc9429d624530ed2c3f7b0e4bc4dfab570f3edf9989d2ff6fe25e44775a7494d605c223967d428ca61603151d16cd398e6b5826352560b26cf03ede55ebcd02bac127a0d67f2d5414ac26a0f66db56c2ff19918084685253d696b779a748f9f5ca36dfd761edcc0c598ad7caba66b1773c4bf89f7f375fbea4acb0addd84b336ebb2dba45fd534bfca9448142b8bb42c8f343480d63b4bd740aa7650a9daaa1c26cce5a6ecb97853762d0e84d85adb7da84f1a59dc26b1e9ee0bd01f124fc03bb38b54a6854187acf2cdf7ac4df9a3a500bd2e23abb8f9a8c0b389eb279dcaef7037087f580e7e8a8b5a5500f7b59c70ba4a38b305ac2f5cd5eca753d4a8e0d220f63980ebf46e495ceb3871c9f902a92014dea06a1cf05c5a94c47310279e2ecdde54a5e67ef68f9d2fb52b4ec2fa0d27ac5e121634ea1b5455011d64787da0a1b95393c4180774a3da27d11dcc89ae77b39f2d90adc25aefd6242a5f0c5e7f1b0778e3bb27e11dc209af7b33bcc9f2a11a04718ed02fa934c402da73a8643b94135ae76668babd16b772ada42489ea304e542512d52251d1dc05d48de07895660b7b25811dce5f116860ba71315d560bcb9bb364bdf2bb38a03b5c00bae22243b8b97c24f74e5238de74770e9abfd3c45ab9a4b441caab31bb77d0eb714ef32370f7ac2cad8b5316d2a7ca2c0ddbb2c0154559d6765f59c8c64e5996f2b62c40bfa52c742ba12c50d1951c79b18f9854c0c8cb91ffe38322153028721440808d18e0c72f478fe62c4707aad4f3c7c05688fa4063a8300a5969ea32304d97d49dc474e969d3aa7d4af9fa4c1043732963ef13c9eae9184eac830363b5bdcc32810fed055c68cf45688fe544dbd782965ea5b308d6b6f1e1ecca85f32584f338977056c612276c57a5711ecf89b34f169ca96bb62abd5a930de6de5c301f46be79824b30c7c610e62308e6892ec164acdfd960fe09c13cc925988c65261bcc3711cc935d82393e8630ff8c609ee212cc4d6308f32f08e6a99c30875860065f07c7da471a9e6082fb0b827b9acb7019cb5436b85d513bf47497e132b64bd9e0fe0779ee192ec3656ca7b2c1fd01c13d937f9e32530586574333a22ce6aabe3aa342e02c4e94c314ca7aef26c0e88f2f35481f0cb3f48eb130e8cc053981209fcd0979b80179b11cca6b52b0fd35aa41c7541941b38da95e820a86df7282eea9402f5663fde676b3da52d642612117c6bd10c6730ad141a030a696afe33907a3d94ad85a04f3772ec1dc2c8630972098e7ba0493711c800de66204f33c9760328e03b0c1ac4130cf77092663bf9f0d66358279814b3019fbf96c30f745302f740926630b930de62204f3229760c6b1f3b90f8279b14b30378f21cca508e6252ec1dc22863097219897b6ec08139e2289e30cfd3508e5652d89b260e34843b9501e84505ece8952afc45b1a68e4b340c3c923b9b00e4258af288487062b39e3d83cea89505ec98932f8a246dbee118c681fe442fb5b84f6aa96f5d2b857495b21945773a20cbf3e947184936d41e3db08e7352db99e24b5861fcb39c2c956c7ff8c605eeb124c46cf6483f95f04f33a9760328e70b2c1fc0ec1bcde25988c63ef6c303f44307fef124cc6114e36981f209837b8049371ec9d0de6bb08e61f5c82c9d8b56483f9168279a34b30e338fcf1068279934b30194738d96076416b926e760926e3d83b1bcc4e08e62d2d0933b56fce9acdd97ae7b7a36c7eab4b30e3f84ad71d08e66d2ec18ce32b5d772298b7bb04338eaf74dd8560dee112cc38bed275378279a74b30e3f84ad7bd08e65d2ec1641c826383793f8279b74b30190787d9603e8060dee3124cc6463b1bcc0711cc7b5d82c9d89d6483f91082791f27cca122f51517b8596f49b5bdc09ff95dbfe62ccf4380efe704dcdf000c0c9a84ed3b62715fac50847aed0fb4e4caa454ef8c63597a0bf2ce070b5196d22b93b0fa8b38cbd2f65c30f740301f720926a367b2c19c8a603eec124cc69e111bccad11cc475c82c9d8676783b90582f947976032f68cd8604e42301f750926639f9d0de67608e6632ec1641c8167833906c17cdc25988c4d7636985d11cc275c82c93802cf06733304f349976032ce0db1c11c8b603e550898d4f26c734d316336675b513c1ec17cda25988c15101bccdd10cc673861dadec9d0db4ef91b92eb70b2773becf4be46c066e9b0873c6babb32317da5311da6739d1ea1709f4a0dc6a79e3fa3620d7060dc83d578801b9602f62c5713b8afec8339fe7440951ebbdbcea64e46cb0fa72c1ea8860bd50e81232f856fc8c6d4cb6adf80f44685fe444bb815142e2fde58257428cf53b5b25f40a42fc92bbdecb3878cce6bdad5185f43227daae0aed3803f02af94120b8890d1edbae87ab905fbec2096f4060bf2cdc16000926a8df20a8af16621a38bd314fef2bcb5a7e76e142fa0f84f4b596ec6ca6b63a59977bb1b53b272098afbb04338ebb1d6e8360fec9259871dced701c82f9864b30e3d8bddc14c17cd3259871dced701482f9964b30e3b8db612582f9679760c671406e0482f9179760c671b7c39108e6db2ec18ce36e87db22987f7509661c773b9c8860be538871f7600b61e3f886c6cd08e5bb9c283b2b9410f112e12fd4f665c3a792d9c01571811308dcdf5ad20753c788e2b885d4b308e57b9c28e96f0f051b6b8fe368fb7b08eefb2ec3656c6fb2c1fd1b82fb81cb70197b466c703f4570ffee325cc63e3c1bdcbf23b8ff70192ee3d01d1bdccf11dc0fdd5dc11447bf3d18a1fdc88dc963db86bd8c63a46c1bf67e8dd07eecaed7327658d9bcf67984f6134eb41b0af36558988f5fea5dfa5ff89cde1508f3a72db91e2ffe2f2e7446283f73a39cb52dd26144cbb648a709a1fd9c136df8ddbce3b85cfc0984f39f2ee1ac8c25ce6f11ce2f38710ecd5055adcf1b635c8400ff8b13b0fe280aaea4b2d7fde378b19ec185b51e61fd92136b3bef60957709be1f033780a0f8b5485b235c5f71e21a6d6473df1b9b84fec473b5f440bad69fab7cb3c09f45d99d0bfcd908fcd79ce0f512dd0aa3d28af312dd3d11bc7fbb33f117c7bd41af4328bf7167fe2a8e3bd01f89507e5b881a3dfc67ce18c7ffd93e73361c61fdce1d0f8de3e6e9af2394ff7177682f8ef3abeb10daef5b72cc2975614f1cd795f64128ffebc69893add5c988966d6cff5284f6079706495817a0b10d927c8670fe58881a3fbba7ae0f7df8cb10d69f0a3d296dc73a433d52b037f1d8fa4ebf43707f76cf6799b7cb629b73ba0d61fdc58d4acb3651c23821cd3651721442fbab5b9516e3aa14b64aeb558453b462c4394cd8b6bcaef3a43785ea0ec4714560ab441272821372b6ee40fcbf1edf0df96bab42a00c32a812cf8d8a9e42285b73a2ec27cc493de83f2d16fb1b48f1f208c6fed4202ea0cf21a06d5c03cae8a16c408f46408b5c03cad82e65037a0a02da961368cf2c1591b694d52f177261dc12612c2e845f666fdeeb195156bf7c820be8c508683bd780327a281bd00b11d0f62ddb4cc273a271fcf8e4b50865074e94dd44726e1eaf7b827305989f675bdcb03902d8b1257dd1fc486ffc7a3f8722949d3851e63ea9cc585ab24d2af742583bb764ff3cb55319c7dd9e4a11ca2e2d8b32ee15cf7484b22b27caf0239d8c9ec936d2f90ec259c2897384c53353c737fdb1f8e5f26f6873ae9622a78935c21f99af92d40a30b6b42317ecd10876b7420e2b37087a45f3fab66ab43d1a56eece0939dcf631e362b9e7e37ce4b13d5c8219c756c00204b3a74b30e3b8e7e33c04b3974b30e3b8e7631582d9db2598715c9bb70b82d9c7259871dcf3712e82d9d72598719cdb9c8d60f67309661cf77c9c8360f67709661cf77cdc15c11ce012cc38eef9b83b8239d09d690e46946ca34db72294833851c2418d7700531cf15bcad501611acc89a944e0d9a0e4728482cc05b12d40d801e11bc2892fda3b4771dc5fec7084b6d4cdb921c60e23dbdc5005c23a9413eb508bc782124dd2275778590786895719a8e3bfa9502b047883421709c15ff0621c86637bc1ab180d100f73675e338e8370fd90976ec889527f0230f80aa5f5653ae3648478b81b05813f5197fad20ce3401ddb4b336b10da8d38d1f612a9d3717562fd5a40fb2f0472842b20e3b8b4fb2304b2cc1590717ce9e02704722427c81e22d92135b7ba2a50b794adef5482206ecc0931b70f5232fa25db07293ba2b6e7269c486d1f4e5d5f172a9620a8a3dc19ef646cd0b38d77de80b2fc684e947acbb5b106d0386fb9b610c11bc35d7b9b95cd34a92e7c14bd4a0af5af4304f103d906812c77676d3c6386665b1b7f3a42595188162585d2571dbe7cccdac7b9910be46908e458574032d6d66c208f45202b5d01c9d8966403f9020239cedd59a3387e4fe9108476bc1b836eb6f14cc60a896df4fd0b8476537746dfe3b8ce632384724221e636b37ba9b9b51a63b9cab6b5da5508eb66ee61ade42d53d976fffa23c2bab91b65aa6d22837146936d22e37c84760bb7de89632c00d8de897b06e1dcd2259c95b1c429d0f0dc5685284f718d1fac9a62ec90b255532b90976e5d88a1baf4cf51af50b7c4afe99440f0b669f94e687ca77ecf4420b77505641ca77e4f402027ba0292b19dc906f2af08e476ae808ce31cfacb08e4245740322e966503f93d0239d915908c63476c203f4620a7b80292b1c3c806f2570472aa2b2019f7476003f9230239cd9df7d6368de58bd3fb2398d35d8219c7777deb10cc192ec18ce3bbbefb2198dbbbb3c288b179ceb6c2e87a8472a63b6b3b1851b2aded380ea1dcc1cd77db18ab21b6e5844311d61ddd99a18c63b9d91ba19ce5c69c8f6d1e9d112ddb3cfa3908ed4eeecd52c67554fd72847567f7b0328f6eb24dfefe01619ded4641609bfc651c14619bfc3d0ca19de3d26ce558cec13ab6d9cad710ce5d3871c29e197043838456dffce22a1bb26e5cc8da226473dd5d88c838bec4b610f11884761e27daf6521a9492f5d2f25ab196d3177b72016b878055b9d3788fe3deaf0311caf9eebfdccfd8d5647bb9ff028478412110ebf77dfd064f83eca3afdf5f193c1121ded5dd9627e3fa63b6966707b4b06b37f7de0f66f456b6f783df47deba3b27d2eedec1be6afb34ffa1055e58e35d5a29e608ffd5c25aefe1f865f8f608e11eee4c7c54c6b20db02382b9a74b30e3b8fffb2c0473a14b30e3b8f5d4f608e65e2ec18ce3feef3311ccbd5d8219c7650cd310cc452ec18ce3feef3310cc7d5c8219c735219311cc6a9760c6716e730a82b9af4b30e3b8fffb4e08e6629760c6f1bde09d11cc1a77562b31f67fd8562bdd8450d6bab35a891125db6aa52711ca259c288758b2b87d206e178f91bf475283bcbe52ce5b32d6ec6771c15d8ee02e75770a8eb16fc4369e740442bbcccd55768cfd77b655761b23ac756e8ccbdb6695184b5ab6a561ff4668f773b730606ca7b215064f23b4fb17026dfa84dd140970455acb15bf4a13c71760ff89d0d6bb3fddccd865659b6e3e0b215e5e882d032a0dd071dedd732582b7c28d0acb3691cce8976c13c9ab11da956e2d61642c49d996303e8e70ae720927eba8291bce2f11ce030af1b22c3536856bf838ee15d21d816c7005641c9b4a5d10c8465740c671af900d10c8265740c671af90c108e4ea428cdf07ad72183b996c15ce3d08e61a9760324e86b0c17c14c13cd02598716c0a1d8060ae7509266373880d660382b9ce259871dc64b211c13cc825988ccd223698bf41307fe3124cc6890e3698c7239807bb04338e6f679e84601ee2124cc67922369867209887ba04937171371bccdf23988771c21c26526786168b65de6df59e2ad430f10cf568ea1a12c6f627db18fc5708f2e19c906184a5d103bb521ca8667fe045197db93186fe5984d01dc1fd26b19eadac9391cff5ac6303d69f0b582704ec487756d131d6da6cabe86e44288f7267151d234ab655748f219447bb839271988d0de58b08e531ee2e9389e34bd76b11da63ddd985218e2fc0f445288fe3443948a16c92edc9c6503e1ac76fbc0d43608f77152ce3501c1bd82108ec09ae82651c3066033b00813dd155b071acae7a20b027b90a967150840decde08ecc9ae828de3be60e508ec29ae828de3db1e9b20b0a7ba0a96711a840d6c19027b1a2758b0c0dfbf0670358919a241feb52a86e39dc508dae96eac39b6ad85676cfeb3bd247325427b863b5dd438bebcbd214279a64beb8dc7c672f9d72708e759ee667a46b46c99be5d2289f66cf776f71ec75b96b26d9a7eb5f4d8e22243f8f434e15384bfd7b16f729d2a11c7787574ad840184177bc7b36493a849ece365e13dbd7fe1d2622fef9fed7c42be97344dac15abe459905723652ff7ae82668da2021a80bf05d768ab5ca32c017bcaae526d8a7aa559995cd26b9e9d26f45b7a555257ff3ac45396754ab18cdc11ba2c439ba68cd8b917922391e8a6526085276727ef4a9327a3466a54eddd59ed590dcf948ff26e4b4cf07ef94dd031cd8dcf31ea15a3e5ea489fcf2e13f86796760e404ed8f35f7dde3c279b45beb3c3f34b648ad44aa933b35a9add3eda0b3b654895f2d19016ebb3fdbf837457c92eddb48f74eff95ecad7a8cc32dbbbb9462a053f45ff0790619c67b75f0200 serializedProgramBytesString: - serializedSignature: 3468268469e3044aa33e2a24ad01769d5ea712bd2a9fd99e4869f1f7a064ed671aeb2ef3c6391a05663e72a29e3e1a06f51294c5e22b2f67b63fd0703f0b5501 + serializedSignature: f4e327b56cf09cd906c21b34d8b2c90486ad283d4559f45d2667c6eb2ac6aaaf247637aa8074f5e5c78aa82ff9f2a084e2127d151fd4a13e8abc0489ef76c604 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset b/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset index bb89268..011d798 100644 --- a/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset +++ b/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d577f53c915c047b6e502a619700183c134b12e920d988e71c3988e5b922d01630c78d76d6d43206d379bbee9c9a6b74ddff44ddf4df90e79cc631ef211f2b04f49e6cc9d6b1d8de6e8de2be9882b67e59f35baed94ffb43333f74a2571215f9156f9362e86459f681763e2b6981773f2539f4c67e59fb3e5eebf2616657a57be4fc863ad6297c795f03a10a997ef43726b492ccb2bef8b49994eabe323624a7e1e92d74ec92dd87b47fe4fc9b32265f2a231d12fae8a2ba22eb2d543c4b8ba6849ef8b805f914af9de2b1ec9a353ca2850125787eae4db883cb2a48ecd4aa3ddf39e12cf28b766e5b14979cda29891326f298995ffae12ea837092753aadd2e97a9dee95ffe5f2ff3cda2e43db1be47f54fedfd6db255a46a5fe8c656f443aca1583d4fd6b88fd6b8dfdae8d9b745aa68f5f308ed7e8344a1cdfacd372e2f8169d5610c7b7eab4d238eedab51f9dbbdff0e980bee622da967e44fe8158e0eb4a0d1deefe1ab40dc72f39fe466eeafdb53adda78f5fce60e33e9dc6f4b9570c5db1ccb697bc62c871afabd3e75ff5677b4959061b4b73b3b1f4ef861cf7ba83fafc6b681bdbf0843e7e1d6d83bc8786cf2d865d07d17e2ce7a221e735438e7b9dcbc62f3b574e0e65b0ec6991ac77f83ab70cf92c83a5ff12de6d82d9deb48ad4f6a655dbf486dede2e52db1bf7fa069db6e9eb870d1fdce3edc6f16d06afb8c124eee88f261cbdd17b480ea40923bfb7a1fd58de7543deab7abb51a7f5c8171baf76437e87482daf1d861f9d861f9d5aef5b8e1fe5ae7d6d3a3d64f8d181f66379d753e595bb3cfcfad166c8afd77247325c13a4fc1c16a9e5e7b0b6f32dbdbd53a4961f97d71191dec674194c8ea0fd901e35181f757455fdd390e35e77ccc8b31d3a6dd2e9717d7c146d437a02d95666c83c69f03b8174e1e36386ce5d3a3d65e83ca5d3d34867d4d079c6d079dad07986d0b95ba7dd86ce6e9d9e453acb0d9d3d86ceb386ce1e4267b34e7b0d9dbd3aed433a2b0c9dfd86ce3e43673fa1738f4e070c9d033a3d8774561a3a070d9de70c9d83864ef7ba1ab48ddae08a6a61a943d148c489e1a664e8bb20e2aa52418fe3377476aff40e9a417439bcc1eb8052bb2cc3d30529c012b98ea9b87859b63a9dd6c8b521528decee53ef13f28c6925743c5dc59b692ac0b819f93785c2ee25b97f5045ed10784fcb23ed12e0b4baeaa66caa9e927fa952c6a5da1919ba4fc9ccbd2f5581bc9bd2ecf433bd5c8210ddbc6658ca744610b3728f0b74416ecf280b47d4fb0365e994b27e48ee5b56e3993939a2e995e943a52dddf745f9d9a6735423b3db681f4850fb9de18a9b4dfdd21bb03eaedac3b773e471e4881a3e8ceb6a581657bdc8cb6939f13643a791810e6f48cbe850c82229fb3a455cf589c3690483fb98eea1bd7c3bbcbb644093c9173b19c8eeedca83640ef71ebad878adfda5ff44535d3b24e2aaeb6df4702d135890178bd4a649c8ec42345a9600434dfc111b7ed5558f1410bf73deb43a2f780694ab9e293503d434d0a8fcf050fecfe893e7b43933ba5584cb2fab56342d9f12e53a6489593a522f7329d82536d8958586edddba64825db9e2571236bcec04ab08825e3650044b6d0455b4375af0d6026ca7260133335cb3e24592615cedac27aa75265d6b75e0a91aa2a83d1faa553e64239dca89325b4ea8f980bbac393126f73901e9803a3aada2987654a35d4f329d09b970594df4de573664ceaf75b6fc52b17f8b1a2c7058b45e0f35d4ab82c8d60d2a5bf98ca0323f6ac9fc0464fe460ba90490da64b85365b8a366baedcaca29653594b2cdd92baba0946da1946dcd5e5925a5ac96525697bdb22a5b8555257bac804de755d9a43c2b9cc148768d2734626d061b7bed6850b5a321cd3b3f3650257f8d2dcb80e2369b5966f634d0d9b39612bc3d47c1d536c150181afd08aea605afb3098622bd43a48708ff95af34e155b4f0f5b6d2aa76163254c225257849dde9bba436097b98e4a59f2aa51ba8acd965c91a98cc0d92351b6d59a334167ec4965d0c0b53a57566c6082a866d1699065c4123d84db6ac017a7b2c46095bd634d359534309df6b111e09287c33257c9f45784940e15b28e1fb2dc24b030adf4a093f60115e1650782d253c66115e1550781d25fca045b8b58dcd20bcde569155ed9e62adc8deb16a7ec37758052e35c377550f8162fead8146d67c2302f816d5b6f09841b5400d54996acd430bb48d12de9607e1db6dc2a15b6b17e9ddda1b65c1bab5469b70a80d714bf1496c4acf62f9f662777a48de42abdc61ab80aa0d7f9ab502a62f2ab99f7ae5b5f7a4970fd44ac17d5deaccf333573758fcf617f674a8d2bf4bd896c682594495f59d5489e9b49498b7ca839598269b701840c2b27eda84249498c995ca7c49becf8be7d442408f5e9a79600bc02b68fdbb28fd876dfa3793fa219099c8d286dd940d4782d9d0af969f2664e004c5f976201b9a291bba6c36d4faca874bca16983a0e62c91eca92a3364bea7de74876d6ecb5352f2a8a2be46469aff20ba44cc8738307ebb036df62761cf6f6e4b8b0cf727a9b40b51ffb6c190a4dc2095b231760f0bcdf2618fa49b8a524d77ef2804d3864fc292b4b53f2715a728c32fb741ecc3e48093f9307e14f504cba7365d242997d360f66b75266f7e46a769b4d32cc42f5fa29da19261adba93ad397639d89532cfa736591a0b270200f59d841093f9707e19d1493c15c991ca2cc3e9f07b30f53660fe56af611caec0b7930bb8b127e310fc28f524c2ee5cae41865f6e53c987ddc261c666aaff8a9ee4db4e01336c1d0405df52338430375d22618467a70eba8cf911e8ce8038cf44e5190aee708e9340569384748672848236c90ba2948a339423a4b411acb11520f05699c0d522f05e91d3942eaa320bd334748fd14a477b1411aa0203d9923a47314a4a772843448417a9a0dd2799b4a184e3e232c8355c8453caac24b53ede286fc9b97c3c51b12fdf3f2820935ae82794a38425d97e948eab1d4115c9041f010e5e5bb6d5e1ecbe0658f1c2dc2d38c8fb4bfb00f4690a6adc975a14cbe27a505f1e602e5cd0d9b37a70378e33c1c99c917bf79352ea94c079cc2b948f975d3e6578fe157d24a5c122f0998a85892bdc73d556afcfa46e75ff6a5f012e5df84cdbf6e5ffef548c6b7552d73eeeaceddbfe49120be5da67cbb65f3ad8bf42df7fa659315c4932b942793364ff6199e98f6dfd5350aca214c922dcb72981fe257293b6fdbec3ce99b78b03680ce876c5a806b944f53369f12be7d1af4f4291f39729db2fe8ecdfa8bbeeaf7a09afe9c50e72caeb46257e5e7641ffb38dbb461cae7bb369f3b03f44541f30ccb0ae2c108e5c13d9b07301eb5afbf26d768b3f1c44b66108f46298fa66d1e3d29dc9537771d0d3f5ce6580965ef8e5a8c80de7468e5cc01b53001670c2bf2537aa96231c5f3d46f8100d570dfbcbbcc6372c1f7d5e72b8fc72822cfda880c6491c7deada697c460ed6785fc8b4460d031a09f68782439cf2ba9cb52465cdd4b9358c95bef070e41f7ace40bf68caee48ef7e387cf09faf1c33bc25c85c9f649342f2f6ce5b41d9554ec9db74ff4537715da23579624ad6e2c5a6d9ece40ae96ea5c2d89abfb9b5ab22c4dde56cc626d9e8fb07a3d79e308b8a25a1b290016056fa8cba1e159f696ef75c3659b12e03e9e9587276ea1503981fca21eaec0ab225a9200ee739c70d62938374402b5d7c936a918502d942551cd73a2aa4b41d523a5c2e39b8fa477f3c68365bdf292253ffe8600dfebe580af226a083f97b7f62cbb87fcd25b5e6725eea1346f5e5563b841c46889d58d9261b37c0197c9585a6b14f3a882b12cca5d3238b077ea09080e9eff3fefb713d06f2f0284f36e37a7da9025ce366423ca4bb808be63eca1dab3a0ca039c66e8cce531e1aa94f6a3d98f43d9b421db506fb5cc8d0f943a630c28eabd92c5b25856b9ef3cc5cb86af9a0b5f35c2779f135fad2e7dce20614e4d1dd013ba093e944d5c288f23940f0a817252b784e63a46ea289611650517ca2684f23d8588abee92e5722c6520ddc107b38a0be67604f361986032964c36981b10cc476182d9598430772298efe584d9a061cec893668cf0879a3363acea6cc1d03104f47d6103ca58ddd9801e4440dfcf09140604b7503c991c8499b7e2f7ca710f1bc80d5c20a308e4073841d688e428673265845aa0914e0717c21d08e1073911ba9302a0f88e02e7ca8635013670512e7002817b81139c57605efce1cf3a84f2454e94f5bedbc3e4a349c5d72a56229c1fe2c4d964f4d7ee57d88386a155da777720b82f15a2dafb9bda600cd4d9a636ba11ca0f73a26c36cae92d7553c8733e96b0938be2aca595ad296843883ff2383ba9d4d923c6d2ca367bb41ba1fc2827ca6d1694deb75a3096ce162ea48d08e9c70a8114b7a5ab13e94984f4e38fb3c217ffccfb7a84f213e1e9e9196790d8509e42283fc98972b7052518b1acbe62634e5c10ced78aafb611540902fc7278faf9c345d8cfef41283fc58972ab30673b57d7b4f11104f2d36101598c43cefd08e46738411e34407add98e0fd980a2b70b6db17f621e09fe5040e8fc1dbe7a3f097f614e7dc7c1982f8b9427449fec227c62e892d7c1a40283fcf89b2d16800665775356f4758bfc08935bbe127e32409dbf0b30721fd2227d20d825a4d9ad3a7145fe41941f0bec409cf0d98a816b3d823cf1604f295b0802cc6c83386407e392c200f1521c84308e457c20292b1836103994020bf1a16908c31251bc82e04f26b9c208385e78c959b2d3cef4528bfce8dd27bb858ccb72e542094df2844a9f4378fc91804b14593bb10ca6f72a2cc6e74c388946d74730621fd1627525827c037d3303f07d4c0056c0d02f66d4e60a06872a574f5eafb3b968a10591542f61d4e64e94f9e0dac8212b716e1fb6e213a10e71956ea5957778a22ed19fd2268edea11ca573951bab71106e940f0dc2363f8cd16e89c4370bf1766b88c834436b86711dcef87192ee368870d6e1f82fb8330c32dc6fb354f20b83f0c335cc6f09d0dee6904f7479c70e9c7aeccdf8329cea5dd7204f2c79c20b31b5a32c6036cc1d62042fa13eeb29969e2a3d8d77e362190af85056431aefd6c44207f1a1690c5b8f6b31981fc59584016e3da4f0d02f9f3b0803c528420b72290bf080bc8625c44db8240fe322c208f1621c83a04f2576101d95584206b11c85f738274bf49865ad64dfd026ed610e83817ccbd08e6eb6182c91898b3c13c8060fe264c3019432136984f2098bf0d134cc6009d0d662b82f9bb30c1640c89d860c611ccdf87092663a0ce06b313c1fc4398603286466c300f23987f0c134cc6809d0de65104f34f9c30b788d46fde4abdc3a3d8bf67b801617c831363b0fbdd187b71b6fbdd9a11ca37395166b728c188946d51a21f21fd332752986ba6bf97cbf91a29367c6ccf97958a55f343040920f2172802e5ba08c47c655a2cc023aeb1805f5799e97cdb3a6b2cf0fdd3b1acbe30cef9ad824d3a97e7e4399705dc013621ed985069f2770be2a040fd7860909fa1c92c13f238b3b4bf424646ec7579266fa5331f3f9460f3d4db3fbaa45767c8953874c6abdaffbf41beeb6c57c5b42ee2fc5cf482163ea57e87efb6320a5ed1ff01c66aca9422af0000 serializedProgramBytesString: - serializedSignature: 01b3f5b3bb399e84b91fb0f8ab96773c5451c06b57bb2c1d8899e5205b647a1e89a67787fb5ac42b89d6c7248652cc9f59aac41537676339e0b88d3e8c32fe09 + serializedSignature: 07d1b47ae2e704fe603607475f5800977d2199d5bff8e4c6e5324df11fffaebcf7dcab6e94e6d3b60d3f45f3f0493387e3c55f0392630c3a9ca27dae76e8130a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset index 5acc6fb..9e2e8e2 100644 --- a/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset +++ b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df77f14c715c0e704870a02098c105d7409217427d18b01551045809a0bc6704802644b82a8101cc789d31327717a777aefbd38717a4f9cdefbaff913f2433e1f67deecaceeeddebcbbddbb7d7b5ec7d24737b7b3bb6fdefbce9b3765e74e2509217f624df26548f4890ed12c06c588b82e26e5bb0e994ec85febc8ce3f2ba6647a55bea6e4b926b13ec79df0531f5b215f7be4d1b4989177ce8a61998ea9f3fd6254beef91f78eca23c8bd22ff46e555b1f9f2a641d129ce885e511babc9216248dd34adf3626057ac4cbeb68b07e4d951a514149250a76ae54bbf3c33adce4d48a5edebce8b0bcaac09796e58de3325c6a5cccb4a62d97f4a857a23ace4ac4e97c9bf72f41ed2a5f26f812ac53a5e22e66e9dbb56a06b63fa0fee1940c79242897d7c4ea77124c3a48340b2cad13d761ea4f3f4fb417d5c9a2e6fee9e79280fd2127dcf103a06fd9a5cba5479d4af1ae555a13c4817e9b2eed0c7b53aad41f7d4e874b94e17eb7bee4432ec7c482bf5f9bbd031a4153aff6e7dbc42a70b515915284ff982bee73c3a8ee9eb21ff1e8bf91c1bdbe6dbd0315c7741d7cd51573dac4665dbb6af4179abd075f63948576ab9f7ba8e2f42394f3df5d47f5df5d28264b6e834219cbedbacd3b5e8dab5e85a48d709a7efc2b1f48db85d9fb6ef6e1499bed16290bb09e56d447990ae174edfddacd30de89ef5280fd23ae1f4dd3a4bbff9ff76e9d2e451bf1d28af09e541da289cbebb4ba7ade89e569deed4e976e1f4dd46940fe936e1f4dd6d3aad174edfddadd30654563dca83748b70faee169d6e150edf9d6363db9c44c7c8774bc0a74cbed58374e8d1e931e1f4ad6e9dee41d7ee41d742ba57387d6baf5577a58fb9caeb34d45d8f416e17caeb44799076b8eaae43a76d3aff923e3eaad37d48d63e742da4fb5d7aefd77acf04a0b7add761c3bdf9c8b3753f6228e3884e0f09a70f9ed0e9ede89e43280fd203fa9e143a86f4a048fb1a2ebf1d1d231f5b60c7115bf7e3e8185d17b7dbcf499d9ed2e9699df6eaeb2f0ba7cff6e9f40cb2e58cbe76d8be361e53a392e3729c90123744023ac018b444afc327fbcedc0327d5d7c20bfcd4ab6267e410e586146018bd0caab1d18c8c26adc6d1cbca5825d2bb43bda6e415634a2814e62ae2f18c2240b971f93b8a865ed332ff981ab9c1e06b4c9e6996c0c7d45d9764d83c2f7f9d528664b1e372f8362a1bc5ac2c0ae45d926a675e99cb2418a6b9efe99332ad51e484ccb181de90c7e34ac37ef57a53693aaab4ef9179336a4c3b2947b5ed32bda54acbb47d4abe379539a0919975340f26a97c6bc86a5753a7b406b44fa871d8b335528c1a51c3e411dd0ce727d448f8918c9a7896a11564e2aaa3b164b4286431475eab48a879485f0641ff36665a68f6ef5cbc2f642103d55dab2c48d730fcc49d66ed140935ad5a93c3ac6c50415e436c798684eceac7e3f393a0a41b7dcc845e4d2d0642440fe7ae2b292979ad7ffc0075bb1b7f06fb245c56aaf0adc8302eb70a14c21203c224145366d4aadca5155c49489e67926ccfe98deee6161ea785cfa7845704203c6e72abb2b0dd2add24a8c59aec6e0553f81d2e1266afaa24bc2ab70694572da0aa675100d5534a095f1c80f03253ddab91f225d6ba1f9479d630b54b9d1d53631bab27859a9890165dd54135dbb5d97da2cab34f542b9f802587a034a37ca59c8a404b0c1128e627025598ea5265be88b52ebd4e938ea9d5e5513901bb2ceed3e35bbbdceb8a1c68648f93fb647a456901f9c39a78f6b2b27bc3d2393e69c009b5f2d725bc4ff6f8ad80c5c412e595cb94573667f14a9336d93cd366715a2d9ccfaada8ec7cd6da24695fef46243b5aa8526df572bc1e742ecc3bc8cafcdbeb9dc73a4aa55b552936155d6612841add2148b2062ac30349524305e39e79bab941e3bb2f8e6807a9e04b3d72b4a97897c3cd31dff6ae8f8b788b26635650d0ced2bc0105fe52ca63ae4b50174c85526475696dd5f940e39b312edc1919f8acceefceb3c3b7f9d72ba842fa7cb475faac1545355bf3e80aa5f4209df1080f0a594f08d0108bf8d12bec9203ce653f832937068119b4d6ee3165c470baea1b4de120092e594f0ad06e1953e85d752c2eb03d07c8549b89a33c9bf7297f06a93f05a5af84a53785301b59f35bc3925bb474bfefaea6d9ec355a30a57990bfbb9caa7c2cf2a13bdaab0e959d78da9ebfcd383479ff5ee900093a20745523c246f3b20ff1e94053f44406d22a0e6528b82bada0035092eb9c34b7c69a47d7d0d25b8b940c16ba9e69f08a0f9af33098759273c272e6885ac8e92dc52a8e4f51490d600806ca084ef0c40f84693705894d9e5c5472a69c19b28ad7707a0f5664af89e00846f31098700b1d70b926a5af056cafff615ea7ff526c930f3d82f8899073c30af80918daf994783a91c7082835ed064e996b751061ca20c809d00fea74e8d543987a9728ee455ce76ca418f06e0a04d26e130206df3520b5906a43b28addb03d0ba9912de1180f00425bc3300e1494a789741b8dfd9450b5599dd0556662ba5f5b10090eca4841f3708f73bbbd84509ef0940f3dd26e1a0216c3b2a7476b187d2fc64009aef3509874e01362315d47deca3d43e1d80dafb29b57b0b55fb80493274d467bc349d2c1df5414ae5b385aa7cc82419fa9f7382e87f605383fffee776cacbfbbda0c9e2e187290306280306f332e008e5924301b8e4514af81d01086fa384df1980f0764af85d06e17ebba20eaa6eefa6eaf67c5e75db692a07babc7bbc3867962eaf8ba2732100f4dd94f07b03107e8c127e3100e1c729e19702709a1eaa32530556e60993600861b0c7b6d08efa24e5eac394abc36e3debc1135440436cbd303d96b4dfb5cbabae490137d506ca5931657cb4e8eff1d22993ceb0f87645102b5a67e5414a3c2043d2ac2c1134c928af892eefb4a1bc847a0011ee629fb5a20672fc2ff65d959ad665349f878f9857f6ae096a652fbb0ed4ca5eaf89a07aca32c94a30d7e37278fe34abac80f73785f5587c40959d5ebf2c64abc398b46fad216ca9d065647f9f62df6a6c55c16b4fd5d819538da947579742a9b17ed9399e94489a65eb1b536db6599fb38fed363dea8829f67dd96be57e534836d6c6b8b0b72305a51945fc2cd57f4c14d87f9c33098695cd492f82b3ac6cf69904838f5cf722789c16dc4f05f81ba6000f5370f323e5cc47d06df2754a554eb31c515c54fbc766647a4a359eabf2fd35958fdd26bd1bd14fa73140d9f01c930d6dae46952ed3d2f3ba34ddd2725afe0ea82e75328ba674bef38c73ffae1ffb0629fba64cf62549fbdc35724cd788570bf2ab9d214afbe9fc6ba74b56edacbac9f2c462d6ce1d947d3326fbda0b68415eeacbab6c3f16de4959386bb2f0a8a71aec53e7524abf1115be0bafc3fcfcf32ecaba9b85d61faeb50e1947a0931e2942fddd4d59f85c9385877c5b6847f6ab869d90b44da67d937eac3a4f5975cb6455376995490f67cdb9f772ba6bd0de8548db9a29c38fa5f750963e60b2f4206929ecd04eefe5b66c9cd675075aa524018880993eea8c8eeeb343f21c0cc7fcd87481b2e979269b8e788a296d52871165b7f509c26245947b29db1e34d976d2651bded26159d7ad5b5bcae07bf86ae719672ba4cfd0f2fcd87c91b2f9f9d418c5eca39df2efb2bcc8b6fd94b8ae2cf36e413ede7889d2fe2193f6ad7947c8e1b95ea0432dd198a2497e3e97a22c7881c982aebc7bb162c7c2cb949d2f34d9f9a8b02793f6941c4fc82dd230f6b822527ac2dc3377657a9adfa73c0d16186eaaab9bb5d5a36aecd2218b02eb416efa1ef0637b6a3aa2ae1d565247e4b5dedb305e04ba98c592f4f2847971228836324c917fd8447efb1c797b326e4fd9e909bcc5d5cef1a773a9fc8dc560d1b44b593f25ef3cabee80a3699150db759322f7528f9d0f654f487f837e6f60ae6fccbdcc039f3ba2beeee08a702fe8e4fbc9f75c56987cbb197937b6cefbc25be6a7fc4bb545b62c495aed5d7ea659fa62a8d5f9ba564b126a1bf5f63cbd29b7162f81d2e6997dc8ff26504b40af1ee712abf4394bc9b57f77871260c7ff00bee7035ccb1ad24d096b31e64999551a2f4902fd977222b2be660a6e4fc94b66220167453c0de7659c702a159c091dc07be58520e88c6c7e572201ea899234a89773825a48809a8c0426f8815ed525bc3bb0c09edf06fbcc2ea84a75fab7d490724ac91b717749ea83294f37cd5f81bb94862cded290b5c9356444ab0622c4a7c748e6b14d12c648affc3f1fbe2461f8f22a80d06ff7f62a523cc21f522faa1bac7ab43e1b7c51b6575759857c334bb9236a547b31249fc85126d201f6d59cd8ca34364b002c01ede4c315e7c2d58e70bda6385eb6970f5b1d17b61684edb5c5c1d6ce876d1517b66d08dba361344ee893aeaa15c2241fae462e5c6b10aed715c7cb7645d0cb2a11b6d773625ba8b14de882ad671bd1f4b59508da1bc2689ab644d661462d17aedb11ae3786816b20d2b84e205c6fe2c4059b0d4dd3980ebd9506e605e3111ca79522806f0eb779b644d0df1a10aeb784db3ca3886b37c2f5564e5cf440a33382b3802684ed6de147355880e9558fde2e0b58ad885e54db8500be9d13e022d2efe003926ce0c6b9c09d41e0de512c708c7383512e702711b877160b1c6317c1b6ae7600817b57b1c0314eacd83a894e04eeb16281635c9a649bc61f46e0de5d2c708c932d36708710b8f77082a347738c11ae920b5b1c617b2f27367bd9c8bdb19531ba9572412b41d0de570c688c9ec606ad0e417b3f27b4cc67548c3ec6364bb80de1fa4071e2d9fe088ed8b6206c1f2c0eb63d111caf55216c1f2a0eb6363e6ccbb8b0d5236c1fe6c4668fd646e7361bdba758a35b1317b85308dc4738c1c12776cd8b48515f1cdf8c107eb4384db63b82f3840e84ed63c5c1c6382f658b741508dbc739b1417bb9aa6e800f6e44af273d8b407d8213140c73871d318c1117dbfcf31cc2f5496e5cce5901e32a075bd03f8e707daa38d12b8acb91cb10b64f73622b47d8e043f6b778e7036c7e760401fb4cd8c0189f4db101db87807d366c608ccfa4d880ed41c03e1736b0286e5ade8e807d3e6c6051ec2bd722605f081b18e30a2d1bb0c508d817c30616c5355a81807d891358a9b0977f005834e3571b82f5e530614531761d43b0be1226ac28c6ad0482f5d530614531662d45b0bec6090b1ef1983625477bf35e2dc2f73827beccf58a2836cd24c2f5754e5cf60312b8645238bf932a8a4fcbd72170df2816b828eecd8821704f140b1ce3f88c0ddc7e04ee9bc502c738566303b71781fb1627387a4db623820fe21a11b66f7362b3679b691559371bb0f5a5ad08d877c206c6e8616cc0ba10b0ef860d8cf193ea6cc0762260df0b1b581457fd972360df0f1b581457fd6b10b01f840d8cf13b37d8806d40c07e1836b0283eb95c8f80fd286c60519ca2cf47c07e1c36b028aea0cd43c07e1236b028aefc5723603f0d1b581457ff1720603f0b1b18e3ae7f36603b10b09f870d6c5f04816d42c09ee404e6fc4eaa246fc867fb9ea0d508d72f3871d14b3c8c5ec6b6b97323c2f6cbe260639c55b2ad8c2d42d87ec589ad5a63833d18d65797babf369fb1b15ee3c2771ae1fb35273ee8a66f88f4b7e9b3a162fb468d3e84ea37617403b64456cf62fbc6a08508d76fc3c03510695c2b10aedf71e2b2476537e7fe1b46341ffa6e45c07e1f36b0283eec2d47c0fe1036b0283eab3c8880fd310c60d6680cbe233d9a8b3d4b10b03f850d2c8acb89cd08d89fc30616c5c59e6e04ec2f61038be272e25104ecaf9cc02a3430fbffb2a5b8a318dbc7ed5721647fe344464fc4bbf8b0b17d6cb00761fb3b27b62ae1fe7a07e7ff9263f4b9fbb8e0f58a67cc7fb349c273fe7f600768707d4ebdc1f871ec868c2502eb1fc22cd10ca06d9c16a3aa9d8ca8f09212e97f0e93807a88c1e7e4fcfccbb3ec3281407669ff043363663f1f0facee82f86f34264b73db47fb4165965a49c05cf6196dffbfa0de75b52b37ad55df3e36286bde120ebbf7a784f59fc3e127fe3ff2cf137e02bc0000 serializedProgramBytesString: - serializedSignature: 5d4114a9c51efede3b6510cfb81af617e3b7c85df69030676a1842a43ddb44b5ee67400e4677083b048670a1537e8ac0de3589bca7feed446be0b0e304354c08 + serializedSignature: af07b70eb2ab8bcf6171f2632f09b572a79e363ac4b10a0f3491c42ac99b2eb4b7c17d3185259c4104a08538f3d0fc7dd79daa5b2c0e89f3509051c5cb4e2802 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset index 6b9aecd..11cb7c1 100644 --- a/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset +++ b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c4973134714ee91359225cb36f2826c4212b222626cc9982d2bc10ba00086f29603953202c9a0c4362e493624b75c73ce317f245539e6989f942af2de9b1ea9d5d33df2486a06115069dad33dfdfabdefaddda3229263f0cf3a0f972db6c696d81cdb6425f68cedc35f4bd0eec1c7b973fbefb32ab44fe05a84b1f3ec4c9b99f8efac3505d702dcd5581d661eb2c7d056687c9d95e1ef02cc2dc31df6eec0b70c4f595198b4c996d93db6ca32d6641b125b34a9c6fb2c94cb1a84eb22fb1946cbc4142e92a3a10c5cd661a446637bc0b4fbdc03f60389b507638f614e95ed02cd474471f02fb85a2493db503b01df187c27f9bdfb8df0fe93f0b55fbe7cf92fef1fe3ad0ddf84f0b74b0bdb013e37e3336780b751a90fefffe6f771de0e8abcf071154f0981568ab7493e774a7846ec9f16eeb11d929e017eacdfa575868567c6793b2af48df27644c27658ea3fe5c843f445794ef0362debc0b6c8b26e81ae8bec80e55049d6b9002ee0ce6c6ffca4ff083794b3b46c1dccec0008282c7093ecbbce16d805a5054e5b2981ef25ba16e1890a11c5c5a425fef42c81ccedc2a72cb84f0dfa6f92f7a1035560648edd8116673d64f3e0100f242a5bb0ec2eb860996dc0f580e83d04b6bd4fb613095d4d9eb306349d48b0073d2ea00770bf4b1caed3f588382d13f705e8ab535cda87c8b408ed0b5acd2b7b15fe56adb9c12153f3a80e08ba7e27ecb86a5a066990fb1cf9ea5b8d84a1110aa5ef70378ce6d047acdf3c9a788ba11364303914388d7982cc6ae9bbc07294ab7ef520185c46af84ae7d1f3718dfa43aa40c45c223f623f72277dd67e441c891eb8d6bd0ee1017d8ff9863e3bf968b941af768039fa6fde430df582b01528a792990c3488e8a81d36d14e767362859d69a655899edf3ccb342eaab109b6874581a6210dba1794e91a87bda85f12e5567876428b66db75adc02cbc77925937ddd60b5a3793401d96d2c85dbe46d5e86c9f6928ff1ba2742722649ce334a39ddbf1661da5320704429e3107856f10a4826242471010dcf1195ab13bfeb465dbd95b2f35c859ef30b5c6a771ca242ab155e2bc99cad4385182e12a15fd0d094669622f8bde5593bc674a630a08295aadc8d57082b8e3d232ae89cc181c5b27b46025603e0080138e511ae3d0b3a08a30a08f309be49f07225dbfc88dee66d9572681bb3675439ba78781df89883fd2e7af65da2f214fa9ef048e5174971a61845fdd589bba3590938b536d3a4cd799f88df3b9e75fa8fa9b484ae6e3d09454b5b3c9720960b81f39bbf66707f3c201714b4119ff1d141771c61ae112e9afc3b4e96608e0b9df6e3ba5c3aa1cba57856904c922401f2dfa06a1dec3c1928a9c82ba6f42b26542b22e18cca3d65c2693de1a42e604e751b30877494a7bba59cd2a9f9944ecdb8a5734aa6d3649a733ea6a92a053b284c0398d3b04eb9ef76a9dc111561d4cb7b8ad0914fb5b836f76f79b571fd6aa33ab5bcaf530bae918c05f5be13ba753ed0adf361475e9ed679f947a6bc7c4c67081f776908e33ac83ed141f66947aa9950ad4395b609839bd42928ab52d015adcf7b37a2736c1b3e5898d4a1c52d608d2b16933f8ea929b5a6b520aa3fa993e59c4a964de66ef9dc0d9cb8d574ce9cb078d9a1635f2c5e0a8d2757a0a4710aae35e2b60cbc1fd1d38ed4eb345a028a87547420dde61ce789663922ee75e4b12d985b014a4170c8e870f84c85c39256a75830ea0a4d47ceef61b40aba3dae3665e95a372941649cd2c938a39271b9a1eb75b6cc6ec3ba45e0a10cd2a1753e27ee7ee21a70242bc0f83d18714e85f5f2a9325defa49cd649795e25e562179aac713fc5be22c882dc96da48d20b5b3da593705625e1ed1e4858a2f13acd2b068e47c1648ec3c7b23078af10275598799f66e05d8de5a86cc9b3e31fb2e1da7ba01fd4c2464353ed8fceb05ad3bd1cdb61bd7a4fd28e0755549d13e2aa28ddf1cf8abdef84e25c229716204d75dc9b2629fea22016e55a8de4a87a9ce9d09ada7381761a1b50db50f0133c87c02a8f9fdadaafed3af21e435e679608b8c7ec3d782f8cc6751d002ad196a5069f7fa0276e47f288ffbc4990b098dca6e99877eb7d010e13c0b960129c0c818386da4cdc98082a405f2c4fb1bf4ae9ad1fe0fbc36ac2b760123e4c5f6bb468b94f2ceb2a5956dc9688dfe85990efec5d89371d8d5201f082364155a25792d3136dc85f37ce2f8ae925eb893e59c966b2da209eedc0399bb593bae6c963ed74e97f5ed6e4b1acb98c204cba5500458a2b2623459c7489dac410b00d7581b44237efbc132d71e3f471d8ef2476a484ac74d52458290e5685ed73d771de766f03b3c6604b9b82cd1660fbdc246ce8f7ea9d9a31d062a6401b1740fb221c5bbb620eb6a429d84e08b07d190e6c17fbd04513026c5f99846d94c38699f3391d6bb41ef01a4c0be3a6c08b09e07d1d8ecdcdf7a1ab5a026cdf984e0b089b7c1069d0d6464c81362080762d0cd00c5a9a31d0a20268df86019ac1aacd1868430268d74d8286e561b171eede7fb9734c006a319cf07fb90f0bdc5101b62593b00d73d8ca8d77a9ee9051c74c99022e2d00b71c16700673a731e02202702b610167307f1a036e5000ee4638116ea10f0bdcb800db4dd3f6d63c61953755fdb7a19a1080bb158ebd198c6fc6322a13602b8403dba53eacdf8605d8be33095b82c376d4f86d8ad17460cc3d4704c06ebf6ac0fa71d39e646fcc3bc73c1eb0de61c20bb4acb481cbfa1cc33bafe7d25c6e0c1af8c32b0c20257aaa28bcaacbd1cf80f13555901fa6f8d36cff1eed2e8a66a9ed79b767faeac5bb4195a4ddbc274cf96825473f907e93e55f65ceff41c19368dcce90196f82e61de2f86bcd2a9975959eb1ff03ad110f209a450000 serializedProgramBytesString: - serializedSignature: abd4b8bbe5636dbf17b8fc91e8efc4da80481a567db759f6a1f0f1656321a475d7446e5162da6fe77efd8bba60c076010612db12b75d4c3d669763817b9f5705 + serializedSignature: ad13165d8fb61d20359e5fb988a174a7a65b1d250087d51f5f574bd66f05ad9550fc598876d1934521b9cd7e3ee97342d44b5fa9c821cafaf9e839caf0bc520e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset index 44d7064..66fb11e 100644 --- a/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset +++ b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b6f1b45143ee378eda4a42d014a5a285010528368bd6e23f18894a46989a021c4715e2a9438f1a672b11bcb76a13cf2ca3fe2bf2185ef9c998937b3b3de38f5a66d6856decb5ccee53b9739332984843f7507b76ddaa415aa509d9a7448cff1b682670797feb2ed1bd4c3f329ee0df4dda15b1933f9efb6ba8efb1abefa34c0cc17b48f674bfa6b14e17d0d73237c71eb017e1146a92226d5e901fd4ceb34afae6590d896497dd3a6582f358dfb32fd89de48846226a174cde356434f5ffa3a10da8e7b42bf8a5a1df4ed634e8fdaa0b92714a79b3c57749247d13ca7f09b31ef85589b194a25f353e6c7efe5587fbc9d650e8e8e8efe0d9420f003646a50974221fccd18a6b233b38dc4a44b0523cc6d613b001c5d10f02055173b0c6891ee7b91baa1666372afc8bd81112d21cacc1c16ff2458b0706d5c51cccc7db43f122f6143b7d053a19ff0e459bb740f867be250d906db365c25a22ddcbb426f1762274766a9c42ee1ced9044dedb11db45840bbf86e8b8435b9ff2e924622fd1ada06123fcf1141cb78be146e49dd7b78f7f1dc3290f965f43b6e5abb0e0f6ba607d086a50fc56fdf59e4755884a12fcd98302c86925dfe4e58e21d863ac904b220681af7741a3dd1769f42fe54cf12088eaf635243ebdf36b1d610413f02e921b543890be6d317abf1b825506da0a5016a1be86d0afd81587498a62d2dabbb1f49768fbba2f1d0238293102c5228cbcecd0c08461980e92da84a6cddc943d52028565921d7acca6756593a77cfd1accb90ba2f3475fb062836c09be92d090757233b63b4094ba73161d5560b0beaeb8415ce2e591ae2051fe2bc52a8bfce05f1acaae691149e11aac23d7a6696a3a41fda656d13cf039182dbf78d8f8fe635da66d3c7f80c6d164af1b73a466d96bf162c52417ce7d27104d7d1aeabb055b1404b3855bcd23087b4f1168bc75253bf106b0781df73df13ee6f163669be3fe5f37d864ffd92abef8fbf1cfa7d73f6d4f9e4b258e55a42ab912b410a6a450f6a5546ed0a6f8b5c71787b33e388c4d2a4100f7cc4f9f3aa4f579770904eb8e4b3353babaa9da3adf5b8968c1bdfdeefcb76ed2406ea616aa0fb02ab423bb8b88af70519f7c5595bf7e0763f8f240dbf03ce89032637975980a43961d9e7276cce0f7c187d7f9c8e4e2e8aeb82c31fc2ef37238546e8a9f4ec607f73087998507ca9e5113e7a698b72c251e7d21d753a4db30f7d9ad51dcd16bd455a76895631b667ade3e3eaa2d7b8faba7eb40d695ae0e7c7a18c4b29567155e4ed61e686ccd0d2879ce754758c25857977e03dbc87dd826c7b12b8d90bc547947e307230b13d7296167a17c7f30fe420c5eebb7cda9dbebc499e07948d46961690e6cc7ce134e565af64cfde0a212f53eadb337a53b6141f33b729bf0f8d9fff34817593c91557793b263022399465836472710b3d97cb5d2160b3fd044e04d9b596004f53d6ad3e2efee34077883f9c98af9d6da14d46c555c9432f2583f6845ed38d121ef2c6493e1ff7f285144f19a65a7f8aac72aabdfe3fcf8255ce82371884924d1a554e1a9fe419d9b3622f6d31bd28ebddcd0ee07278bdcaf1cecc8948bf741a45ce12ed0589760ddba779c2c6d552d7a96572832bc80bae2006d7cdd7e365d5b710368ac1f6599eb05d71606b611a57c887b217c811ba725ed0a918749fe71da00c9da5982b5c97f3826b2a06d717e701d7d65b0d57912e4cb157e521b748ffb3de641caea1e68c2e9c3f1f5324b9b469b6cdc37a2ae4231bf51d8db7d9184d33bbd8f99262a5a06383f6c46c308902cea7e9ab1473b323ac12b2c92eb4fe5fb96e3a2fa57e1d96d7c4f92cb027b5524fc604ff0191c95a1c12240000 serializedProgramBytesString: - serializedSignature: 51f66d6dc5a7734ed589acfb1f535276d1b41c0d5ccdcdd67650fde9efb1c338a41ff5914afa1aab29f9e5a3c12c989e7eb20310410cd2dd4362b7b648a63c0c + serializedSignature: a64e2f04b4b71b8587b794509a9ff3cd4de66e307ef0c59a402c68b5547f97d93daea87c03dc0a7dceb8a381100f48bc091e866f37797d9e10edf216035f7805 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset b/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset index 6ad1d25..22795aa 100644 --- a/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset +++ b/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b53d35010ded336bd080878a13af2a04fe2882480c3bb80171c0586525e18a794923a75da52dae2e04fd01fe48c2ffe2f9ff4db4d42d3246d281064aac970ee67cf7edfee396753623ae151b34876688b56688ef274408754476905790daf5573da37a989fc23d222fa66e961c84c7e1eab7b48d7506b511b338fa984bc22fd3932515ec35c13356e2de3cfc42895c0a43cadd206ad5356dd0d11b123935a769b625c2a8d7499bea0d714a578115dbab24872e869495f0d4a3be376e983c0aaa1af84394daa42e6be484c4ff35cc12459dcce63f8cb703f9735259abf81ac223548e74ef564008a9d99e1e4b2e864ccd2072cf3b26dc068404000c2bcf0d7a6455a0844785f8dbaf45e91b4881115119af02ff1c3b7042b57c56bbaccd342fb6bb12e1ba8829e397a879c67edd13c08dff548d9c1b25598d8a46da40d91b707b5fd23c320b129bd73b620d3f2b41a5a1c421ba85745c39ca49f455353b45f435b5bfcbe0ecf5f467e22abf9b137510e5a73dba62c58c76087ebd56eb9b563a655a061ed75f1c5ff16f91b1661ea93097b1b26742ea96f3e4bfce7d03a643439c82d19f3d651dad5b6403a57d5968fc1c131fa1106fbb7c5f7123def8b25981936f70341d0b1b071f4fd6bfed7cf23ad1bda22e94986361d02ad1fb12c6f464df924f487a069098315f5d2af82e84f7163ee0ae9b7c65564dce00648cacdd46d003581ea36aafba25c1b534bf6f07de445940ec8671d8345a58460fff519a6642f8a634114a7af9ae2f033a51fc5e9535c1d8af9096630d383c1301d7a31180f60d060956e04a8f51b8f96f1a8c51a6929bc4a8da0f852d46842b94d2c5f915a8b741ea58c01223586571387aaba9c2d3c6e1be913b7952fed0a0f43611983e79725ce73ae852074e1987a872b291b91230b4cb3e1860e2947cf49fbeb80623a1b593d3da737856b31c6abc5cf1afb871d5e968075f9a88300dec50599ce27653b5cfe06647cb2ed1624ff990870eeb54bf85461a77a01620ee47c6ae1e587b7b847f8ab8842e2b3de59fefd302e27d009d43b14724d80f0ec0f76a56ba7f94db77fcff87ca473bc061f8b061fafe3fff8c967f0c937e1fe5e88194cd96494bb794c2c55909d52c690c2a9ec0a007956bb486c9ae9dae5da59a09c7fa75bc4dd8a92b8299bb892ed796d94dd02ddca17c8888eca4c5454c65d54de8e92ca47369556b055172f6c4a647e8cbc4e6feddf31868de0988be03b51123cde7393d7ed219191978a8a3c353c57bac1573aff869db4ed6fdf979336963a24be97fd50c4dca2e49dbb53e7235c2dd160c1647f99e117db94fbc2f7d8a07aad2eeb20a417b9b847fb5845e73868a8f167bd6e9a95b02e0fcb5bc24dc4fb4df96f4a53c6687f006a750bce491a0000 serializedProgramBytesString: - serializedSignature: 0ab5f710ca7bca040121430055e204341baa86b4aaab3e52b8f946445b523ff93c74514bb934f475b4c1aca3939f6d82f606aafa4e64e9c296a06fb22b474808 + serializedSignature: 623d1cc95bbeb3a8a1475b52a929f669eea33fbb7beb74f871d028b7de07982703d969e8f822db20c3392c25a70716334eee15b04211a5d978f97262bdf06a00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset index 7c3f049..dbd91ca 100644 --- a/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset +++ b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c5973134710ee95b592251fb27c201b42422e10012419732440487c61140238be5ea894b12d1904b67149b603794a5ef2907f94aa3ce667a58a74f7ce4aa3dd191d96c64204a9b4b33b474ff7d73d3d3d336b07d2801feb325ed66009662105ab908357b08777b398eee2d77972f317a188e933bc6e60d9653857a7257d2e58e378cde253090eb0e5216c615ae0f265c8e37d16dbe6f18972b7f197c75a56101badc21c3c864790b0c6ea9058e346259167915c562f5e67e00d96e69929ea24cd4509bc2c634989cb769169b7de13f899c5dac5b22d6c53841da4b9c9147bffc1abc532713204e5478848f796f885f03722ee0322ed116950948fe2cf7efbf6edbf227f58a4b644d31675c73c75e3220d4b75c352dff43b253d07058b32efbd52db88a89790cae4fc718717a621f3e1d28a4ab4a222ed937050c93928b51914e9806833213d53da2ff24f4bcf24d3df1e9a3189664cc64ed4653e6c8b2dec3eea7c03f621cd0aba088d0f05b765fd4140a44301611c17b8db0334b77d24a0b0c455b6f3039882ab4a4b9cb0fa25be67f9ba81350a4c943af374f197af0b626e07bf79691895307f8147210da40296a4e0474ca9d55398c481f1c443650dbbddc1a1988715bcee33bda7c8b6bf663d9168c879db2c214dc723ec628e0be83e3eef3087cb7c3d624ef3cc7d16f30ed83feda1879ac1f435f7e697bd88f7aa3e5704646a1ed58e4197efb81f574d73280d719fe6f1ff41239dd008411f3a238661304d63c4fad3a7890f183a4e86269daca031e94c6b557957214d8fd68e0fc1e665f44be8daf72ae6398e6d9e4b0b3c1aa88f023fe590579ad8dfb014bada8bf09c39a41e4bf0905b1c3237aefc6a34c944aeb0d415abb0ab619882344d2fd6477560a8a504a297b43200c6c5b5ed608684f2aad752a997438915a3eaf5c660afd80d92cbdcab69ae6a7591222e79d465f9f49509893029c97169b32ce8200ca820e408ea77a310361aae2c70c49ec7707a135e8879c6edf7151b0e71e4ce574b986e331794bf250cb7765fb595d35bc6a7a29c344769f34d045de6a52096026c2351b691734aeedcbb19a4f91cfb3ae239fb107b52f560db6a2bece31ede2df975f6dda3b26f8ef27feda87d3b7330d1dbe630d8a1f7086851f80bdbde4b748f47029915ac53c43ea8b4558ba630fcacc7a2dd8f5adf03acefbb0de8dba4543a0d07551a2613b5964f701270ea15b85ef353c020afb03c5300397b1a0a9bf8480ce634ea89b17afc2bb27a2ce900b5558092d558a5130a9a52308d7d93e1382eea19a6eef2c2cd7dc8f49e23bd43c9dcaae38b5a746a2b64a891108ad18f33fa37aba2a093e05fa7bd90427b1932a56145980176c42313d5d4500eabec823739364fc4952ee372f401b298524c1d255e0251bd45a6f992174115a7e2b6adadf59186b53eca5a3f2fb9c47670a7d369af4aa7f438a662d8ab525bafd2884aa5bc9ff5a223eba39fb08f0d3183ec0943afb5647015d7f8da8836167bbcf11c79502b556321d30ebe2822f35e34015682adcb34433a6b8beaac6dbc456bebd3b9a689565d53bf8ef2e956290fa828d3783c03fe854186c6132da99d48fc6c5d35aae2e2e6d5e893a74f2fcfa04a1e82efe346941bd7138ee9087fd222e1219d399e6bd11ce32ac2a4ef4f1b213caa273cac83e2b316a118511126657f0e8af8715a6b78fe7d9914ace3b7c4a1f83a6fd63e10757745ccb1c53564a75abde9e02d5dc332eac1275f4c2fdfa84ebe2f54f2fd01eeeceb2e18e4e5826a29922dd7ac2c429678d8e591d723ae9d129250690e291eb2444457b78ca1facdf1d1c882a81a4d39966f07d2633aa4bf54217dabca9228265545a4b5e25a07d599f24aa6ba6e3b243aa593e8bc4aa21b65db71632f55d4e68fd91c395c0d65b10e6d5a9044b5474733922474925c5049725b3bca55314235ff05e9009b5a5359e3b49a91695c27535225d3bd637b2e0a370f249b6c4ea276d8e1844ed28b2a4917da34b25c8d3e5304147a0c54e14733b29ed6c9fa954ad639cf989bc122d25bb537747c9c23158dafc758e21c253627c771c66318bf964502ccf3a82862fb45b601c71fa43916c940fd8d30379f38d8655bdd61efbec91cd4dfecba04fab3f76d68d731ecf1b6f3b24ae91adf96f41f398785442e2d449a83b3f74d527a6529640bad06d21c275e3aa635d5e7e20af5d6a3b6a1e6770b1d028fc448536c4ed6edc1bbc8f1f6708509b8278e6d78e184789c46ce72bc662ae1f78e0510b60319423e65121ef221eb58e4cc30ab483527eebb01a6dfa00253da244c1186c97943af1264750344bd9225654c421462884a1cd514f1da0de0ac48f63369da0b39f633c7a15f77d80e303c61db43fc5edb66bbe31d4df9e7e5184742af795554647a39ef3ccd5b12ef1ae757e57936a9b092a46f58256bb8eca4c64f2515b360258454877e190a21a7fee7d15d86a2bb6b04c2881b0cb1afb86ede579016c901aca3d7f6f4d0cabb50912aaf71b611f68fe3390624c77ac32458fd02ac02ec8941e2bc88b18ecc1a832d6e0a365b82ed666760bbd985b0c524d8beee0c6cd7ccc1669b82ad5782ed9bcec036690eb6a829d802126cb74cc2d62760f39e5f189c10c2a6400b49a0ddee0468062dcd1868fd1268773a33406f74e1743028c1f6ad49d806046cf9f2c1985b647490c64c01179480bbdb197b9b3207dba829d8c2126cdf75063683d6662cfc0009b6ef4dc2465d97aacea2bacfa70d4b604d77c6c6ae77a18d4525d8664cc246f1cdbe7e6bb80bbc585c826ad6245451616107552f9118f46003a620eb91209b3309196deb51f5ea370aba6f380e4980cd9b068c6ceca87caa6f7405903005584402ecde4903d68deb4c4b026ce1a40133b8e5680cb03e786fce7832b4497f5f567a52e33993bef93aa988129d2392b84082c2a0873c596d8803970de9b824cdaf8456ded66bec1d89da34eb9f656449584b6de1fe3f1cefe4f98c4ad256ce6afa6b6825cd2f8dbecff2ff00ce7f5de10f996982f7bde4b3c0c75839c74cd1c7fe0fa88850bc8c480000 serializedProgramBytesString: - serializedSignature: 630489f03f784d8207c0e20f1422afb7e31f73253e53261028553a4ef9a850a1ff979e9919d891c9d2e435c3915a41b7997767c1097cbcfcc5a86d0fc2c00907 + serializedSignature: 048bc405cf3e6bef0286760c3fd7bbab0c34585ac22c445e9a846a854ce6f53602718861440cd2cc2b8f56f9a4b14dd69f470b76cc89dd08cbfb24603073db04 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset b/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset index ccf89c6..18fdf97 100644 --- a/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset +++ b/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a6d53db46105e19646330d8bc240e4d4a48d3364aa1c8409abe270d90b6e90492e1ed4ba6439cd8801bdb303664927ee8f473ff517f4eff41ff41bbbb92ecb37427d9e0839ac61e4bb6ee6e6ff7d9e7f6eef61cb3015fc62c5eb6611d96610eb6a0000750c56fcb78afe0dbf9e53d7f0a35bcefe1358f65b3301dd1925eb78c2b787d84bfea70842d8fe125de4b5cbe0145fcfe08db16f1173dddc54f116b19fdd8680b56e009ac41d6b81421629b1bd5dd6706d9650ce07509de62699195a24e6c2ecae265034bea5c5641a5bd7acfe06736ab82652fb14d0dca28f3054b1c60b8f0631aacdd8f583f0f8760c7e8f9ed0e60f45a460348a2e331001749eaf608553d4401122bb618a323588405a91593464ad07b99af79ac5162a113c12efe0c7441ca95f15d145c50c7e73fb007c909252c9983c778a756cf611e417de693b28ddd96d18d45d8c4eb21cb7b8e6a076b469944eef2b75947990e9b2af8c403f4107f9759c30dbebe664d8bacfd237c76c4dcae22bb97f0fe867b0bda5ec3efb23e375dc8e43aca49a57aee50d773d30a5a43dadb7d44b3771e390f8f10f4f1097718f6db34468c3f029e7887a113644c0ed68e8c7986cc6879b60036fd34d60308766e63d04239bf1dbcefc29d505be4c890bbafb2054d0fdffeedef9a51fe2b6eb69ab608769c4cbb16615a18b024cf322e0724849b609afd3952d40fbf21833f410f37ce107ea75e89eb75ee8038cf4cad0e303e6c4cb814d9f6609f9701075c5c71d593973cc07b8123e56356e91504bc98a32e13ec88e0341b658cca1531992b06ceda15d1b127cc15030dbb9aae00674d244130a940304a0715827d320493e7134b4e86df20ea996d1bbfa1d050d0297afd12f472845e4aa554d2a714e9a3106eca5c43d61a9b67e81a2a3b602979acdbb97b8651d7197fa491fb66847d7345b295885241e59fb80cc2a1b30fd54e642b47ccfb7200d3a8e9f500957ebf27c730a38cb0e13aa8104cc8184e241c95f83548ef1135bd076492c93763528325c2336ae14995f0f12e081f54099f90bbea7e27c28754c22f7541784a15af2e4be2d53ff8ea245e0daba8929586800ea832221bc66c4b51eb30dec267ce4efe21979678fbe76d1069f0d0500aab450378953325c7dc7ff850a7d0d7e703ca66582917d27d6da6893fbe8b298f2b931c57f4a8a18a3d6915a1de3b6decc9a806d9557978f8ae9341362a632b53f8d5b9b195641ef06feacdcbc9758fb9d71a360bcc65ffd9119439bd66ef630f71705f09057fa798bffa955171794cc63822c575097239426eda67969f81536a068ecb18c89cffe55c18b8ce801658127dbacfbf1b32fef1409c0b717937f4faa01df6dd64f6e956c53413f8360c0a640fd9a9356cf7146b94f8571d6ca6610eda4fac13dc155c1f526cdf44685f345690e1122897a04ab3ef064878d28c6b9415ceae8edaef725adecbe2c9ac8bb6499d5d4eb81679b210691e8317cdd28f5ac9eef3ebf75db3f664a9aea05fd23c12de7054afb1bc82df4fb466ffcf69fe712bcedea0960fc61c0dea5bfff3f196a3f1668170a810b369c764cc9c30d845ab478be1789f1cf2ce539c8e80353e064601b4cc5de5ea34315396f5012a51f0f7739aac789245793532ed18117d1c4a9e7134adb1f7ebbccf4f98b11c79e3139d90a519b23c0e770fb2559e18090b3a3a7adb83e00d09e0cde8066f8d8b2bbc802ac1af5014f674757de08de8026f58006f56277859b6268fc57b40ff9d682eb9540729dac09cd205e69800e6a73ac11cf3817971201c15209cd30921ed409a43571b5093ba801a1180b2750245116207dfd4f12e56d969c82ee99c6b4d5dc081005c4e2770191640eba0036cb8ef36a44da7b72ad5089fb609c314e09bd7095f520a5fef2d4fe202600bba23da0a7e29e3038debb8215d40f50b402dea04ea861bd19ce54795635a8de7d163bc57e127f7bf6f3b2ddd8826ed60e4d006705217c03101e03b3a014eb1000274091fd55b16c9bd17f1d2026c9fe984cdd9cf8a9bb35eddcf2605c8eeea846c1c5a17c2abacc07e2055ac71297c531788e302889feb04310daa155ed5ada20dbc842ef00c01bc2f748247d33ba9f79a7976d483f12d2140f5a54ea892dcb5f72fc825fea792c6e8a66da1d22700f6954ec0c6dc09c149179738e9546f2490291ded1c7bf5de04911120fc5a37e79a8b0fe72450633cd3c6b99400d837ba2783d6a47aef678807c13921ba006771393abaf9960830ea12c052c455cbb721b4da4a48588a7db71598e82ce5f98ba55cc95a6dd0cb6ae390c2528c6bab8d1cbde54bfd59a1db15abed206cb59d95b54e900cb73a58ea3a87a1a32ebbabc8b1556e91c75a79be370f466dfa57a3416bf44e0e00c365461f0bde23021bf20856eedaa8ecc649acccd2d39ccaa642bc62132d2eb4fdf7c177669fe533fb2df47cc11d624fb0b243667a99ff02a951ad2f2f3c0000 serializedProgramBytesString: - serializedSignature: defeaa34acb6c3e6f914e08dc742c1c82bb8fce28fd3a8ab0381959737e471aad1e0b20ac03ed850fe8f20f0430b9b4646b741d386ccf5addec19dbd72c5080f + serializedSignature: d2db79d9b47aaae201aa8fa975277fb0e2d1b2bb8cb87ccffd358b2f3d140ddc14b95045a40e617271893c2d596e4b023261a700b79d53700423291d3b21b60d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset b/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset index 9b6be46..44020b1 100644 --- a/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset +++ b/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c1547d7f0e7e2dae24e811609451292e0ee0482074a154902a410a0095068a97b4bdd9dbaeb5377777beaee2e4fddeddb999dc93d3b9973b39bdd73339bf7831fec5d3b7bce7fceb8d5c964ce9f447fe7bf856c1e9bc806b205ac88ad656b9c5f139d63a9f3d73d53d7e7b032e7b8c2f97fa973af3feb5ec59bfc4f9f4407e7ff3ce7ac9cad77dedcc00a9d6389b83f9f153bbff39c778b9d337e75b9f3afd8792a51cf7969019bc466b359ac7da26d1522168a97cae5b504b72bd1c8f97f02dbecdc2d164af18f648a5bed9dffe63b77cac5bd524769f5dcee6c4f6156a973afd079a78cad76642e13121bcd59c4c40fe61efac9637f79dcd9f9d758feae2b7f3792bfe1f3fc3ab76e8f14cf0e00cf2a99039d7ff59d7fbfc9f34cf7bceedbf23ccb3d4fb4d16434013206c963b63ce6c863aef3af016375eafbd03fd5bdc1ae0ef32f95e7dda4dc06f2bcbb76de591edf023abee5f2491c2dcfbbc8e310709fcb68e87dbe4e0b793e547baf977cbe913c7f479e3706f7d5757e7c57de6f22cf87c9e370701f326b2acfbbcae3dbc096b7a56e05f27c07cd96b7355bd4f32a4c876aeff5a9c2963e55d832421e4756614b75c37f941bfe75948f2a1f6ccafcc50da5e7e82a9e4f2543d93026848c666e38f0685a651c6d06be33d6b59fa9f0d9591edf03cfbc278ff524f366daf5faf27a73ed7a03e47a43e47a23edfa38797c1fe8f2bef6ce07f29dedc0b9a367fdbf34191fcae7b6073a4379ea7e0bedbd8fe4f596c026f8de47c87b1f6bef35d4defb1879ef13edbd46da7b9f68efa9eb39e09cdf6fe5da58ef11797dbc7bde2083858b2f13e5f133f99dd6e09c1f3f95d7db8073273c1a6c95dfbf475e9f248f9f6b723eaf428eb2d7a4e314e6cd5f26686cbf605e5ff9c295d930c37dafe11296f4737efc523edf5693f7a526af9d575ea32df27c9a7b4cd491cfb597d7a77af5aab8df42bb9f03be0befcb30486c27af7700e7fcd818f95e7fedbefebd3c1036f0fe74ef7389ede5fd8eda79a71461a3c7e9afe43b9dc1b9c3aef11d55b09b51053b753f2a764a1ec64eddc7d8e57b9fab163b656b0b964c07958f2a9ffc9f94d3053cabaef3e35fccebfb7fb9329a2e61def450c9fb5a3edf159c03b98996defb09995e255a011d15ebd6c96be2bebac68f75a59c1dc039d74bc5fb069a5edf697a7da7e9a5fca11b3807e94dc5f7ba6bdf53652603ff0a9639e01ca4b18d9f91f7670663e9d4142ab1722a2cc96bf3e4712eb8a6647f03ae411f68ec3e3348c61fa72ee21ebf05cf7fa3f9c6b7ccebb3f383b1f7d8a1d27568872a4b423b94ecef0d76fc90c28e1fc1f3df83e7d53d68c702796ca8c9ff49b3e327831d0b7ddaa164ff6cb0e3971476fc0a9eff193cafee413b7691c7469afcdf343b5419b63a7628d9bf1becf823851d7f82e77f07cfab7bd08ec9cc9b16b506e74e1cdcee7dedb9bf9937fffd9b79e261859c765e39db5f8984fb3f1a2ffdfebfdafd7fdd23ff09f510e7303d90fe5ca787a6ff38664c93841eea3d787f47effb1569154c2b1dfb5a34d29eaba7e9a7f286fe9a9c769a9c17cc7e9550e5f9aec8fd06defb091997130d353d145fc54995ef754eeabeca5bbb013dd47bf0bee2a4e5818926cc9b0736d1e43765c974dbf4bebabf93bcbe0879ae99f69d66da779a6b762affda9525f341551eda8d55c4ad96aaac5eddb2b96c9f116d4fd06f5478b4619e32b538776c6b25cbbfad94bd7bcafbed3439edaa90b325858e7b316fd97c77e68d23ed99a77c22ceb9cc47a46eaa3e27c34234d1c1b46177701dca6be795d746deaf285f0e64def2de624d2f75bf85763f077c17de576190c9bce5cb4c79cc42bed75fbbaf7f4f952ff7d4ee2ff13e9718c4bce54b751ea06c9ee8c83c657371eeb06babf20d8cddd22ad8a9fb51b153f23076ea3ec66e99f7b96ab12bf4fa1f2b66c9fc50b5972e07d764dc622b5845bccf55e5c122f9dd4ec9e713eadb2be57967a9534f70cec346e5fd261d4be451951d555ce9c2bce9b86a7f5c65f8fe6a60832a9796826b2aadee0aaea9efec90b4355bb591ee2def7503dfea0a9e57f76078ad91c7069afcee9a1ddd7ddaa1fc19daa1f2b21e063b764c61c74ee05b3dc0f3ea1eb463ad3c36d4e4f7d4ece819c20e293bd1cb6047ef1476f401dfea059e57f7a01debe4b191263f43b343b53955c70e95f7f735d8a1fa2f4c76f403dfea0b9e57f7a01df534b9fd99377f57fd252a7f1fc0bcf9bbfebebaafca11fb78efb3320387f2a42d1d557db2bae500a5cf06f98d6ca94f2f70ee3cd3a97f0a59ebe5719c7c278779f3e71c29a3c8d5b9d379de6f2754fb7c5baf3c711dca6be795d7f924f9bcca6386336f9abf115c877287c9e77a6be78aafd27bb0bcde079cf3ef6ef13ec736c9e3bef2f90cedfe66ed3bfafdfde4f5be2918ebf9aed2ada7a69bca1ff6d7c2664bd267ba9e258f5b34d9ca678768b287b8b2bba8fadc019aec0393b27b774764ab7c77a8267ba894adfad40ed2641f9c94dde36d4d3616ee8778bf8d86ffcedab91efe23b4f01fe1eadab526c25fc5572dac98aa3fe8f514a9636224f3a44f15fe338a25d39551e0597e1ccdbcf177b42bb7c73629a3bef68db1cc9b868fd5e48ed3ee2b1d401f96f8cd8fe335e6e3dd6fefb0cdfdee0eaaeca2c27ea216f68782eb50c729cc1be7d57927e95b2a0c95cd13343d264806dde5738779795684438b2af453efe568f75b68f7557abbc57b5f31ad785fb521b7d2decfd3eeebf20fd7fc43c957e1309979cbd5aafd4071d3ed3942bbafbea7ca5f2a1ca66abea0fa0994af4c63def60f25ff48edbe927f94f7b9441ef394cb03c7d13ce4be1e4775bba66b764dd7ec9ae1b5ab82f30cafdc4ae13b0a842f4ffb54fa8ea5033de4791469c8c152877c664e4366b264fc9d099ee5c759cc9b86cc72e5f6fa58caa8af7d638ec66f8e2677ae767fae3c82f64bf19b1fe7316fdc9de77e7bc78fddefeea418ab385aa0f9f4a1e03ad47117e64d43d4b94c437aa9fe4a65f37c4d8ff99281acbb31550e1da785839e86e8faa9f772b4fb2db4fb2a0d39d87b5f31ad787f8116feeafd3cedbe2e5fa521f99a7c150e0b99370d59a871d3ed3942bbafa7212a1c1669beb048f3955d99370d51f28fd4eeeb69887c2eb11b0b9786ec86dcc7d21065976ae3e80acea15d7b78edaae0bc87576ea5f09d09c2d7f1d31db380bf51a721074a1d547b8a9e86ecc592f1772ff02c3f2e66de3464b12b7767c5b5bef68da51abfa59adc65da7dd9a69358027458228f85cc1b770bdd6ff791ed9f7d649855c4d162664e438a351d57326f1aa2ce651ac28ba49e34a448d3a3c8d5a3afeab738c6cb134d4374fdd47b39dafd16da7d95861ce8bdaf9856bcbf5c0b7ff57e9e765f97afd210adbdad221c56306f1ab242e3a6db7384765f4f4354389468be50a2f9cadecc9b8628f9476af7f534443e9758c5c2a521ab90fb581aa2ec5aadd9b55ab3abd46b5705e752afdc4ae1bb17085f5ecf53f5b3306988def6b08679db1ed6b8cfec7c650a59c7328fff27d6326f9ab156ca78dfd5bb5f07efb713eb98b7ede158701dca6be795d76f2bf3c6af7d347fdc08ae43b965cc1bffd5b99f36772cad55b6ab7621c8567d773df3a4bfe259759d1f3768dc36b83206a9feaafa9a3ce5bf5dc13994bb49bb2ffd3eb111e8d85093b99ff6ce7e9acccd5edfadf09b7d9232139bc1357edc5fbed30f9c3b760d68e47d5ef57da3cf0f03fac3f78e63de78da40b3698b66d316cda632af4d4a3e93fe953840f3cfe3e551a5732a5d6e05ced57bfc7890e6bf07b9f60c2cf03e57d13e73b07c1e9ef3e321f27a734dbf43343d0778af8be71a7bdf5136085b611aaa6ccb01e7d0cff5f737877c7f4bc8f7cb42be5f1eecfd8aeff5ade2f91e557caf6b35df2f0bf9fe9690ef6f0ef9fe46effb2a0e56e4718a8fcce3fa3d20ef87c9e3c649d987b1643c50e5f6c3a59cd6e0dc899bd9f5b4e70e639e3420a1b7211da1f9d95c709d1f0f95f7076a720fd5e40f70edceeee99553f11d4d8e7a9fcdd1e4646af76701db838e555fad713c9279f3a92325b307a4eeaa7d7095bc7f94979d9297384a93d7ce2b2f27cb2b47f415a5b2417def182d4c8f71e5e51ead3d779c572f710e591fabf95829b8ce8f476b61aaf41c07ee8373a6ca8559e01ccadbaa71dd2af53e580b07a59f9e361dabc93d41d37f15780feaa73f2fe7f9e4aa325fa9c12ee883b02fafba3ea6facb4f0432d4f74e6295cb54b24e97389979cb542781ebfc788ac6f41457c6901ba59cfa9abcd398377d3a4d937bba76ff74793c03e8b85c5e3b33794ddc57d7f8f15429670770cef55263101a687a9da57df72c4dafb399b70c73b67c7f85f6bdeedaf78ed6e428fef5938cd4bd0abf3b8979d2e8c16dc0bbfcb9a2107e70820c9314e37b2b9e55f3634e0cf13de9274cd9784ad2fea197fa78ff544ddf53248b7398370d3ac7e53d54b67f0e4d35fe43c5e77381ff9cebbe3f2c5ffbce79f23b83c0b97a9e5f6fa3bdbf2ec57755bd6c9c7ce77c29a32738e7325e97cf9de6d5859d9e643771758aef9ca1bd07e24945989e959435feaf14b254389c238fcaefcf4dbe3f3c952eeafdf3b4703c57da7c81168e17b80c865f2b653fe0231c2f04e178a1fbfe8836da77b669e1b80d3c0fc351bd9f2a7ee8e17891168e174919f21bec7caf2eec8224bb29a9be73a1f6de3643385e949435e9091fe1d0cad56d6433f79d9172fc01bb441e2f66a9e37a7b9fcfa5d2e172cd172e93dc2e961cb3c1393f5e22afabb26937709d9f5f2aefe756539fab357d64be9c50725b837387dda869eef3a3545c577a5c51051325f73229773038e7c7cbe5f521e09cbf77953cbf42de1faabda7ae0fd3ae5f09f45165bfab98b7ac384e5ebf3af9acf8ad9ee5c76b98378fbfc6e530e64a4db67aef5ae6cd4baf95c7ebe4f5e1e0dc91335a8ed518bdcd3d8e39587b4fd973bd7c7f043887f76f90f74782737ebc515e57fd9437c9f3d11adf9be4f1668df38de03a3ffe47de1f03ceeb25f5ae889b55f883e25591ef5fcd3cf9fe6895cef8f5af543e2e59b16b812f2a59d7010e322d19d5087c931faf09f1ed1b99377ea9b62d155e63ab29f7664d6e7779bc29a4dc5b107d55b88faba6dc5b6538dfc2bce90a3f77fc679c9aeba7c23d477bbea7f7f9f16a7cbaca076f65debcec5629f737d79ef12d343dd4f383bccf57c8bdcdfbbca71ca17cd2548ed851ca1def83c9edf2dbb7694c6e93baa8391977789f37e6a141be7b27b049c50b659beacfb82ef98d316a4c824cfb26e4bbd727f6f7ca49dccebc7998b2ef0e66cec3a45d893b99270f13e7fc3bcafebb347d4df69fe5be3351f9cfddda3bf7001b551a756f52ce54d5df61e2769f26cb6f59b41f789edb7597c647da95b85be3d31d5ce7c77be4fd09da7bf7225cef95c7fb34aef7b98c26c9f2cfa46b3579f76bf294de0fc8eb13b5efdcafdd9fe4bdcf7662deb4483e5fd166712c0813f92dd1de2ed9eeacc651a462fb803c6e63d5f2e5c9bf79df4f3ca885d183f2f810c2fa21797c5863fdb094bfc9fdee643526f6414d5f932f5d24df5563691ed2de81beacd222bfbefcb026cb6f79bc1f789edbf788c649ce574a3ccaccbefca83c3ec6bcbeacde7b1ce1fbb83c3ea1f17dc26534759126e74944ce93f2f894f7fba8afaaf9574a0ef455c920b0afcaf14389a735764fcbe33308bbe7c0b7ef95762bdf50f9e4b320fc954fafd4eea9dffcf8bcf75be21b4a07785fcdcbebe17e779a2cff4f93fdfa1569690fa0a30c6bf6983caabecf20ebb45c6290ab78bca08595bafe5f797d0af3a433899781fd2f0319fcf812f396ef5f72edcc6f0364c2f75e91c757e57b53c1b9f3de8cafb5e75e93cfa9b1d5aaffec75a0d36bf2f80612fe6fc8e39bf2a8d610ca03e7fcdb976acfbdebfd7642ad97a3b8bc27ef77d6f4785f5e9f0ecef951add7d31a9c83efb2c7bdcf074a8bf97b1f0026724d97c487e0da87eef7a6bf0e9e479e99a1da409ed074d2d3dbfa809bfae647cc5b96fc48ca2cd0be8b3da7dafb9ed4beada7b5e0dbcadf3d7ef1bae6532a7cd4ba4bba9fbcad85934a63a5ef56a4152f334f5d6bda6f9a9c1799277e8973e8372ace7406e73cce9ce5f5714fdc7d4a1ec3a4094fbbface54fd7e3b697a7da2e9f589abd7cc5ceff3894fe5736abd8e2ee03a3f7e2cef3792df9ba63df731b04bcdcf190eee05b54bf5c7a9f10e6a3d9d5ee09cdbf188d4e72fef7b89cfe5f3aafd36035c87f2da79e5cd527e390ebca7ec52f9a65a9b652c3887ccd5ba383dc13997adf2870d4057e9fbb3cef37e43dc83e9b6ce43ad99d10b9c43fd4d6c950cc5e20b4ddfa9cca3efec2bb5e7be61deb453ae9391506bab4c07e750c7d65e1d955cf6acf7794f7ba6caeb2e4a32aa68cf54e34e72c0b98abb55f9d573aeac39aaad4ecd41546b7728ffdf015ce747b506886a07795e1e4782fb417dbcb716a6df6b61fabdcb6bce9552e7f7bdef257e60deb6bbbee03a94d7ce2b6f9e1ae33d0ebca7d257b566c678700e7d5bad0dd2139c3b32e72ef1da227494e136af0533dbabd6f1e805ceb92cd9fe37f705ef7b899fbdf6267ef6ea58216fa626ef37ef73421e7f6e96a697ba3e3b98be153c4d61ad64a8b0516bb0cc01e7906b6b70eec89e5f4f7b4e31c806e7fcf80b3397f17fd174cf05e7f0bb6db4efaa74f305eff77db7f9487b2be2685fe63f8ea6ba27cb9e4ce5bf6a0d06356ea385abff42d5afabd65dfa43e3fb87fb5c811a1ba0c218aed7d21a5c8332fa81737e046bc288df5cee7aaf8c8ab176bf6b32e4f30b541bcd4b9ade7f017d5499659c3caa752c76d4ae4f00faa8f09858d92eb116912e7b72322c1ba8b60ba58b5a1fa63538e7ba2b5b15c37f81dc36e01a94d10f9cf3e3df40e7bfa5dc3bbc322a18feadc9f85b0bf357bc7af3e5632af479b50a86705db4c6e07d9da1d2699241b68961557d70fc3b09f0cd84b44995a56439b78e5a0b67103857cf83785cf1fe7729be2ffbfe76d1d7976d0f6c527dcf8a17acf34b9d02d7f995bd7593b2c46fae8b9a4f24eb7775ea69f6d603cf437bd5fbef576def2235a645a55fd0de37353f80f6bee1d7defa09b1c6d03456cc96b2752c5304124f01fd2ecbacdeac7a4166e10fc243195f99997f763ddbecbc5a6c5a157981587379bd635db67155e48e62ad1ef5f589e2ffa5ce132542e8bc3a953e7167a54f70e5563b7f8bc192cee5cef5a9624568bea87389736720cb778efcad256c10dbddf9eb95b2d0f9ec6a2741296605ceffeb84bc258eda959facca24befcb3fece3c47a6bb3a75a97345015de79caf161ace17ff6f149a160bedf39c6bebc55ad96bd80a277158cb3689af55b6bdccf96dfa66814466d6d1bc483576dd5d0a5b05d324c71aae7da6f0f3ff1f2235112222399a27e361bd4c91c21c5b2924fe3f433791e19da97952c620812ce1b996cd32c538c179950806b7b1b28566ff76790f712a70a96c3193e1c1dd5958900ce1e2efb3b67c78d43f1deb7b4dcb61990db8695daa302d15582e2f43ac3616c484faf5eb65714575fc09137e314d657e1af1bbcf9588e78207400391f97903402c7556e0fcd8e4fc5b2d7cb54c6466ab9cf322b69b50aa585c2d713eba42a85e29b4b2b8e8860278e5ecb42aa531e4754cc845cb42418d783cb649426ae88d2aac4842cf1465a50e295c13fb96283cd595252815791a8f6bb676eba2cfce7b7d66eed09159c32faa6f0e9f26227caaf3552c84ea9a42a849ba2345d5b940aaf0695a6157327cf81f33c366888f57a50346b09e8960d39af171ae7bf57c9c4f7b19a03134f3db2ea50fa6d2002358df4450cc4d5c904682b31d0df79665c7ea31dcde37c3168261c74ad6f9d101a3d8c040318b536c6952abb1a616d70811dc1013dc2aa4e04698e0d6210537363954f37447497e6fad90b2d47936b83bf11a7f3f3d5933fb535b244e56ad02e64d4d4c61c311b6336aa5074e5b3c709a6292db8795dc0c93dc21ace4e6268712a306d25f72af5e1ec9d39af6bef3c84e2c55c13b680eb99d899ed87f650f527a951b94d4af09cebb2b1d0e1b452bc106e77d5303546aa29d7da7f65d04cdeeccd42c164c238cf0f626cfe7d8bb62c1ae3b7f27dcf95b60d16a87b0d1aaa54932b7a59b9f0ca00b2eb815a6727783ca89202ab73649e639640f66a899195137c4a5b7c1a4ef1885f4b698f49da290dece14cb85ef9492c6f205ce35b7d976b2b85b226abbc9d6c012b17d5e5945790a7b7e8e13ff368b8df80a9dff678a6df736087d52a7033d7da703bd443ac0db81e875c6528af658cce81d363277c0d2a03e86342811300dea68722e917ca4b7edc66d02e1728267c17cf446378dc3b3cf3c33daec2c7d19d614935a072ce03b99828713dc19534b0f9ebe78f074c6bcaa5fd8f4b60ba6767f83da8c6d1b1744edae98da03c246861d30b50746a0763753641059de52d2c8a04a23f3d92436c35171a0735cea3cbd14fc9a2424a9de97a58ea4cda024a3de4c1d51327da7a8592292f4622c42ddb008d4dd14a49cfa2093ba7a7066e1c1d903f3c2ecb05eb8239624e7449024ef8409cf3508670185f734b9b8287bed5ee32eaeba0f83baf560df6e3d44b875379f6e8deb83b9722f2c751a6a4c9d0c41972275ea6d0a3a51b05d96c6a09be0e85f2e64bad7e73812973adfe6f2c68b2fa8b21544a6de4a1d90c37c07e4701190bd2b056438edb060ed8305eb88088235038bee232388ee7d31e1a32210be33267c7404c2fb9984f3c6b331150f2785ffebfca924bc192ebc3fa6f95883e675026a3ec0249c673be358c832db408cc9780393834d6aa7609289099f60107e5240e15998f08906e1db020a1f644a18459dfc90b4248c558dc59aea58c6bf063b21d477dd2e64ae911a8c33cf392e175af0eb5c8baac770a54e562755f001ddaca255613248406bde0aae4d13d1f8644ef4a78844df2e9db12c23dbe4f0bc91874f91a8d424c4f392c5b211987f7f8db835c7f9020fcd3cd94811a4d128074be1a61952b8a025d45c5384130d206b6a34c2f1369c0da2e2ce7f6f94c15b20be9d1c6311262af1c9815d0d399bc8dd8c4e3b5d386db60fa78d427bcc1d0763e9ef0c43fadb33112cfd1d6212ce5d9a4f01085b3c1a8a099f69147ef0d820c2879984f39c639621c9cce249e6ec641aa57f670afe9de1586a30c7941a7430a60613d94a9182ad722ce71296897be5ced512273a05491b466056cfc5ac9e572dab476256cff79f0626ad1eef387c51203b47614e5f6072fabac19c7eb449382fe5f1a115a11a17c660921786953c1603b28b0948bd6040c69984f31c872f2610b636301ed37c5783e6cd1a04d37c02a6f96e11683ed1203c5334e997b09aeabdf1167f52f583a87ccf7faf0d6f46f25787e77dd419622b3f3a5db1fc709229c87952b2a749fd0069ce6453708b4e96740eb982c34aab37e46a2fdfc1b89899875cf9d1010b9e2958745f6288eedf058cee534dc2f9f34b99a19e24ba77aa37a04cec9c528fb97f063a7f1a56ce3e530cb69a66d293a7ee85063d4536cda712d51181522c0265608ab865aa1a058f5d418a03795832bbdc90ccd60d98cc4ec722345f4eb7525983174c4d00bab3fd59163bc039babecb8779f3df6b9dffb9f12b648b308f97ddc57092f56c80735ceefc5f268682f141e0dd9d7faaf8ce250e1212978b985b2ade73078c73b4fc7eb6737f8473cc718e3d02a5363330575e6972118eaf249c4fe66398f736615e1209e6eac3eccef615c5e3d52250568a002a92896b77317fa64834f5f3bbeefbeb84dc15428b72e76fb0e09889255bab0cc9d64f4d83255bb30cc23345ff703a87ca8d779e2a134deac1f394d5bef39452661e2697faeb586e32db142c9cdc1a93427a9094e24132c71424a2633d9d8327f4143c58a0acf51d28eb9879e04455dfc78265ae899e183930378df4fccc3f3393dbc737b93241ae6d25ab524ed142a8cd333933a726f631d2d4d9c3948b96e10e3d1f4bc0d61b12b07b9a054bc00a30cd3718346f1850f30598e61b0d9a1fde3c98e60bb15c6f5f53aec74caaa7c83576c154df64503d7fbb60aa2fc2846f3608bfb26530e1bb9a84f3121ddf832a6cc579374cf8fe1108df1d13be2502e17b9884f32aff01a6144317bc072e784fcc0f0ff42338850bee8579c941062fd9da2a98972c3609e7cf1fcc90422aefb60b51485d82613ad4145d79b92a682195674636d6079662a80fc3501f1e0ef5320cf51126d4cb22431d9f3a41a189108f5a471aa2d6b6b6c1a25611968c1d154132568c093f3a02e1cbb134f2989069e40acc238f0d9946aec4701c67c0611c9092024709e6255b4d0970bb605eb2b74938afff1cef07498afacf2a4cf0092105afc6589f1881eb959a84f372e8497eb44e51065d8305e2c986402c681f2c10d762c24f3108efd22198f07598f0530dc23f0e287c1f4cf86906e137760c26bc0cf394d323f094724cf81911085f8f093f3302e11b4cc279cbc4597e7c7c1d2e78a349304f35f9364e95327cde791f34c35fcfe0721ac14a55c1b2e67d315bce31d9c26f74f77c35c8b73661df3ad7f42d3eaa77b1f337cbf95758a9138cdfe1ab6a9509b241b4d88c69719e498b56408b5259f8592ad8575f83fd300dce3769d00468b0d8a9289789ae8960f9f6fe58f27381296deb1c2cf9d98245e20b2388c407609a6f33683eae4b30cd0fc434bf2802cd0fc234bfd8a0f97901353f18d3fc9208343f04f3cf4b4dfec9479eee2ed3b23d9db46177990e8d90950ef7da22711cc0c638ff4f066956a110b4daf9c52725ae73aead14e9cb26d188592cae16054cd30ec5f4bfcca43f1fa193d4480d83ef5e61d30869cf9e868e1937cdd62b50a5e28972d9efeb56c55cfbca99db20bb59bc19c4a6c34c367107b9bce28656ab15fb973564ee9f81ee9f6015dbc33127bbd2e064f5023ad91198f0ab0cc2eb07147e2426fc6a83f00601851f85b9d73526f7eae92b7ab8f5f24ce7982bafb951657f36583e3bc439067198a33187b9167398eb423bcc31d837afc7be7943e86f1e8b05f58d11a484c79984f32224df0c2d4c11722b46ea668c94d826ad3e24158cd3f118a75b22e074824938cfeb6e6595f3ba7a4383e575279a84f3b1807c37b35063014f3248ce14b36b97309b6693556f26d9ed261f35f6cdf125a233444a15956658cfddc998a3dc697094a3033aca2926e13c38eff2135befc0059f8a697db741eb5b026a7d1a26fc1e83f0478605137e3a86e4de9048cec0b4becfa0758be1c1b43e13d3fafe905a9f8525250f844d4acec6547e30a4cae760a01f32809e1310f4b998d60f87d4fa3c4ceb470c5a6f09a8f5f998f0470dc2b78e0826fc020cc96321915c8869fdb841ebd7036abd0dd3fa89905a5f84c59827c3c6988b31c94f85957c0926f9e9b0922fc5243f1356f26558003e1b32002f3709e66ef79cc1ed8e1e19ccedaec0783c1f96c795188f1742f2b8ca2498cfbbe17ba2849da8753506fb4503ec0ea382c1be0683fd5258d8d79a2473d82f87847d1d06fb9508605f6f12ce61bf6a80dd736c30d8379884f3ea12dfae236c75e9464cf3d70d9a6f0aa8f94d98e66f44a0f9cd98e66f1a347f21a0e6ff3109e7ebb2bce5c70d87e0826fc1b47edba075c6b8605adf8a459e7742469edb30addf3568bd687c30ad6fc7b47e2fa4d677605abf6ff290805adf8909ffc0203c774230e17761c23f34691e50f8dd98f08f0cc23b4c0c26fc1e2c303f0e1998f79a04f32ce7131632cbb90fe3f1a981c79c803ceec7847f66107eeda460c21fc0847f6e10cee7c20511fe2026fc0b83f0f3020a7f0813fea541f8c701853f8c09ffca20bccb9460c21fc1847f6d4a0aa70613fea8493877dd6f2a6e6873ccf8569bc1a7823f66fa0e6ffbe6bb5efa9c003fdb39ce146d8a256cbd68e75b0046eb05e91f781c43fa9d01e9d6e9c1903e8109ffde20bcd98c60c29fc484ff60107e7440e14f61cef023e60c3f55cb199ec68cf8d960c423f9c18c780633e217cc885fab65c4b39811bf198cb8727630239ec384ff6e10fe5340e1cf6384fec008fd592d422f6046fc6530227f7e3023fe8b19f1376604df27d29d1ccb77924c3df1bc408e332a67cb4542534a3c35f64593357c48a2d89d52b7c6dd9082db9099c2067dc9e3ea2e771c6000e44b5888f3cd242b15f416040bf1974dc2f9c4ecba0646996229d7ea4d4aafe7c86b2066f1387f4c3d8d8b71255fc108d43710d863613002af62041a98bc84136818c294d74c5fe305eb46897005ebd731468d0d8cf27709c6e80d4ceb2621b57e13d3baa941eb518b8269fd964938af6b344b84ac6bbc8d496e1e56f23b26c9bc7d6bbb44f8f6ad7731e1db4720fc3d9370de4ad42211be95e87d4c78cb08847f808566abb0a1f9a1417266777e910ff2b761999aaa96ec0fbe544d6b5392601c24d0c6576e1b5e5f6ce8c04758cadfd64faa962291ff1813dc2ea4e04f30c1ed430afe148b021dc24681cf30c91dc34afe1c93dc29ace42f30c99dc34afe124bc7ba44908e7d85a9dd35acda5f9b24f3746c073f7ec7e33922f81b93609ea577f32338c5e0b4ff61a0bb4700fa5b0c478f9038bec3e2f78e21e3f7f718e79d4272fe01e3dc3302ce3f62387a85c4f11326b87748c13f639cfb84e4fc8b49b0bbb76578cebf6238fa86c4f11b2678e790827fc738f70bc9f90f9360ceb97f049cffc4700c0889e32f93609ef20f0c9bf2ff8df1c88c80c73f188fac903cfec5040f0a2938d972a4e1c88e004702139e1381f03a26e1bc353fd70f9214cdfe754d82b9ef0d0eeb7bf5301e4322e051df249cbbc8d0902ed200133c2ca4e086188ee111e06884091f1181f0c698ef8d0ce97b4d30ad4745a075534cf8e8088437c3848f894078734cf8d808846f67109ed9c3394df01511d2dfa611c5929ba95b34c6f9f1d2629cd8f698fb8f0fe9fe2db0709e104138b73409e77dc813fd689d622d91562607127b7f2daf1107a2739c49be9bc2268ba630bef50f85965803586b5310f39098e2278827e3f5d8365899606ad832415b4cf2b4b092db6192f3c24a6e8f499e1e5672072c0198114102d011533b3facda9d30b56746a076674ced5961d5ee6292dcdd399d1db2d9a7ab4930afcdce09599bdd01033d3702d0dd301cf342e2e88e95a0e7872c41f7c0381784e4bc23c67941049c77c2702c0c89a32726789790827b619c1785e4dc1be3bc6b049cfb6038760b89230313bc7b48c17d31ce7b84e4bc33c679cf0838f7c370ec1512477f4cebc511683d0013be2402e103b11ac2d29035844c93605e595b16b24e9385695c1852e34198e0a29082b3b1724171d872410e26797958c9b998d3ad88c0e906636aaf0cabf6104c724958c94331c97b87953c0cf3bb5521fd6e3826787548c1233016a561598cc4dc6e4d046e370a13be3602e1a33126ebc232196392bcbd73ba8f9f60ec820b1e8b15a3cb4216a3c7610d38e5211b70c66390d787853c0193bc21ace489582cdc1832164ec2dc79df08dc7932967d6f0a997d4fc1706c0e89632a56b8db2f64e16e1aa6f1fe2135cec3046f0929783a86e280902866601a1f1852e37ccc970f8ac0976762c20f8e40f82c2ce138246cc2311b4bf70f0d99eecfc1d2fdc342a6fb73b174fff090e9fe3c0cf2116121cfc7241f1956720116578e0a19571660ee7c7404eebc104bf78f0999eeef82e13836248e455862775cc8c46e574ce3ad2135de0d137c7c48c1bb63284e0889620f4ce313436abc27e6cb2745e0cb7b61c24f8e40f8622ce138256cc2b1044bf74f0d99ee2fc5d2fdd342a6fbcbb074fff490e97e2106f98cb0908b30c96786955c8cc595b342c695e5983b9f1d813bafc0d2fd7342a6fb2b311ce786c451822576e7854cecf6c6343e3fa4c6ab30c1178414bc1a4371614814a598c6db426abc068b7e17858d7e6b31c9178795bc0e8b7f974410fff6c1485f1a92741926f8b29082cb311c974780633d26fc8a08846fc05ce4cab02eb211cbbaaf0a9975ef8b65dd5787ccba376159f73521b3eecd98df5d1bd2eff6c312bbeb422676fb636e717d58b7d882a97c4348950fc0a2c98d1144930331e1374520fc200cf6cd61611f8ca9fd9f08d43ec4249cf77bdfe2272453f47b1f6a12ccb7debad58fe0145b6f1d86e1b82d021c8763a1787bd8503c0253fb8e08d43e1253fbceb06a1f85a97d57046a1f8df9c8dd217de4188cc73d61791c8bf1b837021ec761c2ef8b40f8568cc9fd61991c8fa9fd40046a9f80097f3002e12762c21f8a40f84998f08723107e3226fc9108849f82b9caa3615de5544cf26361259f8615281f0f59a03c1d2b503e11b240798649301f32fea41fc129868c9f89097e2aa4e0b3b062dfd3218b7d676365eb674296adcfc1fcedd9b0fe762e26f9b9b092cfc3243f1f56f2f998e417c24abe0093fcdfb0922fc424bf1856f2364cf24b61255f84497e39ace48bb164ff950892fd4b0cc23377724e133c154bd78e3b39ceaf498caf99b914fc2a70de58c5f8c235faae363955cc1c7a35c15760f392c9ecc9adea2eae85fb764b217931e3b387d689d034cf4a7a2dc1672545f1456c06d2a598d3bd1ed6e92e33f9452f4e7005a95f60f3b2163277ee160fdf9c88e799bd61f296dedcd67e0c9f51164e23ee15e03fc483de141e44a705e657979bfc8aaf74f65622fc4a675760c2df8e40f89526e1dc6fdf310472566f4f20c890d0bff6265e38ba0a4b9adf8d2069be1a13fe5e04c2afc1528ef7c3a61cd79a528e3e3c36d5dca26de1971c4d9d827ce0a7c89ac0fde83a2c343e0c1b1ad763f1e1238af87003f6b58f29be762396907c124142721326fcd30884df8c09ff2c02e1ffc19ce9f3b0ce740b26f98bb0926fc5247f1956f26d98e4afc24abe1d4b9fbf8e207dbec3249c97cbbf31c5245eb435944af5efbd86c7a53b314cff0b8be92e0cd3b71160ba1bc3f41d0da67b304cdf87c5742f66c90f3496dc8759f263584beec72cf989c69207b0effd4cf3bd073187fe2502877e0833e6571a631ec6dce0b7b06ef00886e9f708303d8a61fa8306d36318a63fc3627a1cb3e42f1a4b9ec02cf93bac254f6296fc4363c9539825ff86b5e469cc75599df0aefb0c8629518704d3b39831752230e63993f056ce69dd3a3e6a4459b8e0e7314af56828bd8051aa1f01a5ff9a84f37df41af8a194621fbd1731ad1b46a0f54b58fc6a542764fc7a1953bb71046abf82794e131acf7915c3d4342ca6d7304ccd22c0f43aa676f3b06abf8105c0763401f026f6bded69bef71646ae4558726f6396b4a4b1e41dcc9256612d791773ddd611b8ee7b98da6dc2aafdbe4932dfa8a5ad9f843ac5462d1f602ab70babf28798e4f661257f8449ee1056f2c758f357c73ae19bbf3ec1d4ee1456ed4f31b53b47a0f66798da5dc2aafd391617bb461017bfc092ac1d6892ac2f314cddc262fa0ac3d43d024c5f636af708abf63798da3b46a0f6ffb0f470a790e9e1b75854ea194154fa0e13de2b02e1df6321d93b6c48fe8085649f0842f2472c24334286e44f188fbe6179fc8cf1d839021ebf60e9563f9a74eb570c53ffb0987ec3300d8800d3ef98da03c3aafd07263933ace43f4d92f978c12c3fae9e6260e15f26c17c54e8203f82538c0afd1b63911d96c53f98e49cb092ffc528e786a4ccdbd88c940787a49c3009e62c8684655107933c34ace4ba98e4616125d7c3240f0f2bb9be49320ff011750cdb6a6f656a78dc0256240676b883404ac5efe476dbcb9d57dc412079154f4e661b99bbafdd3c562cee96882b656ca093502f16c347d638cf4e743ec5076d70b9c9772639c7d58ed4cdceb1884d11bbeb968a2fb8ef26077ac00d5abd775cfd721c0b17a7b0820f32d9c0f896aec9af1788412f4aa657ea42e72d3e5c2548b46980511f69a23eba82ba1a62a88621268f2562605989b060a963ff6649550d375b2cff069713c4ae86985da34c764d654c0b3997301fc2e36abfd6c9bc17b3a962d8ce52e95b056c25e33b2b570ef7e4dba9ee78eff161496bc51d2e3388ad8d305b479b6c9de8d3d64922569488614d6b23b312de0b626363ccc631261bf1a18ff304dd2211cb5c6b573857d73bc78d15af47a573134ce7b1269df37c86cb4c31b48cc78c7562785aa1f0471bc2a82966ef3893bd27589282cf1712d68ae783a4e15e82359b8a37c3c88f37911fa2795a32371aefd85a26c8544eb3b1fc0bbb939415c492e69825134c960cd32c81db7584b7c52c2d8835db61d64c3459331e0d1718fff3455c2847731f688f3f3bab9ff36c8fd937c964df343455aebce370f5422fb8f420d6b6c0ac9d8c9595fcfae67c9907f90b4928298ad4a32566d7143f710ea690e1e39c595a106b5a61d64c355933d6579c1bef102d129e65ce6783c7b9e49d20b6b5c66c9b66b26d84565a9fe0dc2a776e2c1076ac96f6b803e4b97e79ce2ff775ee41a952c3e8529036984579268bc668a1e5fd2e0cb10515b58659cedd1529ca485e19d159d616b36cbac9b25e9a657a4c52a5d47c9182ad707eaf8cc8a7da617ace30e939c3577c31d793663bbf27b37d1c415c5c4de65bed319bf34d36e31b84c138e10da735b2552055fa1644e30e98c6334d1a8f0a90d37af55ec12aefeb87e7aca65d008358d511b36a96bf9a6b92a56bc51491db940acff35f9237e7cc51855c27ccc6d9261b07a321c76b2dcb9c8794adf98ead2b9c27cac4c4a6ca796cd4a584ce981d734c764c0a914ed464cad005b372aec9ca2cdf35a9a95596f0a248cbbb62dacf33699f1da0841a54ffeaa6083b6016cc3759303f40caec7a5c32ff71dfc1d3366ffcf1f34c543ed80d6350e027145395c783866275d3bcee98050bfca41595d3753cecfcb6d5c03b5185530fccca85262b27f84a11e73b0f2f13da2e05eddf3555dfd811b370173f35de549e18acc69b2afcaa9397ed84d9b5c864d748dfa97c30abf0d0aa8e4d3d319b76ad7e5b5355312e9d39732fccbeddfca42941f203bc14455f1fee8d59b9bb9fda184589d8bfd5d5cd2dfa6036ef81796eb03c3f4fd478dcbe921296aa3e4313a619987d7b9aec2b66b4fd22ebd91c516358217bae178a769212e7ff65486f903f2f099f82f5c538ed65e2b4809813de7f949a50780e3b631c169b382caae134803a75e887d15862a231c56759324fc477bbca93fd314b979a2c9dec2b070fd25b9cae52e500ccce657e5a7df432d7446169e5d0832d397eae475b1a1b88d958e8a73456d9c6643b09d7933fc7bdabd0905e173077a0a95febaad7cb9289d95784b547a6b2cfcd97922ff82f85451b6a599855c526ab768fd833b1f817f4f968990cc2982c3731c9a9c895bd7d4eeeb53915e32eca1cabf8824dded6673eda88b76b161a7b08aa9fb2666336acc05a54aa6fc33a703fcfd08f56bd343307b360259637a41e5f975c36b0aa9232ee597ebf10c4ce5cccce12939df955da898f479c28aef0674a448a3ac311b839905dd1f9e760cceabdb11ef8e0fee9b6fdcd71342cd77ab2cd7521ef128141ac198259b3ca644d065a9ff36ae08d65a6d25af546ad0dc5b45d1d66f464552306d23b326f18666369f810298f3c448663daaec1fa60f0be4eb8849fd7838a457ae0d6792ba7d2d58fcb2330edd79ab49f1e50fb89ce95b58279b98ccd251575523f614611df476216af3359bc5720efaaaa55dc9fcd3545661446661facec143c252c776ab1654e3d6fa973c57d7783f098a862e368cc8632930dfd511b668afc73255baee93fd909e172311ea9aa743288d66330adcbfdf5409953f5aac65ea67be4ff58cccaf57ecab5414a4b2ab478aab4c1d80a56bd72ed38cc820d7e46b405b1c02dff248595fb28ebe58b1a49b01eecf198451b4d16e5862acb25ef461d2e13302bf6c5e6cf54375ce609e96b45eb6acd94be2762b66ec2468c06ab5b61a360f5d6528afad424ccb6cd26db16860847b7c41b2c04ab1bd6d569c7988c91d80f6bdba92e09536b969d4ca6604cf6f753ef0c9efaba756caa94772a66cd96d4fd4755e9e05a5020acd17391542d247e4392a780cb234ccfa6611c0ec0e6ca054bcf5459202fc2fc260fd3f94093ce45213c110fc7e8e368d4213b1da37410363a208ab2c504e798ba2553a757d59782d83c03b3f960ac0e0575745bf9dcbedd644c5e9bb23c9e6a3c5cf56a23f9980d876075a820291355d97c26a6f5a17e5ac6ccfd917efa5dd339aa681666e3617eda9babf2f3eacd87aade1782583d1bb3fa7093d57b46948e54cef7fd5b971e2e73302e4760630dc278839fd1b854a9ea5cccd22383b5ea60f3495cdb2adf2d97297055e1d3d0f99b4834757e4e16eff13c3bd9da59ce327923b568fb559b64a9b13d6a3b985279a6ae73c6a54e8d8ba713054cb5fc2637cdc2241c55c75d7057fce993e030d55a4e89e55a9a97dc36a618943ef8fcbaa9c2fe62316aa4d0395729b8beb1196685693c13bf6ab2ae6a9bd4b6347c567aa14891785abcccf18886d22225cb21cd5735ab75961ecd43b5b30cd53a997c8a17280907f3a6aab538867fadaed987da57220b471799747705cc62eedcab045fa26e31c0b646c45bb7a36fbdb8cea36d955f85ad11a6af0e1002d4e8922ac52d000999495c47e16a6ea34119739b559b39881ad6af93c543e3584a64db0b643c64602a3a5da62fbc3f280eb8568e4be23a8e125717816b31cb12ffeb9eb6c0f94a117307274d63eef22aab65869f1d0b901d7a27416eb513e4a058803ca96b12e4f1f4115881e44513aec20a99d5706471c0f57acb24ae1328713537a677bc376b794cb2862de393a84ea4cf4d9567415c5ce9dd6451360ec8d68d4c223b891219df9242b541e8c58e1259cfdf2f36b9ea49a010723225b6b6c648592044ac1040cb64e5272ee9d91e4393e84ea144d740a073474197c52405fb7a4812cea994705a0938c961b4714ec3be1e9184761a3d34b7d5a2408e335a25d22c6f0b561ca0b5189784763a25b4f6685e19e754ec3c908a9d4189af9d6f7c9b6253852f1a9e8477a69d55a99c58807cb94712e45994203bb264e96da6c81ab8afadad10611e65140784778c4d223c3bfd2d7013d94a61ff2aa9561c90bd3d3b89ec1ceab44f791d9edfc6cbdf96007f3b97baf5030ec28867452b1f54b4cea3c4d55444cfc9a27f6283f87c9c1ac5791f97c2743e25a60e55a4623385d86532175dc9f894e23800bc363f09f002fa56365524e1637fe2d62039aa4112d58594a8b6f3a460e5200b7045c4015607504fd896fe8839db397acb6bb0d01b0780674d4b02bc88ba886bae68e9d321e3d63ec24625115e4c8970a76a21f4d663e313b53f1e93c47a0925d636cc4f1b707caaff3d45f5bf617d4db8be2a4bf5478f04a38d8f73e145680e769db8ba9eb93b4178c6bdf0e120d6697e291cb79291a2689be1735c48868fda4446802e9e8c2a8a41193efa6e3342759487793b27d4dbd9cedb7ad7444695659d8c803d4119d56877cd0894d264046e9accf0ddeb90e1b38735a39ab9764684595546e0668a8c6a36a765f8ee80c8f0317829a38a0eff8c6a1529b1b752d710b174486f1d4b0ef8340fd4cce2033e2ffb3f3e16338b8fc5bc9c43a82f29b865942b28cb283bc8f8e40ebd5dc35633ff1bad2c6643747dba54d2679e8c0425e27baa7c62d2acb1a704b3871f63ab538ae13b76aae2df95e9e8c458ed3cc4b1565e3b081b195e693c5874583b51617d0460bd8abec2ecf5587cbac86236ac729f507438db52e1ac5b2789f36a9b700e8a25cef6c03bafb10967762c718e0738afb509674e2c716e0038afb309676e2c719e0b705e6f13cec1b1c4f91f80f3069b700e8925cea700ce1b6dc239349638bf06386f4a774dc9ffa20243e9d0be962042fb28407b733a3c7505eaab0b3cf5a3c19415cf66549efa024be2fc8f4d38736389f34180f3169b700e8a25ce3500e7ad36e1cc8925ce9b01cedb6cc2991d4b9ca7019cb7a763d83606d31bd107c7b0a1ae03c8d5efb005654e2c519e0050de690bcaec58a25c0e50de650bcadc58a2fc1ca0bc9b7e8e23afdbf005b7d5064a5c61be44f126716f9de829e72fc40fe48120d3b9271d3d45781e8eed624cd853d4820aeb0c80f5de74ad23c0bd7085832b4d3eb98e0ade7100de7d94f05a007825b5264aaf06f8ee4fc74a0343b58edf3401bc830ae03600f001ea750720b8e49092e4088d8d62b00919c4be5410fb00880fd66461078a23cd4c1a52a16c0c0a3b0f514f6a582c20b99949daa2722915ba55c00b1fa61f07bd583ce26e6f876d6a47e8816554180b00c647d2e18159b5c6036703748fd66c3ae88a72170cce8a6196f20e40f9583a22f3204fa54fdd4e93479265277b028c8f5362ec0622739031c8fc9d32f17cfc0adf3700b84fd46c7d1a0a4c537d7a3115d65701d627d3918a62f9b8b73449988a9245ff6c80f2294a943b82e81f7c3a431a1201b2f11a5700c44f5322eec9bcc3aff9f629d5db8a85d093c9c66e7c01ea45cf50afbfb0d233556abc686aabb4386c0c5a261b01df7cb626a0c5b139b72180f65ccd663f712fc40f01289f4f47012968f188b46f91ac80b41f480b5fb0112be9400232ac3d01d6ff52626de29cb8d3e9bcb32dc990655121eb0e22f88b368dfd251db3465696cc061ef8924d3849075991e19c0770be6c134ed2218064380f07385fb10927e9785f329c17009cafda849374343a19cedb00ced76cc239249638df02385fb709e7d058e2fc15e07c83ba3b63bda7ddbd360d34e8c59218dfb4777214615b115903dbddc043dfa21e0853265e75b751af4dfed905f8e7dbb68cfa1d44e98f649d6b4d813fbe630bca9c58a23c0aa07cd71694d9b144990b50be670bcadc58a27c1aa07c3f1d233c789fa4fba25a38ad9815a56b840759c9f22c90e57c60e7a0fedc18f6021d06b07e68cf90d6e1311c84300d44f48f2851f2d99ade5ec8e43823326cdb5161ab073cf0e3740ced1f2446612c755428715894a72b65242b8c5f07007e4209b03163868c257e59497b00ec53eab9385823453e73d7b724c337840a5f4f80ef337b46ff0e8b61d4fd0e64199fa7635338bfab0d10e6bf646b0dcc077ef9854d30093d930ce64c00f34b9b60128eb820833916c0fcca26988435163298a300ccaf6d8249b8541819cc2900e63736c18ce36237e301ccffd9049370782a19cc4c00f35b9b60120e5025833910c0fcce2698842b5792c11c0c607e6f134cc2d67132987023c51fd201131b85ae8fbf208ce6640d1b0300cc1f6d8249980191c1bc04c0fcc98e69f684119c6c9afd8b00e3cfd48d6d70e191e43e4b932ba63bc7af53a135c0f74b3ac6a7c189cd5cddca9b89c57916e36880f3d774ec6e999cc5985c8a091fc012bfdeed13410be66fb60125ccc3c9807602407fa704ca274d7a7b11cb63d87f5d1f44e83fd23152d23bf37b8af443efa683790caebb16d7651f8a00da3fed599f80b001982c175f0850fe95dea101e515b978fc72eb6600dbdff6eea647d88841b69bde3290cdfc63d33ae7a47bed9035633c0d3cf55f9b7092ee044586f33e8093d5b50827e92e7a6438f702381336e124ddf68d0ce7d500671d9b70926e4a4886f30480b32e25cecebe737938c297347f9f9c20827a26c8dfebd90895b02d930cea19006a7d1ba112b62091416d0da036b0112a612b1219d456006a434aa8e1269012fa2bd904d23b00da4694683b316f8be752e18feeaa82b5abcdf35d80b43125d21d35a4fc7fbe5c63b16c753227070b6552c0c5e6d0227e93ca6baf07889b50220e36cf877098175963de7080b22925caaa7ad9bd284997822283f9184bc26c66134cc2a1b164300f05309bdb04338e6df6470198dbd90493b0e64406733f00737b9b6012d6edc9601e0260b6b009661c970edf0460b6b409661c77f5d90c60b6a284a9b6301cc26ae71686070390ad2941c2bdf694d434c1231b723817c06b53b3751d57943b4195707e10d904d54f415da76d3a22f4e05a1aa1b7009f6c4709522d5fa29a387803c6be9e8d686a53cbd1b1c03fdb5362e5cb5f14564cde9f221e9c2744b9abbbc56f704d67e0911d28d135971ec93fbc5cf8a4925d42b97c447d2a700c80eb489d37178a665fee77452212af168f1631e2f19abda8e0b503f03aa5b3a9773dfbbfb285cc2b204dec4c89b8a9214d7455895f6ad815f86517ea8c044f0d09a374132a747500baaed41d62bcee0cb7db2a60703da2e49c1ff80c1952b2dd9a4f02487748472a0967fdcc6495b7eca87d9b1ade0410774b4781dc4f879877cf1ec2865eb2cd657607994f771bb192b69f93616d00b0f648479306d64a19ffb510fa8188bf63ba87c6f89f544088966c52414be0a53ba5b39103cefbcd135354b1460ec2fe1eb2acea1b80b5673ac61b6369aa3ead7f582c27f627ea2471f6b20927699f0f19ceb6c03b7bdb84333b963847009c7d6cc299134b9c6b00ce0c9b70e6c612e7a900675f9b700e8e25ce6b00ce9d6dc2392496381f0338fbd98473682c717e0670f6a7c4a956661fae15e5d3d4e94bd68c770f4b021c60ef2c0cc2c59ec93a399e04be3990ba9303fa64b2f5337e15c91d813f66da347175702c57227e16e0ccb209676e2c71de0f700eb20927e96400329c850067b64d38736289f37a8033c7269cd9b1c47932c0995b936334bd119d708c265dae0e8a42836d4199134b94170394436c41991d4b94eb01caa1b6a0cc8d25ca1f00ca61e95821c15ddb702ae3233b0a18dcbf0a8e03294fc7f80fb25dacfe0332a0e1e9e8ab0cbe9f24615f25d97a9c4b01d611e9c00a472ecd616b8540ae76ed5ab7780cc03ad29ee9fb719c3d3910a4a6a3d231e18fef37e95d93b3f64c6b29077e393a5df3d4a077c6b979f835006f0c75fb3ab60f65d217e3e77d1900e0587b26fa110e30249be877394815c751a2dcc980327557c524e7d9e4ca473cba6fa61d1f974505f93900797c3a3ad4726a5987da9520c24fa004d895e90b45a51abb092765917a6682aa3bed5ae099136b727cb1b77c19c7a54e46021f9d948ef225ac0125b7baa91db33476063027a723c51c52cb52ccd301c0299400f5fd590a59d533ce09a3379947ee0952caa9b6018de3e8f6c300d069b6018de39a082301d03cdb80c6718fab7c0074ba6d40093b7fc980be0080ceb00d28e15a8564407f0340f3d3592f726bf1bca0b451b4b5a76a16214c4bc99a453e066067da0a96304d2503fb2d003b2b1d05fbc1b5ac607f264b029c4d09b08fe699a50c2e0f30c379840bafaa112fdf79c3aded132603649dc5ff05de3a271d3df041bb8a096b52645dc53f030f9e6b23d438f6bfff0ea0ceb3112a61f42783fa0d803adf46a884250032a8df03a8053642255c4e9f0c6a2f90512db0112ae1f83b32a87d01d4853642256c032083da1540ddc546a884ed0064507b00a88b6c843a2c86500f015077a584da8cc1613aee6baafe14bfc10edd40febe9b4d93b107514e78251b013a0478e1ee36e1cc8e25ce4280730f9b70e6c412e75680734f9b70e6c612e74500e75e36e11c1c4b9cf7019c8b6dc2392496383f023897d88473682c71fe0d702e4dc7941988b3f6ee787925c0ba2c1de3f0fc4d99c98ee5368dff02988536c18ce3368d6703984536c18ce3368d7f0298c536c18ce3d8e57d00cce536c18ce344c3320073854d30e3b84de32a0073a54d30e3b84d6329805992ee122706d33b9c81b09f886c91feb300d6bd6dc44ababe0d19d60c80751525d66e06ace6fad154f90aece6201d2f524c05772180bbda66b884c52932b89301dc529be112666264703301dc3536c3252c6e91c1dd0ec05d6b335cc2fa3f19dc1500ee3a4ab8bc4b7ca9f8b477bd072e4e0d2c27c34736749c2f76acf0ed43892fdc063e848d29641bf89c0e3cb32c1d25d8e01bf8c47146de5d006b392556bed56e72f7ec49ce7199c36205cb775e594107ae0b593604a2fa7a9b7a9a8651663c643d4df5c0ce471b6cc249bac23219ce8e205a6fb4092769b70819ce0900e7be36e1245db09a0ce7fe00e7269b7092ae4e4f86f33c8073b34d3849f74e20c3790bc0b99f4d3887c412e74b00e7fe36e11c1a4b9cdf039c5ba80becfa906f5e998ceb0e337c753f05ee8074d7cdfdef7844e893643b1edd0f7cf2404ab4fd195c6a551de1cadfee3acbee0acbbcc9831bb39b6cfc28109f5a2156244bf693c677e5e56b80471f94ee8531fdb636c14e3ec221906da87cfb34e0db07c70132e13c2632c8fb02c887c4013261af1419e4af417271681c2013b6a79241fe10403e2c0e900947069041ee02928bc3e3009970840019e46f81271f1107c884bd5a6490c7024f3e320e9009ab276490bb01c847c50132e1503832c84b01e4a3e3009970ae0b19e43900f2319490836d4d18c7853e9b0394c7da8292b43b870ce5f100e571b6a024ed682443b900a0dc6a0b4ad25e3132942f0294c7a763c050f05df4e2b88cd7312c89f58474e4f36a1c167f98bfbe8eadaf68505fe028c67377759ce0bcc8f733db285a7f37b032da0a2ed9e0a28dc0774f8c0364c20a2e19e42500f24971804cd8e848067936807c721c2013363a92411e03209f624ba981742d2bba5d7d00ca536d4149baf01219caab01cad36c4149ba241819ca0301cad3d381b29099f7404bdbf4a175542837b024ca332851b69228b9d779f7d84dd3fafe64533196038467d664c486e248bd916cba7b1d10b1cfa244d94b2b1e79f79b80c3932638d7cb59b1bc06c7d68c77de2aa12d8792ed49f13f00faecb88026f46832d0ef03d0e7c4053461f5950cf48f00f4b994a0f9fee6ab9ddb85625226c4375ba4c99b633874ae15c8c2ce4b47296050ad2b05ec01109e4f89b00d4b5d26559692a697655418e7018c17d46c61ca1515df8dbbde05282fa44e115d6f5ccef880e20d4285e406c7e5314c115b0078db6ab6bb040a4cd37840b215825e06582fa2c4da5662cd75fe25e759e7890ca7986d4a577643d604b21e80bcb8269b40bc954ec2a13a6495ce6500e5259428d5827559950a3fb5c72f7703302fa584d9c839e10ff3714e93e498a6f865334d00aecb6a361ac7bdb83314a0bc3c1d13da544d3b99bd4c64b5739ff2f700da2bd251180a5a14221ddd4456185a0d9a2caeb4112be9504632ac3b01ac57a53321e0436bf9febab577a5fecb00daabd331791daf152df0a4aa8329b3ac66549efa044857afb109676e2c71de05705e6b13ce41b1c4b90bc0799d4d38736289f34280f37a9b7092ae8c4e86f30080f3064a9c2d59b2d65e2616e92c715894a7aba64e565fba0a00bcd1a6856848d73e27abc9e780a2d14d36e1245da19f0ce77c80f3669b70e6c412e79100e77f6cc2991b4b9c17029cb7d88473702c71de0970de6a13ce21b1c4f90ec0799b4d3887c612e7ef00e7ede918d9c107c7b82faac5b98a5951baca9b743be5b224c63bd2d12c07bdd2ff827384f3e3c8169cbb1778e89d9468fbb0cabd48deb944bc0ba4d4f9cb7ff3d6cf0d4264722c4881a0968631cad3a9fc3817f8f15db6cce3206d6122eb576a02fcf66e5b5092b62e91a13c02a0bcc71694a42d4b6428070094f7da8292b4459e0ce58300e57d762e3a40b84c16d9a20347832ce87e7b661c112eb54936f86b0af0d007a807c9aa66e46251272a4d57919e6cf2e01ce0870f52d78c788912ceb698ee5c717bd68b3cd7c930924d5db915607c281da9a41ab0c03d6f45c5edda3699703388da0f5362ed614825dd45b4f948f8358ea7f25ad0ba949d708480c9bae0ea02bf7d843a1b72ab947c580d7fccbb76b9ab7a9c77caeb04503e6acf706ec2e15f64d13e1fa07ccca67ef6c1946b2d9045f2d701cec76dc2991b4b9c8f009c4fd88493747d1a329cfb009c4fda8493748d1a329c77009c4fd98493749d1a329ce7019c4fa7bbcbc3fffeb784d3fdc9a65bcf0585fb67ec1c3b4fe8b16463e7a702accfa6637e660eab9df333cb40d47fcea69474306574274b499f04389fb709676e2c71de0d70be6013ce41b1c4b908e0fcaf4d38736289f37280f3459b7066c712e74100e74b94383b337d622c2f0eb9426a5be3f23050507a391d052505b524e52890f815945a0090afd802328e93b4df07d1fc555b40128ea62303391378e46bb68024cc78c8408e02205fb70524e1780f3290e500e41bb6808ce326287b01906fda0292704c3c19c89701c8b76c0149b87f0c19c89300c8b7ed19ca45984a9215c9070194efa4b39e53c8dc292e7a2d479ffe4258aa249bb5f13a80fa6e3aa0066d678f632bfb3f2c09f53d1ba1128ee42483fa2780fabe8d5009eb426450bf03503fb0112a61bd880cea2700ea873642256c472283fa3180fa918d50e3b85cef4700eac7364225ac3b9141fd0d40fdc446a884f52832a8bf02a89fda0895b0464506f52700f5331ba1c67179ca1f01d4cf29a17662c91947c9239c2ac395df4d0e05e3f7dc490bf1aba45e0a907e918e4614bcc338eebd48c703945fd66c7b942bca5d909a30a293cde9b811349d7c958ea9858334a069183f473627ee0de0875fa76379bf614cdf332b2d0310c9005e00007e4309b023ab3c37d33b3d6b32dbc4f848e478cfd23c1b00fd1f2550be4796777b88058ee422b1564d31cb67ee7059c2596e64994b7380f0db74147d540b3d2fe0ec2b4b8ede6c264dcd1ea554488f0699cc7794483334a44b59a1e0c0a33e5c3fc9ff4a4b84c523b29596de04b8bf4fe754ed124f51bdb6f5327d00b0fe60cff457c2be25b25ed07d411afba38d136348170522abb52f021efa938d5849570023c35a1f60fdd9de197284cdcc6433e4589d24da5fd29955c15a541e2b4ad14012c7418daf018ffd351d9313b08440cff78751e224cbf9eb002ffdcd269ca43391c870b603def9bb4d3849a7ce90e11c0d70fe61134ed2895d6438d7029c7fda849374162719ce7300cebf6cc2493ac7980ce77500e7df36e11c124b9c4f009cffd88473682c717e0970fe9bee9a92ff463dc2b123648d7a0f01b4ac9e45f38d4977f3209b6ffc124be24cd8849374af19329c0f019c756cc249ba4f1719ceb500675d9b70926e2c4586f31680b39e4d3849b73d23c37906c0599f1267b0cd25e238b36e0790ab37b005654e2c519e0c5036b40565762c51ae03281bd98232379628bf02281b53a2e4e3eb60a7c644b692f18d2456b17ce7712e960cde702a78bd4146d384129e1adaed8e3ece771e2c146b74d7c671c81703a84da93d52815a2ea2b692bd463e12bf810b0900af1925bc165a74e623ea968a3175c96dcae287af0dc0d79c125ff5b7da211c9944b6d5ce5480753b4aac6a1c72762d1b877c1900b87d3a000eaa6500cf05005b5002544badf8ab12c6afbcf83f00b2a52d20e33847e84b00b2952d20e3b8d2dc2f00646b5b40c67150d60f00641b5b40c671a5b9bf01c8b6b6808ce34a737f0090ed6c0119c795e612a095a7bd2d20e3d85cc600c80eb680249c614106b22100d9d11690842b769181ac074076aac9b670288eb40044d6fab33d40d9391db5ecdc5a56cbbe16e4d75d2801aa7e6cefaa1cae329399bb2fb09a7642de124e362d7516c0d9b566a3b62bca5d4682b09248b68cc415206aef408992cf3bd727f2f3b6f1e52cee53f76f07ded88d12219fe0eedda876aec3a258fc2b8a6187560f00ae3b25b8ae321aaf672b19ef52c526e715880c86cfdc5d2e8495d236a1fd4b05f6bf006c0f4ab0bc5b08e6d305ccddf49b672b0bc5ef12e7ff65227d8c5fb1a72dc0b82325c6f620d776e12d76d42d97fec88702a8d2637c7baf4f0430774a479e5dc8fc4cc227ec6a20f3cbe100654f4a94db01bf5c2a544853419ccc0bef05e87a51a2334db437673a0b99db97cd45e5d07ae49b54731c6e00a5c8dee94829fdd5b50751365c9045ef9500661f9b60c671c192bd01cc0c9b601236f292c1dc03c0ec6b134cc2ae073298c500e6ce36c124ec102383b92b80d9cf269871dcea663700b3bf4d30e3d8765e00600eb00926616b2519cc5d00cc8136c18ce326b3790066a64d30e358279f016066a5bb6289c1f42e8c17c78d17b600ac836cc44a5a9027c3da0760cda6c4dacd80d5ff720fa46551b2051f7e0170736c861bc725729f0170736d864b988991c17d1ec01d6c335cc28a0019dc3700dc2136c325ac1890c17d1bc01d4a0937dc4aaf84d919d94aaf9b00da61946883afa149d8b842d603d519e01c6e13ceec58e29c05708eb009674e2c711e04708eb409676e2c719e0f708eb209e7e058e2bc15e01c6d13ce21b1c4f92ac039c6269c436389f32780736cbacba0fe0bf88468c98af70f00b4e328d1065bb82c8eb3829b0194e36d4199134b94c70194136c41991d4b949300ca89b6a0cc8d25ca6701ca4994285bb1e4e850ef8e82691a254ad6e4319125114e4e47af53f0d58e08473c91ad76b415609d624b24271d234a16c97b83483ed5169439b14479154039cd1694d9b14479004099670bcadc58a2fc19a09c4e89522d03c0511557ac50982772f362b6295d793919c8dd41a633231d2007d55290bb0290f9e90039bc96822c0620675282d497224dae2c9c84193f7c7d01be59e9c8640a999f8984719ccfb104a09c9d8e0660ff5bd3108e4d22db5ee17180738e4d38736389f34e8073ae4d3887c412e79b00e73c9b70920e4424c3b900e09c6f13ce9c58e23c1fe02cb00967762c71ee0f702ea0c4c92de063dcca65119d8f839b24c7bcc5af0bb729c0b690125bb82edc380edcbe043468ec624bdb1069d64356036a04502eb2052569b64386f2608072575b509266396428fb0394bbd98292b4e64386f2768072f79a44e96de288e32a0b1301ca3d2851b661c9def064aba5ba9da6364b328c9340c168cf74148caa5aaa6faa7c01f68f93168c8aa9d04e0368f7aad9c8ee8a721733256ccf245bccf46610d91753a2f46e3ba78ef384b0b572b3afdab2d8eedec03f975042dd1e407597912c4f57ba4936d17a3280b794121e5faacfad879708fb790d7c9e58b4afc461521ec3c8dc11a05b461f9993bbf34d741edd20a3ed2ae181133cab704e718ec58e28c22577c94a96db03a885d4feb89e2557839de0fccf07096e14be49b8cc73172a742d01ba224a74d55fe18370b82a590a5902f2ec621bb1920ef327c3da1d605d6e537bfa60cae15864ede9af80c8bfc2269ca4a3dbc8703e0c70aeb40927e96860329ceb00ce129b70928e0826c3791bc0b9b74d3849470593e13c07e05c958e2638ef50d6dad204b702605c9d8e2638e893fe9738215cf7886cbecf3850582a4d4784c7a2bb3e117a18658b26592ffa3f00e71a9b709276f792e16c0370aeb50927693f2519cea100e73a9b7092f6a093e12c0238f7b1092769d72f19ce5300ce329b70920ec926c37929c0596e134ed231c464381f0638d7db8473682c717e02706e487791deff7043c24a27d970c3c701da8d76362b1362256b56ee07b0ee6b53d308e98266644d23cfb124ce4d36e1245d6e8f0ce70300e7669b70922e554a86b304e0dccf269ca46b6b92e1bc11e0dcdf269ca42bbf92e13c15e0dc428953cd472f64e679c0de881ebf31213900e401b6808ce3b0edfe00e481b6808ce312667900e441b68024dc73800ce43800f2605b4012663664200f07200fb10524e16e02642057029087da029270620b19c82301c8c36c01493869800ce41100e4e1e968290abed82361d643b6d8e36280f5084aaced59d03ef5f83514ff05601e69134cc22dc1c960d6056d9847d904338e5d186f01cf3cda269884357132986f0398c7d8049330032283f9018079ac4d30096be464303f05308fb30926611d880ce66700e6569b60c671d795cf01cce36d824958172283f9058079824d30096be86430bf02304fa484196c150fc214936cec7b1628b29f448952cd41e78b382ba9699a38504605af14f8e1c935eb87ae28778109c2cc866c4efa4dc00f4f4947a39b773519ae70ed58037b02f0c9532941769220573b0f717fe41355f6958d6b5eef840d6e843571b2753a0e05be791a25d2a6421a7f618598dc5fc6663a0f73bf8c9f1f76007e787a3a22f4b05a1aa18f0520cfa004d912a48c7071fb3401bc830ae02900e099e9c8a5b1fe1c6f6991b0b182acb4381da03c8b126557a62f56e60eaa5ee028c3e1aaa377f1930dc25b09c1922d81f228007bb6ad6009db2ac9c08e0060cfb1152c618b3a19d86100ecb9b682252c6d92811d04c09e672b58c2263832b0cf03b0e7db0a96b0ee4e06f61900f6025bc11236ce91817d0a80bd9012ac5a7553d5e5395c5795dad7affe1ea8cd6fb3a73a40387886ac3ab011f8e74594289b3b27de8d90938b4a12aec0493684ab0100773125b8e0eb78c47110d76010a52fb10927e9b252643817039c97da849374d133329cc7009c97d98493748543329cdb00cecb6dc249bafe2619ce7b00ce2b6cc2392496383f0438afb409e7d058e2fc03e0bc8a12273fe10ff3a5f8e287a9314b62ba9a1253f557d026ac2a92adc9311d78df353662255d768f0cebbfc25b1bd6d7844fa9247ca248c1781a56c8d4d60be5cef5a9ac580c37e0480a9df37cd160b19e2d7180eceefc0d16167b3a7f4dd71362ccd264b689ad1357b9bc2221bbd4b9cb352b6759fd9c47aee5aed15cba468678cbadf32f67bc277f83301c56583312552de2ef4a59edfc2e74aeae6673407fec6ce1209b9d67f46dc8270bf9deea71e5a7f2459eb0d1a3538658e2153e5500b45b287e9738ff2f13a1919162a4826b5baa0d333244cb48a9b8ce9f582bbe0665e555d8b15158efca2cacd8647d8a78076e0a939168ed3c5106ae78b764f74a6b6a90e6baa84b6ba9f88d4be0ce9b10fde5dc1bd638cfcc149cf87b6a9127c52a93cf5d4f0c71fe73db2a0756b4520e94abbc96ca3375bd6a99dc5b534bbb8ebb64c29c5aad8e2c9e55655192db72c6f7f9281652f3aab4b46afbf038db2c45a8640ee061519bedbf9e87bb0c76e1a6ed85b32f7042de15cef7f52a1311b54c3c53ffff0170683eb330580400 serializedProgramBytesString: - serializedSignature: 11239c96114acd8aded102a3a5d0edc4e5339881ef8eee917c35bba1fee091f2f07c2e3e8e70766fff680cf6054ed1e54ce9d1f1b499a762691965bc8d37f800 + serializedSignature: 1b56b5bf622f7b0c941dff153798c86766f76066d279665637431280070f3f6a301d00fde77c4c36a193c229489541aeb9c6231fb26bcde474c220cdabd18404 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset b/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset index 5a77152..31e27c0 100644 --- a/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset +++ b/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9ce9721bc7118067490220445014c503bcc443bc20f10074583e9238d1659b3625d1bc9c5876288804293abc0cd2b652950750a5f208f9913f7984542555f9e3ffceff3c401e206f9074f7ce0a8dc10c16cbc55058da40018bdd99e9e9fe7a8eded95d346505bc9c59f85a17cbe2be98176b624b1c8a03f8751fb6fbf076f7bce34ba208db1df8ce43daac18f52989af69a70fbe1760ef589c40c96fc4266c77297d4514e0f702942dc01e1edd864f0172392d50684d3c104fc46391767a7c44ac53a16379cc41bb9c56f8be277e0fa905520a2bc952521abe5620e598d2f641692fdf53f12599b50f699b50a628f640e67392d89a02890ed9449b16b96d96db98dc76c2270e9f0cdbc7bc4b723fcecae1ef6b72bf093e49ac47fee67524e4f6b22c739ded639ebfcbfd56257f527e40b7a60735d473416ebb947abadc3ccea8dc6f53f2a74af5b4fcb7867adae5b65ba9a75bd6f34aee5f54f207ad47f54d8fe29b1e376f93e753cf371d35f8a699e54d56c91744bf5e45bf5ea9df9f14fdd4b6e31d1f64ba78b2fb64fa0ccbe31dc7ed904c9f65fb5067f38922c72b7745e69f63fb0eab7758b16158ca5bacc2c3937d89eda38c79974dd35f7c6cea53caf7b3f2de3e6ed301b80d18b80d54e7d6f24ad4c62d6d48cfd6c6a4f9df3efaa645b9be49457e9a95afd67e4d6d7544f1f3889b37e6f939c838e7e51d65ba78c7c635be99506c1d67c7713ba9f866d2d52dfe07458e576e4af1cd94dc4e8bf2f1695aca9950f2a594fc3925ff2ab38ffb745494b7d371257dbcdce7b11345ce98d0b7e7ab763926fe531f8e89bd601c13ff64767b76f27ab3caf14b6c3f00e7b85a8fb18fc41c8a543e82d8212f8e44961a347aa3d690ca2be91f4ca1e838cd540884aa3d81b0e5080468229a358a974ec42d71531bd1f43b29a6f77dface438e5d127aa3b28a7f545481caedc1bbc0c2b16338fe2145731890ed42cabc58842d967a06629fc2bb5cca3a54bb07215d41acc2f711c97b066a57e6f433094337b5cc32c87423cb7d38e2013d82fd3dd27085bebf254d0ba4fd021c3ba138f70022dd7bb07d49b555da5e84dfba3a572532bd8efa00d374dc0d633d373d006b50fb2cf5bb9f3cf2263c42d3d90dd90d5bb2343bfeb1c2133f317407190c1616a40c179a5376eca6c8523cb15c4130b88d9516eadbb7cbfb8eb85dd5163d1974f7205950f2f0dffeb5f0fdfb7f9dfa2c566eda2d91a5a977c8c7b46a60515ec6e9ad9050dd8458ac25878aaaf81d1d7e3a555c3943fc6ebe5dca17dc01719a99ca1de0e0e9e92a8d91fbe2114d632fa882c2eb1171974eff8ba2c24739149820cc9593a89faa26d04d3ad0ad670dda7f64a906baf5b55d25d0f8d2134c1a08fae96022d8ac234811d873ab04bd106c05e6da4f202d0ff90b349ee3f125909887ba51de5daac15b3072d3cb4b55e77be1b58525be593a38c5c2c77ae8d126835b7a25627a07a6c881f5aedae4de168d7b73d8e2da35adee7ff08a2515a56915482f3ca66b3b6d67ddfb9e40ebfe4a4662c17b1f2e7ccd291cf48eeb30f43cbffa4dae89ebe8a5decc1c7dba910b4fead2358f5c9d55a7d8a0e35642478f562f9f35d4b875ba31eb72cdadb28ba84e9c6238093a94b49a86926ecd5082ebe4418692a44e38bab347474215dc65167cc124b837a4e036138eb406c7a8130c47caa4755f48addb4d82fb430abe68c231a0c1f12a208e0e9d70cc3f588bd629b3e04b3ac1987f4833b439ba36dd6916dea91ba288d3ea190ef098764852f29037f8208fabe533ea20af1f8b86692ceaab30ce5f05d3987359e71f4438a2d54a75ceb0d9395d26c9a36125779b248f8595dc63927c35ace45e93e4f1b092d3a6ae3b11b2ebf699baeea4a6eb8a805db7df247caa0ec2074cc2a7eb207cd0243c5307e143a666722d6c33b9a2938cf3d2f55a9a49957969d8a4f24c5895474c9267c34a1e35f970ae0e3e1c3375c8f9901df2aa49eb6c1db41e3709cfd541f88449f88d3a089f3435939b619bc994a9cfdc0ad967a64d2adf0eab724627194fe5de129ad546bc91864712fc4c7b5e6cc0fb1042a40df1507c0d05f2144be065344c3195ab96529e561eb5545899305b79cd64e51d9d958bc23b772b3f0f339db7dd855f453ae63240dd319252f52f9d5763cae96a0862f57593d56febac7ecf60f51a05c1ae277765a88bfa2fc0af75e9e32d1f0fd7cb8f33268bded15934a9b456d54f3ba240da2d8a0205ed27e245159f05d173d6a4e7bb3a3def2a7a96eae47d6a91d81f8b55d012b9556b5de656571f3fcc99ec7b4f67df0721fbd387d24ff5ea4d412c9d3759fa339da5bfacc99377a1bf6cc9fe7458174f9eae95664db6fd5c67dba721bdb8e2ebc520d25539eb4012c7a120f6e74cf6ffc2d48a6b99fb16e8eadb9b9aff12f0761c5c0a7b48648b507e89d8e0deb1c8d2ca4deeb52ffd6fd3410df6412bac79156a7e4e1af8dfb4f3be30dfb4b32dea75ff869f156efbc2f2db7475d4bb2740679dbf4de67b5512d2224f1690a6a5acf366298e70f198f46a539656d4664ed99afcb5f815d6d6ac6f43c1af59bb021ed3b572108081f986706fee2f0d2f38cd6e8320dfdafcae32cd9100ef16873adcb5864dcc9d3a8a3214b8ede055cda65c27a55844854dd99d8539aa63e13e98e0de611005607f66c0eed904d6a36d5bab24628702cfa21ca0f15714d06d8912bafb36d1c5091d16cf4396687444c1e03cb009a7bba676f592c28e2880fb81c025628a7035d6aad7fd9db5de805539bf775044f512d43ba45659002394f99e2e8d349ae60ff97c9da9e85c9980235526500bccf8ccb1999a26965248ab0f4573e89b0f7ee4d166ce250910325e7046a3d1473647a359f2ee06246ec26783d07dc74efc4ebbc8b501a7668aae616e254d968d63a95a409c662c4bb34960c126f6b4c4be23cfea0e083e17b956765e7dc31ecca42d986d0ce6c78d04d362cbb406b395c1fca49160de8c20cc8b0ce6a24d98bd12660e3e476573eda154698352f2c27d28dd1aca2e5b28930ce5239b2887b41315ceb52e11f39aa4c5eede690beb28c3fad826d651899577f6608bb816f15a6bb55718de2736f1b64bbc450a9711ae271b03636be062b6c009066ec92638bc9fa7d6331a9e277a6d31c1907e7a1693d1a63c5752c7cce807492d0ce5f2598c9ade6474f4a31835a718de9537d952cbafb05944d9610b658ca15cb589d20be7bd968ad3cecb73162c5d6530d76cc21c1395c1122a7102448ab0ffb17cc2fdbc8dab4d0cf0ba4dc03d15add5dc522d2e89586ba9e30ce4678d02328a5d7e9081fcb54d90fdc27c06bf4c220fc5b7b08dfa797c8a01fd8d6da0b55d7a8876587f8101fddc26507b2bf81647586b2bf8630cfb539bd83b84e9ccfe4066b1062f610b9ec3e07d7116d393698939eaf37c3f03f965a3808ce23cdfc740feb65140de8a20c8090672a351405abc76640de40003f9cc2648bc17c574d745b443a37686306f132156c483f6aa773b4620b86966e09edb04c7cf7afceeedf182a08abbd52200b48301ddb409b4cf67542c7f2e60839e6cb08673d816ce698673eb2c2619d30271d4e3c74b0c64a1514046317e8c3390db36417aebecb576f07722d8bd4718cc9d4682f96e04614e32982f1a096614279e4e0673b791605a9c7cacc1bccc607ed548302d9e2e5a83d9c560feae91605a5cc4b006b39bc1dc6b2498b72308b387c1dc6f24986f4510662f8379d04830ef4410e6108379d84830df8e20cc61716e1ecfcb616472840dc2910d22e3b3c4e73e77d6296d3d801a1f095ca9ca436a9eb6a567d0b2f4ef85f86f42411e84af2ed3ff01b1afb9398a8ff6eae6a37a3cf4a6b334cc0370a92a5ec9d2ff3d9e67fb8ba2ec6fcd13b1343d1eb9069e778517c413c8e4feef3fbe62ff079416c1fef2700000 serializedProgramBytesString: - serializedSignature: 6561b70a50f56edbc55a808a231865bb8b12f525ac828b45b8889e63f44ca2d8052fa6a9470bf5596c5a1d7be553459745899feacbaf88386324d6a9fe58ea02 + serializedSignature: 0642b65bbf81b598eb348ae75c0abf122edac181a6d67e1bac8896a4d14563f6eadb54b97d64389f82de5f6b8e431e8f23b8b149797eeef98c2c3cdc35f56102 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset b/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset index 6dfc7af..1c22ccd 100644 --- a/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset +++ b/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1645fac7e70542e88100821a3160e1558434c42e4240446992805d08498068023185662fd87befbdf7de7b2fd8bba2a2a777de9d7776cff38aff796667f33eefbcf3bcefbb7967deece4fee443263bbbfbdbe7f9ceecccecccec6c9722c6ff45b6e2bfe6b2d9ac9c8d6173580d5bca96f0bfca79d8c07fbc2d3f7e166be2e122febb8aefdb8a15a63813fe8d8c0ce5bfa7f2ad66d6c2cf6c65d53cac13fb2b582dff7b2a3fb7966f41ec42febf961f15e9c64f9ac326b1996c061b12199c4262ae38a959c645c0af480ffe7b225bc9f7d60aa3e0224562d710feab82ef6916fb1ab8d1fe71fbb103845b0d7c5f353fa789d573cd0542b1c78b054cfcc1bc60880c07cbb0ab0c0fe6ffbbf3ff5fa06df06637b90d387218eb7b98dceec2fff7047df937d65e4f86dd64582fb5ff80b661dfb5727bfd00da7d64d82035bf44db5c33522cb7f364b8446ac1df1bc870298a5b82e2b0ee578aee0a45b740861bcae3ffa8ecdf48c6ff290d9f8679fe17cc4fe3d88d031cdb5d868df2efafd13684c3655828f7ff3989663ad76952aed3a45ce710b9ff2f689bb3edf28edcee25c36679dc5fd136849b283adfa06d0847a0746daf0fad8a0fad8a0f2d8a0f2d9e0f5d2f547c58a6f8b04cf1c1d7f91bda8670d30c7ce8a1d8ba5986e9aaea6d2ef5fe6e486fa4d4fbb69d7a5b30712f74db0ad9c7d322e74c254d972b69ba5c862b64fc77723baa842be5feefd1f17e3c84abe4fe1f94ebf9f13f2af1874a5fb8cdddb762edb3d1b781b271a5b27f95b23f5d1be1ef2d59fae5f22819fa7e1d26357f42db7e1e80f89fe5b67fad5e32fe17b93d3ac0b5c7c8f070a9f10fb48d6d3a42eeff156deb6c2af2ae1df1cb974226f255eefe84cdff94dbc5016c1e8eaedd93d0f5599404d0f5d3f148169f9f8e94e15132fe37e5783f5ecd0f4723bb4a03d85126c3ad65780c8bcf87c7c8701cf21defdfc6bb56d7b52c5696f134e8f135a3d3801fdf732db1df67395686c7caf87fc9ed6d513c84c7c9fdff56f48e93e16ac5ded5323c41b9de09c80e084f5474b745f1109ec4e2cb945c25fe4725fe78649b9f66be6f5f33bd4fbf31bd2fff517456337d9ec0d7dc8ea59f27b667f179e26485e1c92c799ed88169f3442f358d943cd17b10b1df4f23dfaf53146ea7c8f05485dba9323c8de0e6c7abdc4e4736ec1880db4e323c536afd176d4378868cff1d6d43789662f75932dc5986677bfbe1cf383bcf26ec3f07d9efdb749e62d379323c576a47d03684e72b369dafd8748162d378148fd22ee233da2500c70932ec8afc9818e0fc72197643e74f0a70fe64190e40e7efcad26fcffbcc2f940cfc67b77c140fe145727f37b4cdffee17558ecb47764cf1ecc82b50ae75b1d4ca91db03513c8497c8fdddd1365ceb5ce5b881e85abbc96bad53ae75298bcf4b83503c8497297e5de65d2b8f29c70d42d79aea5d2bffc1007c2f57f85e2ec32b58fc7de6c75fc9e2f3ba1f7f958cf7cb6a9fd1d52cbe9cb902e9f8e7f9c7f9e7818edf7e4ec7876b9474dbdde3d075a8dcded463d7ff4e743c84d7c9f37a2af1d7cbf85e4afc0d32beb7127fa38cef83747d1dff3cff380873918f905e7e5aeec112db62105e8bd2f85acf9701feb5a6b1c47ac23f0ef719f8e7ad51d8dd246de98bb6119bb6f4f7e37d361125de67e3a7bf1fdea8a47f7bd94cf7b6bbf965cf48e9cf4fca71d7a01074fa8530cdd3cdd737b3f8326206d3e66b286ec4f64c6f7fef7bd1f910dea2a4a51f7fab9296b7a078086f63f1f58f7fdeed4a5adf86e221bc4339ef0e19ce92613f16dfeeeba709715b684f967ebde3f749ddc512fbc2ee467177a13808ef91d7fc0a6d73b6834e557467cbf05ee9631eda86f04e19dfdfb379d09532be02edf76da8d4a7e7e075727b8e0cfdb2f43e167f2ff543f110deaf70bd5f860fb0f876889fc7fdf6c6832cbe9deed739fe33e0434a7a3c20c3bd902f7e9db3378af3eb947d50dc4332dc17c5f9e5f27eacadcf60c834193757867dd13ebfde3e8069fb44d6dbdb10b7be881bbeee81edd4ff5ed157d3c5e7351fb1f1d3a20ac5f9fc17681856c7386de0c7cd5318c2df3532c4edb364f7d53e327cc4b3393240897f54c6e72bf18fc9f881e8383f1ec2c7597c1bf811140fe113cafe27582cff40f8a4c2763f140fe1534ada3e25c35a192e94e1c3f23a7e3b6c2f16cbcf103ead5c672f257c46d9bfb7123eabec7f06c543f83c8b2f3317a178089f53cef7f73f2cc31795fd2fcaf00516df6ff38212bea49cf712ba1e842f2bfb5f56c235cafec58aceabcafe57114f085f53f6bfa6ec7f5dd9bf06c543f886c2ed0d19be22e307a36d6cf75b2cbecc7b4b8675327c5bb9eedb8a5f6fb2f87cf5268b9557ededd39e2fc37759fc3de6c7bfc7e2ef313ffe7d167f8fbd87e221fc80c5df43efa27808df51f62f44f1107ea8b0a892e1472cbefcfa10c543f8b1725eb512ae55f67f8ce221fc4461fc890cfd7ea44f9534fc5486c365f899e2d767325c20c379caf583a6975ff7af93d7590f6df372bbe05ee5383ffc9cc5f2c841d206edd8594e24e28d4bd672e68dac4818002301e90e07fb67a61e0806e9eef00bfe8d14976d612bf9a9b5bad1d83962acb78595b152ed68ecfaa25dec5fbd5cfcaee247d409d12191844b3c94700930ae9effd4a2a1e4661e3f458c44c360721ddf33863f00d589b3e6b3125ef8efa7a8cce597ad67ad7cab92ff6e147af3b9d98947a67209869dd57366734d6f54bc81c7f8401bf976bdb0b042fc5e262cad15d64fe5712d628c7e092fc227f27085b85aa2ef4dfc6fdd352b2532bd8dfac1712ade1b82f7936912f706ac2f12ed90ff4f918e481140df7d48c4bb0dbb1589d6dfc90929f1ff0cbd42063a7ca64a8d12812c121757ca8a449fd0ec0482c17d4cf4509fbf3ddee3d8d8a4bee8c940726f283c88a5f0c517ddf57a69e48c2539f1ae95b122f1f85190c2b56460412f2a6aad202ee4e4742b064355fc111d7ed145509145fcde7175e2b8e009d05d547ef1091089b655b850b22de24d5c98ceb454ec6e90e6cde2db75c225fd31fed4a82a1e824b09a9590c97ce15099258dda6728a4a922eba24e991ed24495d06254b921e6d7ec59204fee909f62408a6b28122d8554750b4dd6aad129cc3e3bcc6d264b1b74ed4b07e1d0c768317c98e0276d3c5a4ba5671fde494a14ba8ab42b9a897dfdc346f4d2124a1f22b479fa4bd4592da31834af66eba64ef9dfdb2ccbbe5eb53548cfa248516f8c60937ce51e3f594fb92454f721b2882393a82a2b3bc328b0461df52a102056f7086d093374a65a8079827000e4d702eb50914c2ee3a84629c665187943d3085175afe60f958c3e54f7f5df923fa514725b9f133b3284019344024ae3d53a82c90abc902c59005f235bc8afb25fa239deaa93805fe1097eca1bb24147d03b5e509d751c5fbd2e23d29f14106c47b51e2830d88f7d6dd8ca243279b0f17156df3e0839765d0cecf5328fcaecfee4398fec120f9e5a94cdc47972e1039545bbaaa899247274a5f2ac5d7d7a638affb02a4783f4a7c0303e279baec048560647fabd929b113d0ff6b223f7731f76799e8d969958d29f5f8e4590c5e1018ad90d1e7b00291c30a99ae2b33984554aeeb4fe5ba8d32cd750328e561992ae7eb7285b85cc7d7f865866b7c78b923a1c61700d2ad66835b14ab12c52fa2b22f64412afbe056503976a02ef545e4411d92fa7bf26b54892b36892396caf6abb93c305c9707c408ec9824f44dd8a5e48442517eebb3c308911d6c1b44658a41bac2068a844d34ec8af37d5f62bf121b7f8574013458773568b46daabb5aafc4ab1197ec4d5f723daa9addcc40353b44270e2ddccd5962afd2effc5f82784f5a7c28253e52232ee68106105f9f128f6ac4af0d28be81aea411699fcdee8d99bccd78902c49833767a14328bdb6c6964cdfb591eafad42db9a18e9ec8c6475ba597eea0ef14f1ee6f6d9c7ffe75978a22082cf247fd66f370a1b0a256f64da71e2c4e9e32a3daf8a0525ddc899359fa43d7f6bd806963bd0ae876c068916fc2653395270b74c505f41e40bd9530a20139781eff29e6ffc1b2642317f3c43155cc7ba33ca194c9a54b998d289b8a74360d43364d9515679dd85dc756f103528db004b16c1855b816eb0ad748b0c275634abc4423fe4640f1429d383c7bc0fb6a193d7b0ca7eae1326d3d1cacf7640465f6d84ccdde4457180fcd765536493ca02e68674f3dbc23365c4398b15f89defa71449596ca0eaaf8d8944a9f6d324d9fcd28e56d3355de9c52de2e53e59194f2f6992a47a99b6c070337d91654c1b3a3a6e059db2d58c1b32525be93467cc7eec1c44769c48b440b38fb3337da374a0daff40dd1a59ff6f61dcf924dbc083a46bd952e6980de2e1aa322ba4c359e4e9ad154ba4fd0a4fb8301d37d0c65f9440a6700cb8b28cbcb35968fcd0d667931253e49235e1f50bc84129fac117f36a0782925beab467c5a8f60e26554f936c540f9369612dfcd80f8d694f8548df8d6bf9dbe6310f17194f8ee7acb03f5716c4325e81eba3b3460826e4b593e4d6b79b0de99ed28cba76b2c9fdf2b98e5db5396cf30905b76a02c9fa9b17c4d40cb77a4c46769c42fec1d4c7c279d38d4447bb6ed403d7cd0c2842ab88ba8b6a0451d8d408d40f56c568ac74498eab650545c0dede8074df06634edcdce5422576a127969feb1db0749e4f194f81c7d0eda2588f82e5422cfd524f2ba3ec11279824e1c8e87b795a86edc34a60d24e9c69d48f9b3b7c69fc2bec1fc29a752621f03f7f224caf27d75a55040cb27ebc4e15102de53531f2522411e2576a5ccde5f63f69501cd9e42891fa0118ff60b26be1b257ea046fcdc80e25329f1791a71e01b447c774a7cbe46bc47ff60e27b50e2551af127038a4fa3c41768c47f0a283e9d12afd688af1d104c7c06255ea3115f971f4c7c26255eabcb2d038389cfa24aad85da526b9740f5c79e94e58b34967f10d0f2d93a71e84f85b73b137a6ea1f510eb936de6554153db1654f4cdfca79c1f0ae3e50bf94f909eda0a8a619d866159d93d3b07615849313c48c3f0ce41c118cea1c40fd6883f3b3898f85c0a4bbd366b05ab10f7a2c41b0c88ef4d892f3120be8f4e1c30c28aa776da3dfb52fe341af0673f4afc1003e2fb53e24d1af18ff3a6062a9e0ea0727fb326f77f1730f71f4889b768c47b0c09263e8fc2d26a80f97c2a832eb39641ab287f961bf0670125bec280783525bed280788d4e1c1ae6b05868467dfcb594d9876aefab979e0c62f6424afc30bd78a09b7611257eb816f851812adbc594f8117af14096d751e247eab34a20cb0fd289439be528a6690dc1842d18d93f446c42dffe1c5e17d4c80962f1ef0d0669091d4c65d8a333cdb0f594f231992a3750cac766aabc44a35c24a635c11d92fdb992ea5c227373248f63e9ce735acda07b0e06ea6c58498d3e2dd5a531a4c4f13ac3d5245e4d277123754f9fa0bfa70315ff875039f3c44c73661365f64906cc6ed689c36c075823403f8540738171f4055a282ea764caa595e272aa012ecb282ea719e2b29cb2fe7403d6afa0c4cf3020be92123fd380f82a4afc2c03e287eac4e17858b3d7cecb6f87e92e0903d2b01c70a603d28753e2e71a103f82123fcf80f89154329f6f20998fa2c42f30207e3495872eb496878ea1fcb9c8803fc752e2171b103f8e12bfc480f86a4afc5203e2c753c97c99b5643e81f2e77203fe9c48895f6140fc244afc4a03e22753e25719103f8512bfda80f8a994f83506c44fa3c4af35207e3a95fbafb396fbcfa0fcb9de803f67eac4c1981b74fee4a7e34a217db5b328576e34e0cad994f84d06c4cfa1d2fd666be97e2ee5cf2d06fc398f4af75b6da4fbf9942bb71970e5024afc7603e217529ceeb0c1e922ddd5e091109617cee891f0629d32bcf07a97ce8f4169e7df11f4252fa19cb93b53672ea512e51e1b897219e5c7bd99fa7139e5c77d36fcb882ba4fee37709f5c49893f6040fc2a4afc4103e25753e20f1910bf46270eb7ddc3ba143672db5d4b65d74732cdaed751a41e3540ea7a4afc3103e23750e28f1b10bf91127fc280f84d3a7128229ed465a04c8b889ba9ab3d65e36ab750e09e3600ee564afc1903e2b751e2cf1a10bf9d127fce80f81d94f8f306c4efa4c45f30207e974e1c063f60f9fd4c063feea6845fca50f81e9d3094c4b0307e4625f1bd3a655854e095744cde9216be8f4ac1350652f07e4afc5503e20f50e2af19107f90127fdd80f84394f81b06c41fa6c4df3420fe0825fe9601f14729f1b70d883f4689bf6340fc714afc5d03e24f50e2ef19107f92127fdf80f85394f80706c49fa6c43f3420fe0c25fe9101f16729f18f0d883f4789af3520fe3c25fe8901f11728f14f0d88bf48897f6640fc254a7c9d01f19729f1cf0d88bf42897f61407c0d25fe0703e2af52e25f1a107f8d12ffca80f8eb94f81f0d88bf4189ffc980f89b94f8d706c4dfa2c4ff6c40fc6d4afc2f06c4dfa1c4ff6a40fc5d4afc1b03e2ef51e27f3320fe3e25fe7703e21f50e2df1a10ff9012ffce80f84794f8f706c43fa6c47f3020be9612ffd180f82794f84f06c43fa5c47f3620fe1925fe8b01f1753a71e851f807cbb047e1739d32acebfb2b4ba347a18016fe42270c73afe12b890933bae16d38fd4cd9d88727c688b5cb96b246b97a9937ff1b24bcb3606f2a8d748e9817374b38fedb02416693ff8122f09b8e00bc6b8caf8b3f0a918ee7d4b9c9f698f2f44bcad37fe93cdd59f134febad857482b58156f259bc1f72e6230bfdf5bfa35b9ede63cfb8af2ecdf3acfe690b918cf0a6f7f3ec62ae91d638ac31f290effd171a8159bb0c6a2bfc2225e5fd15b8109de0758c8aae4fb0053db8e9ccc96316f0dc7d9c28b5aeed73271f418e94f2ddf374bbc3bb048ae983857e41258c970813667e36f3bc5ef49466bae580db12610a73f519cfe4be5179b9c96f063e1ad60f0087463e72427943987af290ebfeb3844c9fb26fe931f9e678b440e98c796272df78258fb67ca5a58ca2bc1da496996d4d398f75e76a558613fb154ca7629fd17cacb88cecb19697a3945bcc5e22fcdedfb3a93ff3db9ad5ceb68cfff4a79de45e7f958c5f37271bf79f7965f7a57f238bc1064720fe3f7e1f38278f10de545579d177b285ee0ab26cba5c9532ede677a8fa994fb1be573379dcf53d2f4599f673bdad7bf53bee6a4e36bb0fbb3a3efc86f295fbb6752e24e0e59bbf83bcacb5c9d9765642d385da4df62de0ef0eb7658fb23552a9aa91bbfa77ce8a1f3616a9a29359dc11b8fd09a6f14a9559da46ddfbe546bafbf3f50fef6d4f95b9ea6bf9344eb0cbed91c061f7fa47ceca5f33158ebac99996e9dfd4459db5b67ed78254562ebbde2f498c0dbb33572fd735d7ac4cea2e3a93d417cfb99f2ad0f5542a4d332499667680fda9b3ebf503ef4d5f9509a762907de3567a58cfb07e5413f9d075ba795c3627d17d38555ad1a5f4ce7a65f293ff2747e4c4ccb8f0ad1d269114fdab16fd277d4fdf24fcac3fe99e5b5ca345a4566f2da6f94070332f360024fa5ecdc2dffa23cc8d779302ec0fd5e2f7a731a59312bc98a27ffa63c19a8f324dd1edaf4ee98ecd6f8ffa13c1da4f374db343d4da78cb3e1cd7f296f06ebbcd98ecc81894be9c6f730d58b1aa8999f55215aa8be0fa95b436581fcf99df267bdf6b7c7ca145f5618a30f9d625a6b8750edb1f4ee7fd84e6ea5fd9c15a17c1b6a2e25923f9706b1b60b65edfa993caba46a1b673745ba523e6ea0f3719b76dfeb8de25e8ff7daf47dde8df265439d2f7b07ca5ded194f8ad749f72853bd2339148d021d8deddb9db23052d4a2f42fe895741f990ce25177caa38d741e55911ee9ec687f2aebd4821d6b2ac573293ec3cc95aeab8c953c3d286b37d659bb202d6bfd5e127fbbbd656bfbcae374ec0b42a82745a8504768543bf2bbf9d64b2fcae6e1a66d3657cff7a66c1e61da6673774f1fcae64d4cdb6caea7b12f65f3a6c19e6c53d5485eec72f1ec5463a5a5d18ff264339d27d3db411fea20afe7b13969e942d528766ae03ccaefcd757eefcbeccdbf98c2329da742cf540942a43f4564642663dfc95afac9e6d4b4f7ce1c407911d579b139999fd5d984b136a2294bf3294bb730636962ce68afa503294bb73463e90263960ea22c1d45cd5c09dae368be1d66c6f3c194e75b653a827c88b8a3b3d15bb71ee5c368ea39cf2b932bd824b6077fdaa81235cc1c06cf6ff5f209dd5b43d8ab879ae5e975b22e4db72c4ae7392697ff4422308d7bb228eba1af33f695e46656243e545edc6673eaef5783050ddc2ab872655b4d90faabd46338acee5d98f76f64044043223702b3c4f598bd7bb25e7aeed5a3406c8aa8b36a452d53cdb7e19b227056badf3fd7d5896350ad88bd4bff1be7ea573823915ce991afc5498bcf6f77364f8b20553790a9daa5487cce7b543b73536a2b8ae16a5df57928f143c7b835a2b3dd1398c1bcefb18b9b046ec60ad195863f219ef24aea9ad9ea95460b814a2990526e0e1a5cd4c9ad2fb297d7cdd9c4bce96f5f7234b9395d8a21054a6c62822ff9404954ccfcb9cc315015625e5993c86d50daae4ac7db10c07bb65b0c5ea94d78fd4405175bea7fb6d2b5e702ac0ff262b0ca6cc2ea9f90d3dcbc35e7f788011b9bcddc354b19127001d62094bbb6b609ab8f10805c3541ce30752b57ddda3b066a9ced7a11e7aad850b20b98eecc8f61dac626a6eea2b46a16c579932379089607f2e16c6b134ebe80036590d785542ea7712f128f69b1077017a031046d3b9bd0fab69550b12736b7caa80f7263a8b6b7890a5e1086b63b7e59ac92ef58c1ff6e15e6b880eb9dae315c3bd8aefb0097abf96a5a9718a81db3d1042d71bc09dad22b066c279bc07264ce9ac65a1d41b3297af6db391bfd0b6e3637fba3b269bceda21c373713c7225dc0756fdf18ae5d6ce2eac9fc961574f0faddb12e203a15f5584db0df6345353efd7ed225f25179a513f0e0c3bc3ebc8936e1f56289dd7dae14edb3bac7209567f31179765bfe7201d33703639826d96e76c6e725b79efc7eea130335d926a8411a502e3fd8ac4137e2aef64b2b28ea2789e13297eac307517d38255bfd0a55ac49467b12d54ea03a0af52bec969d07653741b5a0879ba9d91dab71b35d3556b4db73731471f5d5b9f60fdb07a34c4f3080c7a4c9bc1a6814b1a057a34e3818c60f099de5bbe30903d1b43b86a3815bf1d1841ef928f1b01425ab8d68924901d1a4bd68d1248ffbd134ba2ba34a4f4a346951140d3c2a1f251bf6d140ad8f688ada249aa2173b9ad6286f34ad8eb868d231bd68d2e6a7ce0e5d9e4add3b114d390c9b78843a0d209a64d02d715fec692336db4b3f4bab18667bedf13f3e11ab1826624d03085f48085efd383d1bb366aa25c096a4f316b755af5f9070fdd9fc065c2252a4416443ef409d253de36acdbee93897698fc40c9b28874a948b6461b284d52b30b1f950648cb387b3a72d9c1311ce9961c259ea24ce1908e72c9b3887489c14ccf81bbd945737eeddea6720987b860966898330cf423067870966a98330cf46302bc204b3cc4198e7229895618239d64198e7239873c204736b07615e8060ce0d134c8b4d236b30af4030f70a13cc6d1c84792582b9779860baf848791582b94f98606ee720ccab11cc7db3d1d551cf0f0290d392c274f1f9e71d8472bf6ca04c2f5fba88b211a1dcbf2351c6bf686b11e596b650de8b501e607bfcd8ef8bf7df596e6cebfbb7066ebc2d706310b8036d8283c1aed880c45cd11fdd2a764d175df855a2133f612e8c398405b610e62184f3b291f78a3b49de1b85c0cdefd80108bc748bc5f22fd716ca0284b22a3c63392ed6cac311ca0536510e63f16d456f11cb741772b4d8dd5b680bede5086db54db4c315b4de2a92c156b9b20878842dc0d720c03561076cb170b006f86204b8d626e081a8aeaf6a2b5127b15ab9865416ea7d6b256c1982b8303c5d1b254e5657c722988bc204d3c5f1c8e310ccc56182e9e278e46a04b32e4c305d1c8f3c01c13c284c305d1c8f3c11c13c384c305d1c8f3c09c1ac0f134c17c7234f46301bc204d3c5f1c85310cc256182e9e278e4a908e6d230c174713cf23404b3d1264c7f627fa9ecb2f326fc67e901b2b72d7cf311be43c23306e9e26d7d1442d9948ddb3adda9d6166f6b6b13ad4b10cce630c1b49833adc12c46305bc204d36223dd1acc2d11ccd630c1b4f8f8680de61608e6b230c1b4d848b706b308c15c1e26982ebee9331ac15c112698163b83adc15c1fc15c192698168729acc11c8a60ae0a134c8b9dc1d6606e8c601e1a2698168729acc11c86601e960d98d4d499f84f9a58bdcdf36cc19c8c601e1e2698162b206b306b10cc236cc2cc1302b0a408ac2fb09c47c2677b0e1626d73058f2c21abc21b6e0f546f08eb409af8025f611a5f3ad4eab55cf005b584f47588fb28975008b4d80a9168bb32c650bf98feb935ff643008fce46df657a33355d1cdfa940288fb18932f8aa1b2eb62a7740388f0d134eab6f905bc3b907c2799c4d9c65a8a4f4c37206eb03358a72b356bbf85485fc0439985b239a4bada2b6f72e0b0b4c2d66b5622f684298b0eead0345c43c9408abb3555d01381fb3ebd5d5de08e0f136016e9876332afe6d358b45c36a5b50ef46504f0823548bcff1d6a0de85a09e1846a8161f41ad415d8aa09e1446a8163b49ac415d82a09e6c136a3fe62ded592f5e16f40c4db228ad03d5d17a08dd2936d1c17a99eada9593c44b2c550e3eb57747d84eb5890d5ad39d219f7543c04e0bcf0c23179fd28f44284fb78912160d2e67c437151c98d5d615813ac32628ff3d72b8f04291e37c6d78abdc1ab81c5be0180277663666539674aad994fb207c67d9c497cfbc55bca70a8126b93239743f54f267e526d105014fcdee8dd4f44708cfeec84e5df7270a0c4128cf09532fa4d5579dace1dc11e13c374c38adae64690de73484f3bc6c8c6fa7d72e1cebe4abcbf72398e78709a68baf2e3f80605e1026982ebeba8cbf0d7e619860baf8eaf24308e6456182e9e2abcb8f2098178709a68baf2e3f8a605e1226982ebebafc188279699860bad869f6388279599860baf88ee31308e6e56182e9e2abcb4f229857d8eece9dd086cb3d503d11a82bed8ff279534f621fcdcbc2ac1d6bdd699b237457d9ef096f14175e9630de670d5ca12d70f908dcd5d918aef7d7ff8b9fa14b97792e7653dc89a05e139eb140179fab5b11ca6b6da21caee44f98d708273409162053258cef6c79f51504f83a9b80fdf5296128acb3ad4fb93d8278bd4d88ed7f75c462d785b54928e720ac3774e4201996b35a8e5a5bee7b36427963c7a274bd4a1a8750ded491b5fb2431febd80f9eb5a594339ce16ca6508e5cde12b37cbecd6e985b6b09e89b0de129e9bddc5ce8b5a84f2d6f0f4049539d9d6bc0ec1bc2d4c305d1cbebd1ec1bc3d4c305dacd36f4030ef08134c17876f6f4430ef0c134c17876f6f4130ef0a134c17876f6f4530ef0e134c17876f6f4330ef09134c17876f6f4730ef0d134c17876fef4030ef0b134c179f80ee4330efb7097310c31f2b54df0873bd8bb81c617cc026467f5d8192844136b7015623800f7664a786fbdfbedd00a17c283ce3932e3e853721940f7764ae8cef0cb6982bad75066f82503e928d5adb1fea5d2c5e2fe95cc3bacf22988f86af677dacdddbddda88e4d108eb63e1e95977b1e4dc1aa17cdc26caccbe9aebe2f8cf8508ed1336d1067f23d2c565bdb741389f0c134eab0317d6701e80703e15269ca54ee29c8a703e1d9ec6bc8b5d1dc72094cfd844e92d7ad3cc1bed2bd9121159c70fb706ccdab4eb1c04ecd96ce43dbf0e9fd8e91aeccf2194cfd944395c731b7bd3fe5b197c6c7d771ec242a09d6d99882e08f0f3e17c22b238726eed89e87884f5059b58fda5748a59675a4a6702c2f7a24d7cbd187e71a5821f5ac5acbe2655680bd92084eca56c563a133a5da5f33442f972989ae2563fd26aad8a998270be12269ca54ee2ac4438d784a7b3cdc559443b2394af8629679638f905a8ed10ced7c284d3eaec4b6b380f44385f0f13ce522771ee8e70be119ee92fe39c6c22bd8b60be1926982e8ef9bc8760be1526982ece597f1fc17c3b4c305d9cb3fe0182f94e9860bad8dafc10c17c374c305d9cb3fe1182f95e9860ba3867fd6304f3fd30c17471cefa5a04f38330c17471cefa2708e6876182e9e240eea708e647d9184cf3bb88ebc5e155125e7a338c2c36e40b6d01be1901fe38ec805d9cc2752902bc361b5d22fe5a70e59c44b380d7c0bd842f397b03c359f9aaa3b5890a9b219c9f8467928c8b8dfb1508e5a73651820793f88e26793bbbfe49ad5c04eeb36cd4f0b1a5cc3adffcf63711cc753661e2cfb436b34304ba55b23474f975aa0508e0e73601962280fa8f0d4f104655fdcf7d6a782e4a822fb259202cef8405c23308e61fc234865462f3d9deda18d22484f3cb30e12c7512e74c84f3abf03cdd6fede4adfe1482f9c730c1747148ee7904f34f6182e9e290dc8b08e6d76182e9e290dc1a04f3cf6182e9e253fbab08e65fc204d3c521b9d710ccbf8609a68b4372af2398df8409a68b43726f20987f0b134c1787e4de4230ff1e26982e0ec9bd8d607e6b13661ea3be55be441e620d9eb5d5db2308de77d918bef07b8a3adff72e5e4028bfb78972708a9b3abe8fc81ac8f1b6401e8e40fe1016901673a435908721903f8605a4c5a76f6b208f40207fca4615e38d09758ef1a02882f7737846c85decb8588e50fe6213e54612650b5bcce06b55d484984a912be1cdb68542acc16e4959610bec4e08ec3f6c82f55e968677cc6be468a5f7b6b93564d6de2f1f8c90fd6a13591f2180876d67cbcf7cb9f829cebe08db3fb3511a56b374be3c65b19d68edd9652384f2b78e45e97ac5b22d42f9af8eaca3dd5f6cb419a1fcb74d94edfff2948bf382cf4358ff938d67197fdaeaacb6a677ad14aacec6dc206b1356472290ffb50932fe83c6b3f9812d6286a5e50f1a8fb0056e2002f7bb6d7090f3a6ca9bb94ecc4af71e066b1ccc717d1038582c2b6425e258bb158db559bf8722ac119b58fdcf2794b6a1ed4c9f4fa84218bbd8c48897195bce0fa861f074ed3abebd10beae36f1056b84bb385e3d0ba1ec6613e508163f16e37d85bc42744640be9c804076ae319a8711e21c9b88f3d1cdbe50d4dfd0cfd319be96321621ec6e1361f0e9d02e2e1e5a8a70e68609a7d50fc15ac33907e1ec11269ca54ee2dc0de1ec6913a7fa29057823a729ed0e0d17dfc3bd09a1ed6513adfa8e4e65275ce3fa6504b3b74d983dc5a57d58d65f19b506ac1702d6271bcdf6f406655d6cb6af4228fbda4499d833b954629dc6fcf71b5dee991c8140f6b309123aa400606c1cd17b1b1caee01eb601085b5e36fa814a3a653fd0be0863ff30b51c4b6c4e71b6d672dc15e11c10269ca54ee2dc13e1cc0f4f379b8befd88c472807daae66e227ae5430eb1f47b086ad1fc236c826b61e7c03af153495d7ceeee1ea81700dce46f947957eb0c6c55291e7a0b163b99bcc5a23671dc2b95e98aa93129b65a0b5ea64178473489870963a89733ac239341b7d39e93d4d6fe3645fce6708e6fad9789ef19fa713570b72f9697a538471836c6284459460ae4fe7c05888306e988dde1daae1edfacb485b2190051d5946aa0d228b8f83d672e5b508e646618269f105626b30ef4130878509a68b0df58311cc8dc304d3e2a4676b30eb11ccc230c1b4f812a735980d08e6f030c1b4f8c288359887209823c204d3e2124ad660b620989b8409a6c567716b302f4230370d134c8b63dbd6605e82606e162698169750b206f3320473f3f0ccb970710c67254239321b286393a73adbd4a99710ca68366ef1f44616ad0e535883b910c1dc224c305d5c40761182b9659860bab880ec620473549860baf8ba7c1d82b95536a645e39a7c2ee751cecdae1180fd70223f7c313f6d1983f76be1bb3a56aba3025b683f47684777ec4417bc3e86c55c6a6d7d8c8310ca31365126ae16d4b9f3e886026c6e8e22be6b8278b9786681922ef699a1661e3f85c1ccc95ae6ad2630460c95c159f37979b81fff09961a07f01f5d7c442c273699ad1003724d42af466837f0bd6059332b8612a60832479ecc1cd1480e636865a2a898f3ee41c2f33dfd78f8a2c34ae6ad8009de44c5bc27989bec1d19ff71a5688a8f2f45b5d37f3c9b62f3eea3c43cfca8f0b8426432c872cbf9f9550c3aa5c1fe1a061f1d8ba678bf3eaa99b7159b28acdb1b9bd51515effdc5063ee70a8aad22df4e171a5542a5491ee959d12262aada52a8929fdb246e105089269dae0cd930223e25542152a19a5fa756b0a8914c2af97f6f3d95a28df9611158f8c4bb3dc7b4dd9863e477731ae4961f9f5a13f25d72b562c85c117dc9536fec8e49e5919f7f9bc4db98d5e24686d8549ea6f68fbefbfa244995a242488bceec7f09a4bb4c76914d8744602db2393ce53df15a36931f5c238c827f39ff075461c0d843090200 serializedProgramBytesString: - serializedSignature: 22514f2d59117bbe02d2e63764dfc13738a5e0c9b0c17f8994c0e58eb33a753d2012391235016f5de1130877ffc7bebdd994c1b47349ef6ba84eafdbb28f2809 + serializedSignature: f21716b88355f4f3cd25bab3b9325ee308a3ff28cce302c4858054027676ab48c6e5234135db858ce6ff20d3d0b45d9894ba9d0419534bc3ae94a3cd57eef90b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset b/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset new file mode 100644 index 0000000..beb64e7 --- /dev/null +++ b/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: c53b49d553e00a648aa3280ae05f8ddc + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5c59531b47109e153ab9c180c465e35c96631b09f0913b3187310ed80e5752e5a4300661e47028924c39794b559ef20bf223f207f243f20752c963def39674f7cea2d1eeccae16696045bc2a767667677ababfeee9e9999d2594617018d7e1b4ce96d90c1b676b6c9b1db203b89a81741f7ee69d95ff9815217d0ee74d78769d8d79d4c4e38a9182f302dc9558196abe645b90e6e9f90acbc1f502d4cdc11de6eec05f0e4a1961a8b4c666d923f690258d7e0f12eb54a9c4f30c94cb88c3799a7d0f4f73c4143692a1474938adc093123ddb07a6ad724fd83724d63e3cdb823a45b607349f11c5f84f214617cc4ca23c8df0b40bfe12fc3ac6d36e21af4bc8c3b487d31816ee51ea5f6c74adfa715e7ec4f6bc95e78ff2fb10af13e7d7325e7b25bc5e10f27a853c4cfb6cbcf699bc1ab336baed3c6d53f0dae183d74e9e8605be5a78da2fe17f40c8eb17f2304ddaf84f72feffb4d10df372176be0cfaa9392f03228e4a5843c4c876cbc0c99ed860a7e788918d443ee83cd6eb202cb10735759ed5dd9aae9dd899174144f785ca166cbd05d0a4040d293d6a89f96d9149b94f6a441a35de07b86ce9b50224f442f399bf8cdd10432b707bf9ce0064a903f4f5e041d411e9e8cb34548b1d65336011dfb898dca3a34bb07ae24c756e15c207a4f816d67492f91d065d8eb2c034dd3a3ed438e056801eef788c3153a1f11a739e27e01f2cae45f0fc0c34e43fa8a5a73ca5e846b599bab1c32398f72c7a6ca37dda7a5a6599006b9cf906dbed6c8596804a18f5ee2dd309cc13e62fcecd0c46b0c4d278303ce02a7314190195579932c4363d2b20341ff323a2594dbb789f76d76d355163932a8ee6192a0a2e117bfff7138f5d7df8b916ad1a6588686a8110fd1dc80457a6963c041c15d8448249c4546edf01b32f869a85c3945f8cd72792ae75f01511a99aa156060e8b548016899d8c2e1ac0883a84323d9280f0ed29221d38b3115ac2119acf1d386d5db8fb8c11a3f96ab022b1e7204130a04bd785021d8224390e2b66dad08aeb2253e9742ff96832765c8c15abb3c7f0dc64e940aa559030a6678a42aed8e315ae90d1bc6727cdb08df349c1bcda14a03618906b2d851da65fd8d2c2361e31c4b2ba84764fa45388cafb5ead719505b57d3507717043aa228e925d49705e0eefaeca8599f9da4cf31e9b4c01f472afd4565fac34edd25e9d8ffc2e1505f42adbe984c7d6da7ede01e810379c1435bff0eaebb6665f5289c9b57fb2ad5c465e8d104fdc753367ef90c749e16917255f259ed1ed2b40139b2a620cb90ee101798bfc5e316f7b6dc35d37b8c4f453319ec5bc69cb4c39c9514b806d38a3d3922b79b3eb29b60f1acb2c984caddf7cbdc3dfa900df865e16f8b8756785fa06b94c1cf60d0aa6a7b40d676afd0f62390c80aed108d3d42a604e76d5f1cb4c938c01e99949862164d3155d1bdbd9d3e753bed2a4907dd509e6808ca1daab687646df7b8a08c9674e41be34e55fbc33247ec837097cc9d526b3b5add6925b69aa3a779eaa0ce614155ce72774bb404fe923870778c23350f59a3e47ade654c0b972a27d22d53316ae2622d2a1e55abb847a662d2fbea29c61bf8ec90fb988313441cb84674cd3ea592eb6f8cf4977208e7cd824a37bd2add5cae5337175484dfa893709f8c302afd4d298e76ca636acafd2a96dfaa93e50115e1b7eb249c5461f14ebd58a4542c5fa993e54115e1749d848754585cad178b61d510858ed43144ae29bdabe85bc769183d0407b4416b2139f61d54dfa4de8af5f0a93795daca6c54798b6a5fe167441d51e1704d86438e5901ae15728a01a7b9fe832e77875e27a1cb5d382e39478104965826297220d711951ee7f2e01a5ef5dbed750a45f2707e46d2d9e51657edaa9fb8a1b50e2de47d8634a32a9caeabec45274e075076069a4289906ea58e3b42f5e3705185c30d190eef337115cb7d0dcb94ae4456b041b45f35549e18fc0c03c3ff3942aa08351f530dbc2bb10c85345956fb140edbde073bc39eb77a6ca3de13b371a67e99eb8c634ffa5ecf8b0799158e0b76284a57fb34dff90e33c625b26801d214e39d374971274f34ccb51aca501076ed84d6e4cd05da69b4456e43fedf6e98041ef225090357083698b9d90821ff965e637ab6e2b54876830858afbc1ab08b014deb2ec0b34d3177097ebf424e2c12ca22fa133a21ea609549b3397289efa09a01aaaf8c0a54933aa1ea3db6a6596a3ac787742cfc03a456576f06d0fe11409bd2095a4c00ad48316533c0c3a8fbc52236e2f71ae6ea4ff636d93928755118f08ad65a8b446fdb3e48d16437689cdf140799b4c44ad20ae79df6f058e99abb69258e92c73f598ca36efdcf439c2c8638b71184612b22209f7147a7cf18e01adee200965d63e7acbdfd7af6aa24aa7c4bac16e14ee25f12c2f0fe9e4e28f13dc59ed03daca98b36c8da7441d62240f6be4ec886b9f599f3a9032854db4ac61d7da08eea02755000f58320827abb09414d09a07e1844506f3521a80302a81f0511d49b4d086abf00eac7410475aa0941bd2080fa4910419d6c42507b05503f0d22a8134d086ab700ea674104556368af0dd42e01d4bb3a41c579f016edb1343753b9aedc35c19c282c0037ad1b38b4466c78876cd1a28d2f5db40117d1051c13809bd1099cd7bc5c645e6be74de882322a40397b9650562f71681cb1b575e77601cab9b384f2d486941e5d50c60428efe984f2b2649c2ed2a082c3cc017bc03fdd3c6fdd3e24003caf1360718baab82c57bd45b6f93a7ba700e07d9d00a257a90e7a2a5b1fb4c1d6a90bb68800db824ed8ac6dd9ce90e78017693e9b3304f01e0467acd63811d40665ab00e5e73aa14c4a0618f5fe3fad83c9982e307b0430178304a646cbd406669f00e65290c0d418926b03332980f93048606a5ce6d506e69000e6a3e00c3f1aa1d436fc7408503ed609e52887b2cc7619eec0d8b06d6e567fc6acd57b6a8b2fdb0460bf082ab01ac7786dc0c6d9b9d91f96c5f755cba271a495bb46d21e8bce69d7f999b9e1aa8763845fff2e51dd4de06993d2cae6ab0c7d49851b8ffc6c3b76a7e9bd330aff1340d490f791bd86e9b611bbbd6492d6b3f3abdd452b19faf6ec3ccbbf2aea3d94a14fe2261a607bde1ce10736b5ff3f3c9d6f8882a75ff3b39a02954436ebb1ef560a2d447a796a37930ca66d374ef6f56adb4e9dd4b6fd73f4a54edb36a999d1868df67c0dd2c9f56097b952aa40f650d93c6cf6f45d861f987b23314a41bc9ada5db87b4eb2e689ea3eb38e58c4fa2569abf21ad435bd0bbe2bc7ff6e80f4f088fc074e6674c883570000 + serializedProgramBytesString: + serializedSignature: 30e773f32baa4a4f1e16f2f12a51b69c0e0b41838b2db8b7101beddbd336b6d5e5365e6aa30902982035e65dbaf7f48d0a6b82b45211cff219e5554bc201a107 + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset.meta b/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset.meta new file mode 100644 index 0000000..6b5b3ec --- /dev/null +++ b/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64cc93137b785844886bfc947cc722a8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset b/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset index 85f4a25..bbcd4c3 100644 --- a/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset +++ b/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d07585dc97580e74954016a08a15e76a515bb92e081a455dd554108a1cad2a445850e4202c402d24adb62a7d889e392e2c44ee2249b1ea73a3d4e75ba9338bd383d9bdefba63b71e6cc9dcb3b6fde9c5bdee53cee550c1f6fde6d67cef9e74c9fb92c6910f227b5477ef4880ed12cea45b7181677c594fcd62cc349f9eb1cb9e7dbc58c0cc7e4e780bcb6476cf379127e76a5d6c9cf3679342be6e493f7c4900cc7d5f54e3122bfb7c96747e4119c1d957f23f2ae54917ca85b9c1697c525519baaf111d1a31e9ad5e7526057aa4c7e9e120fe5d511a51444d2a02ed5ca8f4e7965565d9b944abbf75d1337945993f2da907c66464c4899834a6259fb72a1be082728d7e1321d2ed56185be562cffceea734bf4b932fd1d3fef3e7744fe95c8bf49742c29a43ea08fab7478ccf2ec0a1d566a1953c6f595e859dbf5553a5c4e5c5fadcfdfd5c76b74f88c872ed53eba3ce3a34b4d405dd6eab014e952819e31f53b6a703eea705e7a4b1fd77a705eefc379830fe78d3e9c37e9701d717db361fb168f747075a5d261037ad64b572a1d5c5db706d4d53dbf4d87cfeaebd3e8d84d4738ff82f0cf3b253a3c6ea4e971274d8b0ee9e3c77478d2f22c9577dceb2bd1b3b6ebaebf3e4e5c37fd753bba6eea72c2b0e3846347b1cb6c87871d946fbad737086f3bdcf4a6ec70d37b2771dd4cef20659e6b57b3c8f685661d9e12d9be508ace43785a5f9f41c79257f93b8dfbaa75d8a2ef9f45c7f2feb237f5f1133a6cb5e8ba4b876d86ae6d3a3c8b9e396bc83ba39f9943c732ded28fa23483f0029251a4c38bfad97be81ef73c84e7f4f5fbe818cb2e329ebbacef7f111d635d2f19ba5ed2f26e11f2da0d79ed3a3cafcf3f30983c679c3f8fcee3f81f1af1bfae8f8b8df85b51fcc5c86ef77a353a86fb5e72ee2be947cf63fb5d9e2f67f3043786e7ca0e19cf9976baf6d419f21e1af23e24b2f38f6bf7a4c8b2bbec03c67d6ed82132bef2a4f0cf7baebe65e8b9a774b85b877b74b857cb7bc5b1b9dcb5cdcd4faebfba7e3d8b8e8bd0fdaeae2e834991c520e7be20b6b93ae0fa3e481dd169e8d0a97578431fd76b5b3f1142e6361d7689ec32a14b87dd22bbfcead661830e7b0c7e3d8e4e556f11d965cf5543f7abce7d1545c67d6ef83cd2356df073ef69d4e13543f76b3aec45327a3df480f00abaf78ad6ed75226daf7be8e6dee3ea76d3d0eda60e6f20193750bc58b72b04cb261df61bb2fb75d88764f739322addbc5c62c81830640cd032e6f530790c86e0316cc437acc321915b5fb9e188877cd317c60cf9633a1c45324675b8cf90e59edfafc37143d6b80e6fe9f3af22dd213c605c9f32ae3f6dc417247fde16d93e71db498be5c744a62c84f08ee5d983e81e5b7be71091566e3881641ef6d2bd38a57abb67654a0d485a0dca1828f58276cbdd27fd3be420ba043ee067978a764e564cd35280a557dcadfadc7332a59bacbde2f5a94aa477b3fa1c90778c2ba1afe546f1e19c2840b909f93b82baf4b3f27cab1a11804efdb8bc522f2bef71f554bf74d56bf2375b4a8f8c764236904664c17b4f4605f2faa5dab977fa9904dd7ff3990e29d3199d9894675ca0d3f2784269d8a93eef2b4d4794f66df2dc9c1a2b999259e8940c1fa8d8726d9f91df6d71766964761ded8314d4796728c44da6d3d21ad0be41e5fd4fa5c862a408a02f794d67c3a206558bbf2327253ec5d02964a0c1dfa665342a64a9ac734da241f5093a720886b731d742bb7f3bbc9f96959d972d763290dc1b950599149eeefae0968f6dfc786371b669fb4483aa4e36f998e60516e4d5a5d6e648f036a1b8b8280d8a9af85336fcaa5bde5940fcce7de3eabef00950a26aa6ec045043cc5df2cb03f937216f3e0da9a2ca3c7774ba533e7e4f0a006573d2290d424b15eadc8ad44f5d0af6121becb242c3f62f5dbc6097cddb95810d3f7682e504413f1d28824b6d0455abec3a2bc1dc6698fbed947cf69624715fd5ade04fb6669b37539872d86b30b5f3ac503cb7591b93e134a20817d9082f2b1ce14e9953cfcb6b03f2fe11556bc2f96ee519ee748e732efb4e6fc295f356650837a85905cc32dfb8ab747740fd9416db936e794ed2e51b1d9574c596a44b43d2adb0589f06eb571a8a971b8a83ce446425b6c82027aeb239b329b882165c6a73c0cac56910e45744c20c41ad41e093f2c7ee17d59ef579d802b2cc464f4d35f62e7af6cd2febae095c38d628925b02e6b0b0b9abdce6f0807bada54654c96d3a7d39edf4cb28e1b516e130aa1b4678059555d745ccaa9536c17072bd2507089bd6d5b4f02a9b274381947a6b413cd96f94a6552d9a181197656ebc2d9ceeb51bef5dd5b5068ddc6e7a870c479516707e488c0418ddf1ce171b6c559a2ae95baccd83c5b202e621972927b2e7da4d2ad7c64b67aa0c586e7378a8b060b234a70b0205439f2ec721fe2975e9b20c7ba4274237e4ae8c7f5a7e1b5077e4e48e523a77aca034d962d3a44669d227efe99387f735a136dd197aa0aec1589fb310288c1e2b293db6daf458adf568947fd04485f89d1c9abf06ab280db6d934588334c890b8a43d2a7f2d56535a6cb769b1426b91569fdd5207f0ce313d04073cc2c45d4d15c38f598ae154c862788d4d38e483c72de54f1a0cdb91c9f0663c9be8786a28803b6d00d79359ab4b25de90b8a3fbe7f966b0b514d4272c50add5bd07d45a0aea2e0a6a5d5e50d7d9ea509565bb59eb507ab8845a91e75dd73d69abeb54c65f9f634790d8609edcb7c3b65b554cf945405520eb292fdfe3556ca717bcd8de40e9b1d7abd84e2f60b1bd91d2a0deabd84e2f70b1bd89d2a2c1afd886d8c664aae71ff7662aeeb42deeaaac2aa3234275b1852a7c1aa9c2a729afc267ab2d1e287cf6d9e281dcbc5f780f47eca623db46c13c608309b6c004cc80ccd84ed936974715b1dd1627f4ab606a3b4abfea312a850e52297428af147a9c8276d8068dae739db1f5e88dda1d94dd4728bb8fe665f74eca338f519ee92eaacdc3339fb044d6a09a8b851cf4c77da5f0f5efb33687b6569ab052d736e0ef173f5561eeb22515b8d0099b8bc230ca901af29ed1558433d613c609eba8184fda62047f0823fd494afa299bf44a95e5ba5473634cfeba65d55de91361627d8aca58cd54c63a9d57c6da4d59d762b3aed65aa03865f18cfccc9db20b63f31e5bbeab2e74beebd40d4590133edfc1facbad0636213e72c29ef75a89bce7a70395f7f6da08aafee0142b41bf71a016f9794f5901dfddc660978a3b33291b656c0dd6366fcee1eefcd8d9b729f64dc27f146b21b4a752acde96ff6018f9dcfccd1983de280f378cdc60130e2514ac90367bc44b6ce5a2478f384d951c176c2507d4d5501acec9f223d3ecb8a8ba2603ba9c0c53563452b15fb4c5ee34849ca6b89f1670df8cba278c3e4d943e976cfa40410e331723e28e3c39a8725cd6e2861031efa362be6c8bb9ca9a0e5dba140813ef7e2ade765bbc6b3d53c08d3f3ff607284d9eb36982bb847328defcba844f537177d8e25e2570973063bfb387329f543848c5df49f99d1bff3d559be46ff9212ae62ebf98fb64c9e80c4a8027846fef1da662eeb6c56c6b91b5eb9e6498588f58626d5063a05da270ad13b8765749017ee1db27b0bf61b7594fda2b4858be5fa7f60e875581aaec8eda120e105eb56a6526ce153a718ed912470d088fb3260e4c048c0b585edda2ae8eabc9ac7acbe41670f2ba1b12e7a2804dd2f7941edec908db4b8275ef7a552aee55b9834b572abd9fb1a537a4ca359bfa6672f7d2c9fdac4d30f4d0af07117c9c167c9cf2d01b513df40425f96654c92729ca7d11299fb20986e2b45f445f2cd06c130e49381031094f53a007a3826ea1240f45957c86923c1c5572ab4d323402478260aea1059fa5048f4614dc4639c65844c7384741be1515f2799b64684a8c0751d9a3cd7181ca81b71720075ea484df5900e19728d81351615fa61c6f32a2e3b55382a7220a7e8e728fbb11dda3c32618c603a68308f698cee8a452ef85a8a9d745e5ee9988b9bb9bf2e6d905f0e61e8ac75c541e5728c9f7a24abe4a49be1f55f2f394dbbd18d1ed7a29c10f220abe4679ddc3885e779dd2f8a5881adfa004bf1c51f04d0ac52b1151f451fef66a547feba7547e2da2ca0394e04f8b2878904abdb7444cbd214af05b230a1ea6507c7a44142394c69f1151e3514af06746143c46a1f8ac88286ed90443adf336619b34b26492565af838a5f5db236a7d9bcad79f1d355fdfb1498606d7e70451d9a3c13541b9c63b22bac6a44d3034d03e5758461ea1636e1f46c173ebf56a4414e68761667552ad7219d77bf8ddb5a6de12e02e3c4c943d4017a6413945d9f74e9b7d23c29d3b73e7bcf08c57669678542def84a1b4b6f93b33f3681dca8a1169d77d7577bdb60746c4b35f77d8a3c6a9c7e7674c4cbbf132bfec2b5eb47a640c300e1f86d35d8ad3bb6c9cba9939c16c7bb38c0a2c02b99967bc0945e7304d7178b78d432f2387d6c8fe427b4c18222f5044de632302b38638d66665ab63975b3274c973999d655e7a9ad7324f85b16086b2e0f36c16341b1664e2cc2ed7a0cc7a413e32a04a3728cd686de9f30b55cecd52367e3e558efbdbd81223fbe628fbbec066df19c33eba76f24fc56c7f0ceaa9f95b7a8fb2f40b6d96ee342c3da9d69dc14ca063a73b337d41953563f2fbad05ca55f7293ddf9bbfc75d5065e4ac2c219cd9d4c5f4b81729fbbec866df91f99a207b2727deed69a64dab4e1b2f5bfc6486b1e80165d117db2cda11c0222f3b705d1446cb879496efb36979daf02b1c6b98b28c6e6979d5a9f97bd74b9495efb759793c50ee39295b16c3ca3ee7154bd1734f7e25c3cb946d5f122405a9b2da2f050b5d4ebf4259f9a5362bdfcdd852f46e31c30a567797c1b0ba7748491dd61b4782e682ccfacd3e0f4b322b0bedeb0a17a28dfe2a45fecb6ce4f7076c91665b18dc83f073762b4ae56f4aedf768513c66e4d3edca6e389a150d6a2b5e7ade43fc771f43fc935227f0dcaef9de80ff9a4d78ef2bf5aebe51612e2bc9f7b56d7e56d8bcbd1ef93bb62ef82adadc57d4956a8b5c5992b4da8cf8a859fae590aaa53a559734a8fd7dbbf3f4267f2dbe02625b6af7a1f0afa97204b89be852b0232fb3a8ee947a70587582a10819505927b3c8b05d64b64ff96ae2b7fb63af12e0bef56c015e64e9ecd7802a7946376b4f08d8b8b3240d29f4959c18b758313a7b198605decd905c98af2ccdc07c9d13668982098f3b5b42920047204ffb2a4e38f96dc84b02c237cb3308bf9a1361f82d4849c0f7deaa0cbeaf591c0ff47a0d431210be8e3cf06b3911867d494c12e0ed2f0678a5c58670736470a15e4eec479c6ea5c2ee8d16f1402d579e51f286cd56ab7a5342dc34ff3a815a9d7539b5645d84b65c5de4064c5d689faecbb320f17aceab0aaccba3dccf7424ed1dc03488fc7af1ffbb8f97863ede370084490dc12941bf91b3045da7fdd5e9d24f8909cf61a63eb5c9cdd021cafb98cbb3cad32b410ccca74ced43adca0ff2574834ceec71aa463e94a55c289f4328bf891325ec951ece29490275fb160e630517c61284f19b17d723f1e8619a0f652b17ca5b08e5b72c26caecc1564694c7b9503e8b507e2b27ca4d1ae558a0923233ffc85a66eee6c2ba1561fdb64278e8906e0e99134ad9d50fa387b2553fcb11ca6f5f5c94492f37f720941fe244591baadc6c4c64c9398e607e472160d22527569fb5bc2ce782598f607e679c60327a261bcc6508e67771c274873e30caecf976fa9f6cf48983096cc48f20b4df1d9f7afd4002ebf51a84f27b3851c20b9d0695d741a7d2590dc686ab860b5719c2f5bd9cb83690999a5e5cc75ae9b0216d4748bfaf10954eb0cc0cef354a5e76de8d607e7f9c603256336c30d308e687e304737f0261d621983f10279849acb59f44307f304e309b1208f37104f387e2049371c6870de62e04f387e3043389836e9b11cc1f8913cc244ea06d43307f344e300f2510662382f99138c13c9c40984d08e68f71c2748733e04d253006943ba19bfd2ed4e48d0c6d47287f9c13a5fb9f4d20e251d5f7766503563670c55ce00402f71385f0c16093128cdd46b629890184f2273951461bf8656caab365ef5e84f6a7e28b96b11262433b81d0fe34275a7821cfb408bd3f2701089722843f538832946a14257ff2ac1ca1fc68a133bafd7543cef252fc8e6856b4bd5c688f21b43fcb8936fc1257c66e25db12d72b08e7cf1522d3076b3831d6ee6c0da73684f2e7e38392b13667433986507eacd0e567f08612638667abe59f47687f61316bf9eca18f248ebcaf44287fb11028d38fecc0470542f94b9c28dd15c413f226c8eceeffd0f15f9cc0d858625b9c701661fd654eace11b4b8c93c06c8da5db08e7af70e284e1b9dc4d2c8e27cef2815bce05ae1881fbd542666fe8ebbca88438bb10e917413166ef6a2eaca710d65f5bccba3cf95b589e40287fbd1028836df54be2b4ef7984f2371613a5b94120795ed98c50fe6621cacdf01bab183d946d63d53a84f5e38b596e6667f6242e32dc8050fe1627ca5d1694515ecbc7e8b76d5cb0f722d8bfcd093bdab00863d39ead037a03a1fd9d42a0755ba893aa653aa45e53fc6876425b11dadfe544bbdde2b5ceff2206bf9c12e7549130fdc8cd362d41807f2f3ed559129779af46287fbfd0256cf0893bc6d152b689bb9308ed1f70a2ad314ad8f147acd77f0181fc434e90f96de262f44db62aea0e42fa46214ad0605d56c61294adcb7a0da1fca34297a0c1dba88c9b13d8daa8d711da3f8e4f3d9fc435cb9b10ca3fe144197e6284b1fc649b18b98a70fe2927ce15825ab73ca56f499e2fa610bc3fe384e7368c285fc40d23c6d152b686513702f9e7710199c416e64504f22f0a51d1046b0e31d6d96ccda12e84f22f3951e63f82cf58e1b08de0ef4458ffaa101e1aac2994c48d852b10cabfe64419adc1cef83a0bb606fb1042fb37f1f1d224be19643d42f9b79c28f31bf448e2b8fc6584f4ef389186db04db9448ff3c8c60fe7d9c60267114fe2082f90f718299c497ad1c4230ff314e3093b8e4fb0082f94f718299c497ad3c8d60fe739c602671d5dd3e04f35fe20433897da2fd08e69b9c30c30d8030368cd80640fa11ca7fe54419ad7bc958b3b3752f0711da7f8b2f5ac61704b1a11d4568ff9d132dec8c8087adff682c0143c5a508d47f708282a4ce7eef4272b7c3142168ff59e88c1b7c951163cdcdb6cae81984f6bf38d1869fd8656c55b24decf6209cffcd89d39d52a35a95499f9bac46203f111790499c9bac4420ff272e20197bdf6c201b10c8ff8d0b48c6312136906b11c84f7282747bde41ab1cc686375b857309c1849531b181c9b8ca8d0d662782998a13cc2436858e20984be2043389af9d3a8a602e8d13cc24aebe3c8e6016c5096612ffe7ef0904b3384e3093f8c294d30866499c60320ef7b2c16c41304be30493715a820de61904b32c4e30195f02c006f31c8259ce0933dc74196326679b2ebb89502e8b0f4ac6ae241bca6184b2821365b4e931c6be10dbf45807425b59082f0db6d820898b60562194559c28376b9473d203c7e5ad8ffa6ec92d08ecf2b8824de27f31a8456057c4156c125fcdbb06815d1957b049acaeaa10d85571059bc40d2e4f21b0abe30a36894bbb7620b0d571059bc4f77c3d86c0ae894fcb3589ff446fa342595a6c083f9323bc590d70c010c790d2df01522f5a05ac341a511886e4f105e58173a25fd6ded7e46f38fe37e4afed7c4abd34a0453c10d3ea2cc81b56b227c5a0d26c56a461d7570d7687bac0ffe8a7ce63695a9dcf9b9c015f2ab54a139b927a5f14f0beb20179e7800abbe4dfa062d700bc53b066dec9a1f5f379b33eebd58799f3fe328197b7b4b52967e4d6964726162ca5fd2c729c139e1f95ba0f290784b37e96fadb477b4da547aa3440f67ca4edaf8574d7c9aedcb456b979b74cf961bd58f5b2bc795829053fc5ff07c4861c350c010100 serializedProgramBytesString: - serializedSignature: aa2d4206a8d08c970626570cb9a5b54133b66c69016ac45893da8baa81a801b14d812fa5d4ab0db35f357a382abd96db38cf90abe2d824bd60723221e7f1d400 + serializedSignature: 918e2b383ac1d508c67ea433358a5bc41513bb49eddf25a7cd3d42ba4b1f9dc0068f8597f50bbf525885244a2a341ed250f44955febf897a247bb1501489c70f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset index e1c139d..4b86cfa 100644 --- a/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset +++ b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a4b531b4710ee155a24210106ec801327761227c8e1b10b54e59043628cf3200fa02c2007574ac86671618b472139766e39e71fe53fe59863aa4877efac19cdce6859a41111b154dad5ce4cf7747fddd3d3d352c6037c39b378d98647b002f3b005bb700487f86d05ef07f80e9fa2f60d38c1fb33bcd6b06f16ee2450d26bda99c2eb2a3e35a089942fe129def7b9bf02017e5f45da009fa8750f3f018e72b248b4050f611dd660d2b991c0629b891aa2cd21bd9c3c5e1fc06fd81bb0503489c75d9378a9604f83fb0e50e868dc63f885d53ac0bea748730275e4f98439e6ff265ad629bac1207e46a467477ca87d547a266dfe12df330a5d46dc8744fb35a59d680b4a5b518c1d53da0735634ba27d5c69cf6bc60e8bb113f87185cceee9e9e93faec316f90e31aac131784c702f85eb4494c94ec3f86404a0d33c6d13cd738c0c3496db62bf68c2122c6a2d77d3294972aff0b58623f699294da64cf1676c0a12ae8eef4072bb06b67fcb5e4b8eb78f3df3f023de896a0716d0911e2b5cb671da3aba6e009b783d667e3b28767c64924ae4a22acd23e419aea0036c89003dc6e73a4b58e1ebaf2c69c0d2af625b93d7f321aee807787fcdb3c5753fc1efba393705647a19f50bc9d41e2ed7c84c0f511b92de1b20377b6b91cbb008413f785d2cc3ac476bc4f9236689b7188641c6e50d2ae4b1106e052d6d8be0d1a3538921985ec7b8867aff5e47c99e8b35d24e1b3d3664f039d6e1ccc66eab524be0d166e1dc4a50aa1da4c4afac89eb49c2bb6ed6271155e81d1df4396adcec21f4d477c45c6a38363df804eb8c027e1c7d9f86e518c0294d4a93248209c28c0e420acfce8e5508a3b4a082f1ff07ecabe1f880630cb56f20c71ace4dfc967986b354a295a23db4f9f3f8b51f255265e7ae94e4742a9909f1011de2855ec78b0ad2d0987a42f4d3e34ae9eb6dd565c1e4b545c3b24f92c184605683a09f17d96fccdc05452482dac0d8d5312e885459abafcabc68663e68927aa443a97326a947bb2075de24f5b50ea52e98a41eeb82d44326e6e35ae6f7efa7615e34319fd04b9e8a79c9c4fcba96f9efa9980f9b98dfe882e423bab836d4fbb8d6e413018d4b1fd7de013a22b6e2e07c09a00df06b40d588574cfa424c390f557c3fe39e2a1e498e707262246f1b3442c7cfb4c1e883eaa431a8b607c014544775be41e69bd261f28501932d366a9d4fdcfbc274a4ef2a7e0bc9f761975b64a9e5fc4fed6b4d6d620e396976c86b268d6eea345a366864b2cabc90942cfdbd38c2aef2f5258e254a551379bb53fbb6514742268d7e6326fdded5e9f75507fafdcc6c5ee01365f681c682ddd66ddca4db7b6956e879740b4351ef349b306976abdb5e1946821aece1930dfd72f8761cda11bee6607e82941b4c414f0df078a3f4e1fc75439afb006301adf74d94fcc99bd4b03d87f7c15c45dc8b45c88b169492b4084b1e44bfc755c7a848a1d32e592773f12c27348a7821d29c355c354d3f20ab46c5f68cc7c9cbcc05bd29598adb34db80de87d2efb2218335fee90419d0865d65f21a0e6926f34faa88cc3183a8d6d285c23939d53202b3cb795003dff4a225ae30ffa66b5e76b1c42dbe1e463902bd46f18e185c8a72cafae0dcf4bf26f91dd9bfcb311f390baffab0e853d787fff3c8e753e4fb8840188902854f81e2639babb9c496aa324168af4356ba8aab4b99ab936a69a1658d17cea3c845d639d715dd10b6bb36611b12b0851353964cd9be6f0fb29c2dc81c09b24f6c42567ce369ad070b8ba0156d81362081f6a96dd09e6b4f64fd07da9004daf4e5c4b4853e8c695909b6b24dd8a8127aa29c20fbcfcb4a125cf72ec7cb96fad0cbf2126c9f5d0e6c1637026bb06524d8666cc2461abc8a95aefa6f791625c0666def9ce1bfeed4aa51ff81362c81366713b428ad3d6a29625b5c98ae2dc840826cdef6c2acf261f7ac2ad98f29ad2b01e6f51a308b799935c07212607eaf01b37838b7065801ae4c11cea70a0dfd5d6e302b8c5e6e73542b1b76efb236e52eb7d9bac23ada98408c12a79f20e0246a173f743faba979fc2be8e790aec8dc9e6772c16b11a442a062e97ad72cdd8d229e4ed34e0a7aa53656f1f8f7dbabacff12847fc0171b6fce9d6437de42cb87cc0358c7c1bb2c14bddc7f018e249ae5c7310000 serializedProgramBytesString: - serializedSignature: 1db4303a0b496541d729dc0e97d4cc66f5391ffc7fa565aa8590665fcc4c974f96c15a3f463fd2fbfae6e53e18a99ae1d79539e31357933eb9a771cc26893007 + serializedSignature: 1b051975f281f321dbcfe628ea64d300d62f580640f68fb4bcff7d9be5e1310d1a78bc0f69563c6277e00809454711b518431ded29d6c43a1a5f28e63a600a0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset b/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset index 177119c..9fbdbbe 100644 --- a/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset +++ b/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd52d35010ded336fd111011a53a70a1e385382209e0702fe00f8e02d2960b19a794923a75dad269ab83f75ef9163e86be908fa1df6e529a26694381205349a6e724e767cf7edfeed93d81884eb8d41c8a1ddaa6559aa71c1dd021d5f0b48aba8adb7a6bb76f5103f5479405f4cdd1bd80997c3d547750aee3ad492dccfc4c45d465e9cf9089e775cc35f1c6ad25fc4c8c52314ccad11a6dd206a5d5ed00113b32a969b729c6a5922857e82b7a4d518a17d1a52b8d22839ea6f455a1747bdc2e7d105855f41531a74115c8dc1789c9199e2b98a48ada7504bf14f7f3b3a644f3579055a03ae9dca91e0d40717b6630b92c3a1eb1f401cbbc6c0b30ea10e0833027fcb56889167d11de55a30ebd57a52c60445984c6bc4bfcf42cc1ca55709b0ef334d1fe52accb062aa3679edea0e6597bb400c2775d5276b06c052636298bb22ef2f6a0b67764102436a57bce36645a9e56454b9bd03ade2ba26146ca2fa2a929daafa3ad257e5f83e7afa03e92d5bcd81b78f65b336b53e6afa3bfc3f56ab7dcba6da635a061ed75f1c52b8bfc0b8b30f5f198bd0d633a3fa9ef1e4b5c716805194d02b92563c10aa55d6d8ba4f3abdaf6303838462f427fffb6f85ea6a77db1f833c3e69e16041d0beb3f1ebcfff5edf7a4d60d6d89f438439b0980d68f589637aba63c12fa43d0b498c18abae9577ef427b8317381f45be3ca326e7003c42533751b404de3750303b6f02b8bda4d4c2fca048e7cef6458f338266625cd31108fcd0c5e2021b47b936a90eabd888ff8119fbc68e283234d3fe293c7b83ac4f3e5cf60aa0783413af46230eac3a0c12a5df351eb0f2e2de5528b35d212b8951ac1e37351a301e59c4ea3f328650c707e63785528ce89370b0df6c54cc1a7b9913ea7b9d2b925f620149631787e494e7fed64e1872e1853ef434cc246d49605a6d970438794cfd471fb9b81223a1b593d3ea537056b31c6ab454ffa451014bc2c011bf2a90701bc8bf332bd8021ad60f99b90f1c9b69b9ffc2722a09dedcee103869dea19883990f8d4c4cd176f7197f017211d944f9ac9bcfb615c22d011d43b14724d8070ed0f76a54ba7f975a77fcf7a7ca4135efdc3a2c1e175fc3f8f7c0647be1bceaf8888c1944d84b99bc7c45279d929250cc91fcb2e03906bb5b39c58535dbb5c3b0994d3ef748bb89b611237651357b43daf8567a740a7f27932c2a33215169551079593615279dfa6d23a6cd5c40b5989161869e0fdb5fdd78d612338e220f85698048ff7dce4357b4868e425c2224f0d4f4a3738a5f35fb6e3b6fded7c396163a941e25bd90f05cc2d48ddc99d3a8770b54c831d26fbcb0c4e6c53ce84efb241e552256b3fa46749dca37daca2f33968a8f1a7dd6e9a96635d0e96b7849b38ef37e47f2c0d19a3fd05c9dd22295f1a0000 serializedProgramBytesString: - serializedSignature: d4c4b5b5893d0f559903e9c7fcd75ce12a570bf99fb1cf3c7796a1cd84643707b1176efe1e17cb22422f5b9d5381b7b4891191f878a2e72dcf3f9b84d7dab502 + serializedSignature: 64639c3130115b98d810b55055d3524fc42f01d7aa62931540a4ffa69866d6b2cac5ba387ee42778539057039bf9fa7be1e3d3ec16395515cc1f54759a5b5b01 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset b/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset index f1ffdaf..af1b0d2 100644 --- a/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset +++ b/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59db6ed340109d4de22485d202054a69b93f1004c2e622dea1855204a5b449858450096d8222252124018ac417f0037c011fc13ff1c80770666ca78ebdb69bb42eb4102beb782fb333e7ccecee382993f051d751acd232cdd20d2ad106bda3267ecde2dec0653fb9f54bd4c6fd2dca32daaed3859891fcb9a24ea35cc05387ba18f981d671af49fb0a55f07b01632b78e2da2abe15f452190c2ad11c3da3459a54276344accaa08e53a7d82e9547799f3ea3b5224af124a6344da258414b47da1a50daedf7925e89590db4ad634c9bea90f94624e6052e7c0d25da3d42ff32b5c84c71fdd501607447c603c8a2b3292207499eb60b555b10a0b1a2241875e936ddd25a31a5463d7acf4a59468f9a08cd07a7f811988295abe3aa7828e8a07e5e1864126a68b9414f70e751afe926407de993b28a69eba0b14245942d91f71a6a077bc699c474f9c72c43a6ed4d0dd4b880b6f05c170d57a4fc289a5644fb05d475c5b79bf0eefbb86fca6c41dbdbf8ad9bb3e840a6d751ef5461f5b6ebba34cdc11ad6de4cb39bfd67e44f30c2d067f34e18664c8e11f535c0c47f0ced45c690c5da96715320537d75b7c8e447b51c4070701b8316eafddbc6fb2edd89b4458f0cd33d2d166c31fce2d7b72ff33f8f7f37fa4dbb4d66964d9b89312d0a58965750a70212a24d308c8cc58afae1573af8735cb9b287f0dbfd6ad26f7002b2b233f513a08ee271111d96f0ad89da1d7a2e4d9dde3a1860c76251390138b87dc6291906714a07717eaf218e5f53a220cef7ecda8298ecb38e06c1911004e374084330ad41d0629a0ee99817bd467c7a71ef10e99930e9877743baa1639f0152a53f14606187d8680f18edd9b10586c9f8aba9c848099bed08ef99ce96493943ef4863e248c34d10e64c591ddd4cc8b8c6428b2d3cea53d5cffe5838fb391dfbec57aab8e7bb1b47dd70dc1fd3712f0e713a641b8a9aeb3839c912031642fc84103f8c74c3c8e1528a417e20bddb90e0dd054c763d65d1f61332d6a101d97c922e028137c2487c7a7682c2d3b36ac0b6614fea7156d898f1f8aaa473eee94f675dbc4de15949ceb1c89505a439320e9ca527fb97031faf0f77cddae18e48415ec6251236a11ed7b2bc0d3f4fb2f4fd6d9a9feac7d90d6a7d305a1cd493ff78bc591c6fbc68f692d194c99b97ba36e46217af1eefcdd9b41ef2c18fd0b68045797d0801cce91a2ede83aae8b2d6935d8332bed97692538d8828b787b11d53e25fa6313ff7a0e786e8dfc1653b72ca624ece2409dc4507387bcb6b0a74ac441788b4f1fcd87969b4d6378dd7a435b2920378242980531e80a79304980f3f65592f3e49a47bcf1789c13691146c390f6c3349c2361e1ad04da74b62e0e592024f79c03b9b2478877c3ec7aa56d13d31c8c69282ccf040762ee90de4bdefa54f51fecfa8ef4b5f4b7b803bbf97be5644b90911fbcfd7b21ec82e2409d984c6d7e6e4695dc4b47ab5fbcfef32649fc00f40ae6371173e1f650dc7110a31cb4461006a0ba1ab74b0c58da942e469c24e7c8e39483731e35339c895615959ee5b4990292f6aeed26087fd6899f129c0250653e9a3aabe6b1eb21b5997ced29d6460a311ac98fc9aeb40db7f997cf9f9a4e4e725306f0bafd03374de10a5f863fc067e006eb653220000 serializedProgramBytesString: - serializedSignature: aea013c4718b1aa28c96ab797c8a2e18ea70f4acb12d5d5968eb2630776486ed0ecc8cbdd026e0ca437eb5ce77631bbabf2ceff3ff1a43e42007584434ca9d0f + serializedSignature: 2daf8daf16a11e7970801e3c2430f0a12ff72514e368cabd51050cebb057f486287db21597ea2dacc2c5973baf52f228b0b58da6d261c23fecfba8ad01b61905 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset b/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset index 1ff060e..6255bd3 100644 --- a/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset +++ b/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed585953134110ee49b20410413c38442d2c1fd412dd052cdf053cf082e27a510b430e8c95c4140996fe005f7cf1f7f8bfacf251bfee9d0d9becec2ec1ac58e86e6566768e9eeeefeb99e949ca263c6a06c916add122dda14d2ad07baaa1b488bc8ad7fdf2ea57690ff92ed21cda66683a66243fd7d504d2657c35a88991fb94475e96f6752aa2bc8cb1457c716d09bf227aa90c066dd212add00b1a571762446cc9a086ae536c97ea47ba409fd05a14a578125b9ac691aca3a5216d5528edf57b49afc5ac2adaf218b34715c8dc1189fd9778acd82499a5f3347e03dcce654b89e68f212b4775b253dce96617107b23e3c165d17d29571fa0ccd33661461d020c166e0a7e4d9aa739a385936ac8a7f7a2a439f4288bd0bee014df0253b07215bc451f3d0dd43f127699a0325aeed033e43cea0dcd02f0971d52b6306d0514176903695de4bd81dac19e712631959d63d620d3f5b42a6a3c40ebf8ae8886eb927e104d8ba2fd32ea9ae2f73578fe02f28f325bd0f63d944d736e68c8cc3a9a1d2eacde756b8fa62558c3dadbec83ff1939164618fabe3ebd0c3336af11f525c0c47f0cdd4dc6928ddc9531eb6ea56d757364cbbeba1640b07b1b83169afddbc5fb1edd8db4c58c0cd33d25161c30fcfd73fdfbd36b5f7f58eda6cd93cd6ea22ec59816052ccbbba1c60212a24db0ac8cc38a76c2af4cf067b972fd0fc2eff62b4bbfee09704fa67602d4a0a89fd75d7690e7502a50801187876705d4e09119a75818ac2913acbc6dab8d63f1eab0a0261ad8fe961507c0da1ce7483cd7ed5c1220291d25b51688998f41e1e328b3843192363132f8a71d3d7e678fe2e354cbae033ef831633814e2d3713a8421983121c82aa9578922180c81bdd202c6be05121f24aed9c77853c81c8de969e87ebb0353339ec382e7b43190ef4ea330842d03c20efbe88881f89f78ac810e4599732b8b572966e68190b007c357317159be1a64732fe574712361e8aab289567036e550aae8d3295ac29988fb49a967a16a9c15aebbf3f892dc67bcf0c7645dbc4de16179565be4c902d2ec5d27ced2516655df822965f3ba50b78ee84df15a9ce5d9d287bde3c61dd8ae8017f2e70504b0836e425601152cc21431c4ceb982ceef3497a6396f8b002fa6ebc1359d1ded3e342b88a60dbcfcf0b2ef10feb0679e77b4782db846466457fa08f5b896e5153ad70c77f9eb343fe7f7f91b87f29b836dd8bc7d3abc0d9fffc77748877748fe6baf757f4e39bca18c25b9ea79ce6dbccc57095db65bb2cbc1f5fe3b77b581b6956f1dc694a3af7e17b8f124811b8e04ae911c7483494197f24137912474631ababc5eb44d94fd02fdca6f93931c9443494169f9a09c4c12caab1a4a379ead891fb2124d09b86bf444ff257ad2004efb00be9824c023a1cbbca6bb24065e3629f0940fbca9a40f17fe733707217ca23e478961db95afc4801b4e0ab80c9d98d0d2e12e0cb92f928ba6cb8de146b5ad35ccf85c369a9c8efc72be78cee6a050dda3ee2e42d132e383adcb7e733a38aaf48ca35e0490264b7f27981c8a60c566ca4eb4fd5798774dbbb8e9b85c35fc979215b986b052fc58bf007ce061a6ed1f0000 serializedProgramBytesString: - serializedSignature: cbf8913d23aab3dbec18f0ed024f4c6dcd846ec8b590c390a5d935feb732a7d3d161b5bb477f129e7c877e572392d9a9db5b77e2e8252b2226df3aa9ac74570e + serializedSignature: 12231040346c8310830284f580c1c3d05954366c7fab22f35eb7e5a65cfb375e8fb1dcc64b4308e1f36ac89d13a2379a124efa41caaba2aa7e89489a5aea2509 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset b/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset index 6f887f8..12931cf 100644 --- a/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset +++ b/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d077c1cc5d59fb32df7debbe586e52ad972c5c64572416063e346c7c8966c04926c24b9514def35845e4309bd27a12440e83df410ba13134c422f0142fbf6cdcee8decdcdbbbbbddd27edfa8bfcb3463b3bfbca7f66deb437334df285f3131be5fc5a2e168b6231462c136562ada876fe2a76c22ae79ffba4e317891a275ce3fc2e75de8d12b969be849f61b19eceef12e7a956d4395fae17ab9cb042be5f22ca9dbf4b9c6fcb9d27885dedfc2f7752c59a391f2d13b3c542b187e811eb9686c472f951ad8a8b815eb196ceef22b1d9795b2e850226f9f2550fe7d712e74dad7c57e508add3ed270e906a5539ef5639dfd4884a87e64a49b165ee1821ff106e3047855d5438dbf9df4afddd44fddd52fd8dd3efa4c2b919a6efe8fc0734ce4891769e0a873bff9b3b7ff653cfbbaa70bc115fa2c21146fc6e2a1c69c4efaec25146fc7c158e36e217a8708c11bf870af38df8852a2c30e217a970ac11bfa70ac719f18b555868c42f51e104237ea90a271af1cb5438c9885faec2c946fc5e2a9c62c4efadc29d8df87d5438cd88df5785538df8fd54b88b11bfbf0aa71bf107a87086117fa00a671af12b5438cb883f488545467ca90a6f56f1fd45bcfce1f80146fa5b8cf4238c7833fdad2a3e57c4cb318e1f68a4bfcda05f68c46bfa2b5578bb917e82116fca7387917ea211afd3af52e19d46fac946bc99fe2e23fd1423de4c7fb7917e6723de4c7f8f917eaa11afd397a9f07746fa5946bc4e5faec2df1be98b8c789d7eb50ac1b66562038b55f8074567107a766c63ce0deab9258a6f65a4794a3daf71fee708d16676067c0f76d3ca50db33082b941c8333a07188077e875a70a974bf6f7b6f06dfb751e1bd4abe21eab95a850f20ba0fa0b410fe517d33143d3bb8b56c66d0d6dffd49a5df093d43f820e2b156850fa1b807511c840f2b3ac3d0b3c3b3c5db04df2a953e0f3d4378980ad7a9f7c38df735225ef6f07b1b9e9a572d7a866f46b879d1fc61033b9dee7e944e3f43789f8a1f69e8749f915fa32cf1a974a6743231a933dedf87e4c8a4feb555e19f85bd5c3d86e83c86d242f8b8482c578fbbf9db7a7f83b6feee099158ae9e50e19322b95c3d85e29e4471103e2d12cbd5d38aef7882ef7a03e3f506861b0c0cf57b2fe54af3aa45cfa85cb5ea6960a7d33d2a12cbd5a32a7c442496abb6281ee7d7284b7c2a9d299d4c4c361aef1f41726452ae3abb79d2e6e0146957a3b49ae626156e36703a5cc9333a03debaad7816d17d56c9f3a37a3e02c503dd31e819c267d0b7cfb8dfb6d56dfc91281ebecd37d2691d8eca4017b0ffbaffafdb088cc7d122f336e21891d8a66d51e1f3868ecfabf03991d8e63ee7cadfaea34ba7dd4c43df170c7d5f4843477fe7a56deda4c2d62afc8bfaa6003d03ed578d749d1066ba5c754071da9e75b1c475b3c475b7c46d4771dacebf2912ede676140fe18b22d146bee8cadf5ee7b91e6396a64edf798bc157f3f94824dad48f54f88a48b6a9afa2b857501c842f89449bfa92cbb7435fb72c74dedba0ff2f957e2c7a8670ab5146b62a3af718df1fabc27fabf4e3d033847f55f185e8599721cca7003d43f83ad2f1759777c75106efe354f8b1c1fb63157e82687ca2c2e3114df8663c7a86f035f4cd6b8aef6506df1354f8a9c1f753156e4334b6215ab86e29da9d271bb44f54e16706edcf54f821a2fda14ba3534b83c649eadb0946fcc92afcdca0fdb90abf40b4bf50b42b45bc6e61dbd74d24b6779ac7292afcd2e0f1a50abf423cbe523c5e14f1ba8a79743778e8baa1ebda76f57ea2115f8b9e6d32eafcc36da7ad6ee87487a274b8ced61a72a83e42fb21863c5d45a24d98849e1dfdbb6c33d2f7108963341ddf87883f5585da864d46cf10f622beeb4dc4f724e2078bc4b1be8e3f4d856f19fcdf52e15082dee92a7cc7f8ee1d150e21beeb2a52dbf4ed467a6d1387a26707f7beda96ed647cf7b54a3fc588d77a7e63c8abdfeb7cf80ff15eebfbadf1be0de2abcb9fad2da0caa37eafdb22ca167f8730d26df776f40ebed9d9a079a60a291bfb3da2d9c3a0f9bdfa66aa4153db6dca7edaecf60f2aed3483d6b12aa4eca5d9fefc80e221fc51bddf053d43f85f153fdde077960a291b6a693fbadf2212edc59b2a8d632bba3f2c12cbf19be87b5d7fdf50bc6620d970fc4c23fe2744438f57b68b44bdcc3c395b8594ddfe19d1ec63d0fc99a0798e0a7f3168fee286f0a7a629ff8630a6d2ce5269759dfdc6783f3531be1e5b6d834c9b7faefabe49a22c31d55f8d3545b2345561334296b78cf7a6dee7a9f73906af1c15364758ea7e5a357a67a3f92bf5be8541b3850a5b5a68d6a277369ae7abf7ad0c9a1a87d6169aa7a177369aaafd8fb531686a1b87fb75bdd5bb7622a9afd75b18747fadd2b637e8b657a11ecf3a18f7d6eded05c63bcd0b955df92e551e7630f87550219effd363f36af4ce46f342f5be9341538d95629d2d346bd1bb54e5a28b4153b57db1ae169aa7a177369a17a9f7dd0c9aaa0f18eb6ea1792a7a97aaacf53068aa36432e419a342f46ef6c342f55ef7b19347ba9b0b785e625e81da669d443a168c8b65ceb07e98b0c7a3abdeef37dabc2d38df469fa8c5dbe33e8f515a9fb387a1e29ddb895e8fbf49b8df840b82a75fadc8b0cbe418f5bf5f868187a06395f75f1c95da7e23ba8f81f0d7e9709fb98871adf6e1389e3db6d2eddfee71bdf1fabc26cc7b79a4f017a86702bc262abcb7b405b83b79ff1ed569138beddaa42cbb87ac09106df74e35b730caa69e1f1ada29dbbc8a09d6e7c6b19830ed86ed030c7b77a7ca0cbb2392ed4f1b5e8d9c3b8b0beecf91c17f67d1b7da7cb722b9128a35ebfd5f570127a76b018b8c8483f40248e91747c2e113f90881f44c4f713a9edd07623bdaec743d1b323779e5ec7ef6f7ca7ed971e6b61bb66b32faafdb595635001701e341e7d0be1e522751db6d1dadfa041d9977463b22b44ca3a1ceb8378eb6fae24785d2552d74b8b4d19dcd5c564c81d06adab091ebf11a9eba739b7e5f018d215e9826d62b141fb1a155263273d9e316de91b2afc9b7a3fdbe0a7e3671af17a6c8af4af7ff7761a19a971d07b868c6fa37808df57efe718fc74bc29231eabe9b5f7ed284daaf1339547d98c9fa93c097afc7c6d1a7ccd32906eac8be71f7213f123c7bad7a990189726e4c94083e64f06cd41c67b3d169e6bf0bc5ee52931feac2fc385880e8e9f97861f214ffd78d994e7b7ea3d3546d56de4aee819d79b12441fc7ef96460e4ace66849cca6f841af79af531d6cc88df3d0dbfa989f154db3d50fbdba8b901cffddb97153ded8fa7fb9d37aaf8c1281d84447f2a6f9b2bcf70ada79ee3ac36be5b809e21b4cc4b0dd7be877d0d1aaf1934747addd67959077c597dabe7c0745d6baabed5fe865a0f6d6ff45cd748235ef3d2eb11e6dcd828235ea7d76b0b7f33d24f32e2757add5f7f0be1d6dcd56584ee2f5be6f346e839af54f3796f1b32bc65c46b19f498e55d44a3852b03c09220c33b71194676356478077dafe7d6df336478d788d732e8efde37d28f36e2757ab33c6e1589fdd8adaefca3747dd2fd253d2fa0db40dd2fe965c4eb3e7d6f235ef7f9f41ac540f5aced691f23bdeefbf734e2f5787d88113f4b85438d785d77fe6ee033cd88d7f8a8f92af10f23fd2e46fc6083bec6538f2727a16707cfd1ba6eea7e74ae21a75e6b1860c4ebf9fe81463cb6d3385ecbabe7ffb49c3389783ddff68148b697ff44711fa038083f1489f652ad758ed66b24d3117d6c47b46dbac99023c136e5c4a4fddf55948b52b14ee44b6305253153377bfd657a077bd9dec32ff81926d9d689cdcea7e5362ff765d287bece29b5e3ac5eeebde47ca5e65e2c7f973a292a24d185b12416f725b100e12a9d7fe5c845bfd6899f273dfcc149bfc2793346cc7742f8ea20c70cede7fc4ba4b2dc615b29d63b4f4b9ddfeb24bd831cb19353a65309dcf9cd6f163b34dddd06554e8c06749df35c29255c227f6f9092964be94b9cb83ab9f7a15aac712af15ab149724bd6bdc6f9dbc673a982cc2ea37dd30115ef6e6dd0d934dbd106a4cf977d87ffe54863e488ec6e40fd809f66f9b2f7745a524efc0f43d7c8c020a044d1182b218b25c48d13f9729cb0380941ef3a266b682fdf2ede139d863e952e766420bbfb480de2397cffe84b9f7870f4293d7312552b14f9d0cd93e39d54aaa50216e8e5c995102f2ae4e4342b00414df86336f8e5f0674903c2efa6ab90e9bc674073d9f82566801cdab88d2758b635e260b94d6cad7c5da5c4b3bf59e010a976feaf91ea24e56001b06b213321b9894da708950d4d6cd9d0b2a1b321bddd49950d2debf58a6703fcd8116c4520984e060ac1a6360465ff6f0d2b82cb9c38b7833447bead90ad2ad8c67227559dc3a94655642aa5c66f81dca4b85eca901a69e8068f3690b6a3dc46a20ce3391e39a9dc6866cb0de9855b1182dc28747a4dc1e648db8c73a49dcc91d119e74836b252b99263cb15e93bb1be5172a5d8e1011c81f262d91f2d93541311d09b7283cbadf6f538c4732b5fae0d4d49912f7cd22a3710f7a7458ebde0749405a77104a40a54735b819283f2a50dd86cc1bbb5920a34dcde1b2ef0901969f61fec99d0596642cf24e5d28b4041d8c202610140d8c52a552b432a1088a0dc92a2dcd5425978a1dcca96eded1ba7cf9e5d5f0526787b18103423fb2add5376b9bdf6545adbd0ebd0f05d6eb7975a29528fdfecf841bf6d80815f61e1ddd3edf8f5247bcba965a0106c634310ec63ecd0466ac75c9a6be533700bbecdea656bb3a46f5f7eca262108c97a67d23ef59199cc2f0c5528dadacc1d148abe16e40a00b97e865aa605ec435bc07636666016fbdb3a8226e13634e1f636c21039c062b1e0278978779a7807aa45c8f5db2274a4280ff44bb9938d32283288324126f19e34f1ce94d883fd8add85cac72101e463578af8500bf15f9c1f2fc4bb51c4770a40f2ee14f1610110ef61219e2fb3b871069d702ad12ad91faf11e3199a843c8b61cb97052fd5f0d2bf54c34506cd012c81a61ee7fa17846a0a7ada4a1914849116c40a00b15122755330822e75bd2866a3296663b267d69b62964f312bc89e591f8ad9588ad9b8ec99f5b53103cb50188065e847111f6f21eed560f6b7991d69a21b72101c1f8b508798a53626136cc644b605c9a3ddf4bcc091a2e516e19e5cf6bf9fffdf3f440b014e26b6b994f4a58bb2fbd28dc466b0c03f256daf3c8571caa5084ff14978204578679f84075184a7fa243cd842385f76eb1a67ec0dab75ee9adb26c79a6f62e9684d1316db287b9ba986bbc148a68efc737fa8ced674916eec1d8c3054c51b4295b61916e4644f61a6c8baa7309462368b6256943db39d6ccca0712fb63183f612f60fb404831186a62f5957b0ba84ae72779c0dd839820016fca99b3755bc9ae5cb7e77aac5c6c42ebfd7d2970b5c8c5f8e2a3d9363d3bef25608e2032d0398791430e0fcdc5c17b9ec446cc857dee0186e83a3bd708f95f5db551f4111df2d00e22329e2bb07407c14457c7e00c44753c41704407c0c457c8f0088e753c4170640bc8022be2800e26329e27b06407c1c457c7100c40b29e24b02203e9e22be3400e21328e2cb02203e9122be3c00e29328e27b05407c32457cef00884fa188ef1300f19d29e2fb06407c2a457cbf00884fa388ef1f00f15d28e20704407c3a45fcc00088cfa088af0880f84c8af84101109f45112f0d807811457c6500c48b6dc4619d0a0ed6f0b54e359b12bb2c00b1e7d888835b4a797de234d3aead68e2736dc46164b65a6430c391621834cf4618dc74c091d4ea67bca27e7b8edda31866b43638efd63af9051fce71528377f1125125fd86ea9c2f92246c414bb82b25e1c13609fb672ce15e6a8ead2c61bac08b642594641536c9ba652099bb7f05e4f222c76e941c87f891c39dcdf222c7ee941c87dae4e897811cb39cb76572c85ce1e458b672cda7e4aab4c935380bb9a0046d72faf8f0778df306ee8cd9e849c605948c5536197b6420234c31943a06192613ca3cc9b207254b75b6b2245e59e3459685942c6b6db2f4c94016f75e9f9502e6608b243ad51ef15944c9b42e5b99963831a58e5cebe43cf07a2951ad2799f6a4643acc2653c70c64f2c27d31c5bd26db5664b16c294a85dec5b7a7135f2a69d7c84934afe568092561ad4dc29e1948b8cca9ed1b1dba6e2be70dafa59434753669fa6620cd42478e55f249d732573e2f522da3a45a6f932a93963659aaec2cf8724ab20de95b9645ceef0ac991b2076ba574755994aabd28b936dae4eaed49aeecfa027b53126d4a9f87e9249aedc4c234f5aaacb0da87926c733058792f55fb52121deebf54e1ed09250e725ee4da8f92eb08ff790872adcc1ab1fd29c98e4c6fb7d249b654e08d1b5ea43a8092eaa8f4252b2e4b911c01b87f57cbde41ad440bf270b5f3cf8b440752121d9d3e076749fd4b99245b4149764cb6eda0d9527b91e6204a9a2d3669ba64208df756afd426034c0a1c2b9227057285b749819514f1e32cc40ff2487c1545fc780bf12d1e899751c44fb0109fe991783945fc440bf1873d125f6d230ef34727099f9b8cd6d828c314cfc9f589e3949fcab1889d628ae7608af82916e25f7b245e61230e8ee57018afe9582e6c80a7702c3f8492fc348be4939b7b93fc502a374fb7e4a6a7d9c04a4aec332c626ff22876958578bef49e853694cf7328f9081dfd5791f32d8c3237483b0dadacedc89dd4be41708541663b7fe170ffbc58aeb01d04e44d22ca0da79ab221675b6c88b548a7b0216b6dd927fd911b72dbda42a7fd384475b8bd3bb99e9371669d2bec5bd6d2f1a7b2669d0d3de9607d6c03177efb9953f344a91a9ec6f54bdeafa50f1d82ddc5aba514100f52a43fab2a75ce9c578f0f72b1933ee173ac15a6b1b48013f15b434d263cf1ce97e5265c325365f2309bb9806e215c8790d4d5846623a303533c74346b28092eb049d04ea6ab1525ca67ac42beaa70c6a65ea7736b294379a1c550c63c1aca3a1b71a8ea1759ca780194f18be385cae4733ecd67bd8d0fb4a797d8ac9c49f82c9af0064a814b29052ecb4a818d149fcb293e5764c56713c5e74a8acf5559f1d94c95e6ab6da519962a973935ba4c4de2261e4ee44ec9bbf6dddbb4f7e1b696466e80a96ed49606165fd6cbf612fedea0ecda52c93b7e60929f36044e17ef67e9e5c08fdd5a5f23adf5b80cac7510d25376f808aa7c5e4b95cfebb22a9f47527caea7f8c039ce4d24523748a4c608dab7d7d68e79f72ff7a2cf51943e3752fadc94156e47dbf8c0a8e866913c2abaacadb751d13114f15b2cc49ff2487c0b85d0ad1442b76585d0b194e5bbdd66f95ac974d53265b55a68d8ecc9c61d47f1bbc3c60f1eb35b3a38de664be57ebf72565b9aaaceb85a04bbc1e54e479ba666ef5beea61a9ea2c6672f4d2e98e4845f5b66101deabba4e1e1118332c82750c5eb6e5bf1ea2c74b7b44e6631ac5ad7c92ee952a7ab5c23c7f16b3c7af89c4849700f5da16ac56c47eb6a6986a19079e17712c5ef77367e1d4462d765a9d41aaaf26a89729527de2753bc7f6fe3dd5ae96afa9b78e1780ac5f10f368e30ec28721e0f15b6d55b2f7c4fb5f1856107dcdb6d0e3b605b8d9761c76914f1fb2cc49b78247e3a45fc7e0bf1e61e899f4165c703b6ec68af5a8f20dcd5cea438ffd1c6b95b3de7d4ae7c6e7fd08b1c675172fc2955758f2f33791dff9e4df17bd0c60f5c6360dea1522d694175f3b3c4750ec5fd211bf7ae197087e78da2c09314e752523cec4f8ab19ea4388f92e2cfb4298abb43b94b7b0b6489f3a6fdaf28be8f78e5eb4ddff329be8f7ae53bce13df5f537c1fa36a3ac5d75f137081458efc5c886c9c636afdedc84cddab7c5c24f72af51ec42d0f19bf88eedf1322dd01b6fe34a0ba801752e5e5492fe5145c60bdd5cb8b28be4f79e5ebad5e5e6ce30b4dedd3823829d143037f0945fc190bf11c8fc42fa5107bd62b62de2cca6514dfe76c7cdb88c42ef362d9615ee3b1e37a39c5f3791bcfb642f713342fd75dcdeb68fb0a8aeb0b1457d38170b6d4bad413d72b29ae7fa1f0758705a6ab90179e57513c5fb4f1843ec10ae75f81f3dfce1bde429c3729aea6a478c926458ed27cbe747ff2c2e737149f976d7cda1bdabafcb2d3f01a8af32b54895a220e13ebe5d01afabad9b9185f4b717dd5c6157ad9b3843e9e349b127c1dc5ef35ca3225bb9366c3f77a8aefeb36be30d7e8c735f3b714b7bfdab8759079092e0e65b2b75ce5fc55eb0cad4b847b5ab5b7f1db0d14ef37322b47d959e11b6d5c4131b8e6cde23934d38be7d04d14f137adc4b7ccf042fc661b7198bf824be2fc9c0a740b45f86d9f846fb51186dec03b99109e4e13be8d92f85d9f12df4e117ecf27e13b28c2effb247c274578ab4fc2775184ffee93f0dd14e17ff8247c0f45789b4fc2bfa3087fe093f0ef29c2fff449f80f36c2d0487d287c7a19de6ba30cdd0bb816d5af9bda7d36e23083f5512678a438f2f97e4aea7f0520f50314f17f0740fc8f544e7eec3727ff64a30c2e289f6402760a1794072d84f3e56179e0cadcf0d3247e16b5534f927c6a43ca3a15021770e7c92b8339a4a426421eb26531e4c4e79964f16774163f4c95ca2ffc96ca3f5395e9cb002ad323947df9caa77d799492faeb00a47e8c22fe4d00c41fa772f23f7e73f209cabe7cebd3be3c4995eaef7c96eaa728c2dffb24fc3405f27ffd82fc0c45f907bf949fa528ffe897f27314e59ffc527e9ea2fcb35fca2f50947ff14bf92f1465f05df545f9458a72cc2fe59728ca4dfc527e99a2dcd42fe557a8cadd2ce6af72bf4a11cef149f8350a8be67eb1789da2dcc22fe5bfda28c30c48cb98ff8d596f50c45b0540fc6f14f1d601107fd3461c9af03631ff4df85b14f1b601107f9b82a55d00b0bc4349de3e00c9dfa588770880f87b142c1d0380e57d8a78a700886fa5ea7e67bf75ffef94d85d0210fb1f14f1ae0110df4661d2cd2f261fd82843e3d0dd67e3f04f8a700f9f843fa4b0e8e9178bed5485ec154085fcc8461c461bbd33c123c568e35f16c2f9f2847ed827dcf0b31941b8eaa79ed5e893096237d088fddb9615b0d9b46f2684cfa5097f4c11eee793f02736c2e02ade3f66f18201dfea5c91fc2bd9ebfe2e9ae5a7942e037ceaf2194538d727e1cf29c2037d12fe82b23883fc5a9c2f299107fb14f92b4ae4217e45fe9a329243033092df50c4770a80f87f28e2c30220fe2d453c2f00e2df5988e7cbbb521ae7eeb9e4fb3e8235f0c32d562d7f08e89beaca37ff520d88815f7c95289047bf8bfae7b1c6f338e3b9d0782e10638defc71adf8f35be1f6b7c3fcef87e9cf1fd38e3fb71c6f785c6f785c6f785c6f7ee3375db5e2cdd6d7bfea1a75608beb7d5ab5c01468cf6ffcca0e57b82ae6dffa5588e6263f9838da57bdb2b57fbfe23c5720c1bcb9f2860f3d980fd996259c0c6f2171b4b68d3c7fa6cd361be35a915182a42e1dd5d18700b30ced602c8eb9232f5d6f62e5152a65b8d6161cc8bcfb87729284318b3e4be2cc9e3d94a72131b4b28c9137c96e4a636c2509227da74d9291335205b086ecd28e426b12197432137d92772cd295da6b0e9d282d265679fbab4a47499caa64b2b4a97693e75694de9b20b9b2e6d285da6fbd4a52da5cb0c365ddad958c220746626baa4f0336b4f8134cb27481d28c2453e0977a4d02f6643bf13a5cb6c9fba74a67499c3a64b174a97b93e75e94ae9328f4d976e942ebbfad4a53ba54b099b2e3d285d76f3a94b4f4a97ddd974e945e932dfa72ebd295d16b0e9d28762b9071bcbbeb671cc30e73106d71a34d4598f4b9cb79be593f7931e17c6609136111bc2af72911c2e744f522c357b6a10d0cf965bb09964cf98654bca2ef2110e8d5a22668bdde53913b5a2bc3ecedd2803008e915baddc63c1d6c91818ac2c759e60c30ebcc3d2bb10bb071198efe2f76b7bd9f4d29fd26bb14dafd9821a7c256ed7852d737076c866a59f7e43cbbc429e77ed85b2172d07505a2eb169b99fc7dc83aa5027e60938ad66a52483658e4b9c4a7b6fba9b94e090b90a8f8745e452982cb561b22b99f3c9339041e67e2aea5eb41d4869bbcca6ed01be4b0096db4f0948a57f10a5601085cb721b2ed30d6b5a240f4781060136dcb958801d73b581ed789bc51ecedb35227e9c862975228dd46fbd683698d26c2f9b66bbf9cef1b9f26fd033552e275af38afa8da841e4e5104ae3bd6d1a0f35f2d2acb56ba4862bc47c512ea5842370826973865272ee6393739621679c272e6ff3857ba4e6529953c9e588ca83441b144cc9db89d26f5f9b7ee30cfdb0f7869927f3549e64aa03a6e54583619406fbd9345842b60d983fcead396abb6ea5fa86b6ff9842666982cac53c0a83fda91e5fa6b9b8246d2e529482b012c329bd0eb0e9555e6f17f5e1a7f8e8537ddc638d58ed7ce20e044aea53c60f545d2ce52f57072c25da50b7efbb4622542559436ba7eff34bdd03e6c4690485d381369c666464a5f0e976b6b6d0bb95cace028fa4745be1adef977ca079907dbf54d4bd683b8ad2f6209bb6c569dac5629997c9bd2fdc2fcb249eced36c4aeb684ac7529b8e6730d76a38f4011f3e11ff66b6700f5bdb2ce0a086b9aad60387cc6b3a468ed6227eb4b3fd60e720501f43a1bed286fa5c46d4756fad5ce0bb50836b0df3294d57d9349d465a0c9b8f6aa206a5ea9814d00e30d9d5f95b9fbfbacae9dd25d7bcecb52aa0b42aa3f28feabf632b5f22354deee1d07dff4c4705d96b3a96d2b4dc5bfe25dbe4c4dc5b63c95fdac2db4a8317adc6515aadb669b52f63fd9be7bb2f134ccfbd9042648d0d91f146892e96baba7ae99c85b9c854653255bf0b7fe7458bf1941607dbb4589cb2b4ba674867523fd3d1c8244550f575028540850d81658dd69e7b29d3d9b4b013291c0eb1e13095ec85fb1b8305db579b44e9746826fd51fbc8229336a721e74026533a56da749c93918e0ba4a316f40dd6491d57a598556ca891d4144acf2a9b9e0519974faf333dd949bf33257db54dfa05a49d4dbf0690bebe654a39881a3895d27bad4def1252efd4ab5ed9ea9c4835087da751faaeb3e99b9f717baa7b7d95ea7da96a03d37ded45f65d28d90fb3c9bed0635f20d1a664da0f48d55f0f52f7e994ee35de5667a97e5055bd25ad48d94f4fece164526abd683983d2b2d6a66561007d56da8e66db639d49e95067d3212f438be26a53ab6ad9c6c0a49d4549bbdedbfc9f4d5aaf652bd1699ba37c1551da6ea056ff839cffa37a225ed307db072da630d9e8bfbcae09bcbccea6a4dd94498f999aa7992d473a15421ff81fcc1c4db63acea174dc4cf54932d1d14b9fb961f59d4be97b38e579904d1f2c937e74d0f6661ea5d911c1b5059b02cb875d29698fcc64b59a6e7db5979db7f922fd95170d4a280d8ee2ea3fd0da659b0bbb513a1c1d5c99493d0bed45dadd29698f094edac30393763e25ed166a2ecd9b3783b7f9c4c6f3685840e1706cf67e37364f8ec69a73da83d2ef386ad6d89fc7d7520107dbd739e46a2c9620fd383ff5f7a97b752d9c7f31793dc61cc9073ced16c92fe0a956e443a593f34d995e580ebcab1ccdd64acdf49a45faeb6f8f77c06d0e17cfc1cfb018640c280acecc96537ddd9164a5c09721d4cab36bca252635b28f32465eb6015f657a0db16d8e7b0c9ae5c6da657e21b1e91d1e8bb5501a695a0ed27089e50ea7e90990ab6d54ae36c9878d5e72eb6d36a529bd142702b7a6f632d4230959bcc66093dd25b0875a5bacbfe3ed3059ef810c7d3f775adee6d94a26efd192c05245202db965c84cd8c8f59205ce751baa11ae8be334275b5ae43429803c3989133838fe588fe5c0cac4fd0a20efdced2151000c7e346027730206873880192f509d820a59f1ddc6f1702741dc40c7ef12c2e52f0a606e6b1907f3144e309b4b30e173f7e6dd288033bf791c9c5339c1694f564dd836140d3b5680aae5699c60b5922549fb8469a8a200512e2a4fa7734204079445bb55bca36d1caa33f88d3c9426d7bfa758ed385823fbf0b3c47a399e8d369865397130cfe4ee9bd150b9ee54ab94505100ee5ed4373b8b13b8d6f5a570b61c3f44c9aabd8d4ad7d99c20f512a9fb63d1ed859d211b8616390671d34335fb51a837dce9f1329cc33c476c921ea335925e99397e866165e8243f078f7ff3321a0ae5a5ed95e5f96e3cf2c88a9f477473f2923ad27959d68b3cdfe39b3c4f63f13c4fad435e9a3e4c7cc2cc3ed155001366e7fe3f9fcb2a80b9acf3000438ef007e5c2bfd2b4e2bdd53952ab7e4543b89526f108633350d19fa26c990787c85b6c536695a2558ebce9928988dc5862b3b74a3773e279c5d249c15724d6bbeac205041e738a2809159224bc55a01bb79d9401cc105620f04e2af39411cadca64a59308caa36b3b5ddb8e1d37bc6f5c5b21b7d73201df870bf84710f0174415f88208027f1f02fe426e2b5c696db5dda5b01a874f91eaeb94895ad9a36183b33b179c63119c1771c2d94395e355aa575097b4968df7498c1713f9c06cc105e68508cc8bc304e6a40882791102f3923081393e82609e8fc0bc344c604e882098bf46605e162630c74510ccf310989787094cc631151b98bf42605e112630197b9a6c609e83c0bc324c60328e97d8c03c1781795598c09c1c41302f45605e1d2630a74410cccb1098bfe104b3bb483dad97e85fcd68317b7241f95704e5358d0965a2bb302394e77241f96f04e5b59c50f6915002db4ab513063cff17cb19d1f8ce983da54fb33b075fade2a2375bda07817a1d27a87d2de533b3adcd8cd31e4f70c10ab7676858afe79ec98f2fa4b9cb5d2ba51045d26a56cbb3e48058f496439aa3b2f95b6e0f13fb6a64896ae36155c95d648bdef4701b04e30d0dd10465d6358ae2f8671e82f2c6c68532ea1da30a04e54d9c507616ee5a676dc2c27fa28301b85f44cf3e764610de1caed577c6369b0dce6d08ce5b1ab372e35d616339a736d896d02e4150deda10a3f1cc463d6339577dd8c63d3d505ff2b63081c958c9d9c0ec86c0bc3d4c6032aefab081d90581794798c0645c8f6403b31302f3ce3081c9b8eac306660704e65d610293713d920dccf608ccbbc3042663d7880dcc3608cc7bc2046614a7845b21307f1726301997d0d8c0ec85c0fc3d27982d24982b91a360f4e6cd61278006eb0ffc8345185dc351fd9eb70e4660dc5d8ca0bc97134ad8d262775f5de87cb64a3ee973de96890d6263441d58272240efe304b443524576615b22dc0d05491bdb2250b17b21f0ee6f8826650dd9a82c4b9809621c20b6e202f31804e6036102937180c806e6d108cc3f86094cc66e381b98072330ff14263019bbe16c60ae41603e18263019a72ed8c0ac44603e14263019a72ed8c03c0481f970438049ade9984b648cd59cada3be1a81f9e73081c9d800b181792802f391703a5e315a4f36c7ab189ac478947b3099ee2c831dc17ba82d2aa78f85c77b288a9ba4e623281fe784b2bd84b254c42f920507d662411cc81881298d6e08ba2738a11b9cb1b54c759f116bfb3e9d0be45b11c84f72823c28cb2629f184044688d966977e8f207e8adf0480d75b89483e84278ade6e1d11744f7342d7554257298ffaaeb3b6f151b6a4fd108ccf70c3689f6d4f3ef62a7a308e41303ecb09a3ebbeba8e2885ee855bd184700a82f0394e08fb64dcdc242ee3323a0b7ec605ea3f11a8cf87115446a74136503f40a0be1046501947436ca0be8a40fd4b1841655c236203f51504ea8b610495714e890dd4a710a82f851154c6997936509f44a0be1c4650192795d9407d0881fa4a1841651cb3b381fa2002f5554e50fb650caa3953cf3a19c23657df19cdd5bf16566019cd001bb05d11b0af871558c6468b0dd8ee08d8bf8615d8282edbf544c0be1156601907046cc0f646c0fe8d1358d7a97b55fd9c54149dba7ba296fe4deec5637d487eba2b03205d8d4c13bd29bed908d0b71ad3632471f19875eb2adbf2f15e08ccb7c30466148fd2dd1b81f94e98c08ce251bacb1098ef8609cc287a892c4760be172630a37894ee1204e6fb6102338a47e92e45606e0d1398513c4a6a4f04e6dfc30466148fd25d8cc0fc4798c08ce251bafb2030b78509cc281ea5bb2f02f3034e30bd1da5cbd865673b31ee1f08ca7f7242d94e41098c570bf78621977605a7e75c0e17700201f7616396c10673af613b23a1099a4edbce09257dd592fd8cd768ba80e1ebbd3fe2f6a2b3c3199f688b2684231184ff6a88ca4db5d6d1dfc63a0741f96feecaeded3ccd28ee707b11c1f931279cee3114708b65e2191e5176d3ee8ec0fb84db93c36e1941e80d622ff56959c2869768dacaf108d44f394175ef57b53b6daf9764e10eca12cede24db22d92004e267e1191e4e8ce42cd06f11989f8709cc28ce02dd80c0fc223c636dc67973b6b1f6df10945f724209bbbae2d611373fb39c677713161b7c6db8e06b8ae0fb2a3c23ee281e3efa2982f26bee2122bdd12aca43c46908c26f1aa291a1dd5a00c0da86706999c405e65c04e67f38c11c68a9da5e374933ae7fb3f52fef44007f1b768019bd35d800be0301fc5dd801669c246603f86e04f0f7610798d1138e0de0bb10c0ff0d3bc08c232936806f4100ff107680a3780ec8cd08e01fc30e30a3af121bc0b723807f0a3bc08ce33236806f4300ff1c7680193d47d800fe1d02f897b003cce8e7c406f03d0860d1243493348c65956d92a605728b88714299fd619651dcbcd50cc1da8413d6fe1658973b78143b629709f73e04372c72921fec7cb64154c859b11ade1eee595cd03e812a7fd386a8fc992dbc44d1c7be0441d98c134abd6bae52aef3bb90ea3d72987003f9a1b0cdd7de8b00cd091ba051bc8ef4cf08d0e69c80f6b654767bf3542cf44659d6327a1717a4c723485b34aefd8cfa5aeb4d08ca969c5076b3b4f2895016394f7582f94af145312620fba2ee52ab86a8e6e97ba151afe69fa0b2d99a1352ef2e918ce3243697c8af109c6dc2374e2ae42da5855c155fa08adf9613d60119c33a4f7dd260c75fddc05566ff85ca6cbb709900c6313d9b09781dc1d99ebbb5b73bf62e76feae93cebcae9f7434bd5a6621203b34660fb4c1aa38dbf4dd5a0465474e283b8af48759476f223917c1d789df42c62b7591fcd8fdbb5ae8db54dd1b62573bffa259b16720383bf38f8732f1d28f26905311905d1a738123718cce3883c436467f0341d9353c6b458c50b235361f2328bb7142d947556f60bc0155eedab476337ae5b31302b53b27a89d24eb1def12f29608c01e9c007691acf5d606b85d0648b99bba57d5f7c758cf4fecc805620e02b167f8a637c6f35a4cb665e09f10acbd38614dbd4b3eca77cd8c4010f60ecf726f144f4edc0341d987bffd767793d83ae9b87cae90694a458dfc387aee08eb11a87dc3b39c16c5aefa8d08ca7ee19aaf64acee6c1da30f119cfd1bb364263a2144d1afe36204e5004e288759a04c74e72a96531b55f26fe82ead9724e7c87b6241ada51235dd4c31827d0d17d88723b07339c186d3c260f0b8527e5eea50ad8df4c923ed1170031b6f3238aaf0f545f00de2844fdf64a09db7a0e2e28db6653b9857dcd708d8c19cc07a3b2aa3309267c99f81c01c122630a338223a138139344c6046f12cf99311983b8509cc289e257f0a02735898c08ca29ffb8908ccbc308119c5b3e44f42600e0f1398513c45ec3804e688308119c553c44e40608e0c1398513c4bfe2c04e6a8308119c5b3e4cf46608e0ee7f21a23ac6ccb6b1d91f7f0184e58075a60758fc1827d94d56237390db74eec68e72a3741e5363f9ce5368a9791fe8c602d681c4fe2656283d8e8905be5248579a7682e0e4f40408e0dcfe2701447efbb2328c735c45e363dfb599172b5287a65f23104646158808ce2b4f10308c8f1610192b1b96103723b027202ffba50e272c6a2fa5522f7045136f82671c1d71fc1379113bea149e5d06d6ac009011c0cbd9cecc158e1d95c693e42404f0a8fd73b636bcee64af31e827232b753ac7d29d87590ad107aaf1a1b886cbb83062010a78467eb00637964db3af0398272e7861848c60f46c97420c96831d90692ff45b04ee57695315bf628fb7a7441c04d6b88aa1d6fd30b77b06efa7f1094bb84efec0ec60e3bdbd91d3f2248a787675a238a33ef8b109433b84ba77daacd15c8ed086d10d1bfb7701482742627a4eeed70909cbacc8c0dbce95ce00d46e0cde2afdab68ef96ce7af1ad5f989f231123b23288bc2b55d80b1d161db2ef01282b398bf5adb2e69ae5649a2d7ccc41078b31bf324b8a8cf9e3f8a809c131620a3d82dbf1f0139372c4032fabbb101f91602725e58808ce232c49b08c85dc30224a36f301b90ef22204bc20224e3ac241b90ef202077e304b2aba00687300b09474644b9239e8f60dc3d3cae821322b9bfe71a04e6fc308119c5fd3dd72230178409cc287a085d8dc0dc234c6046717fcf6f10980bc3046614f7f75c89c05c142630a3b8bfe72a04e69e6102338afb7b2e47602e0e139851dcdf730502734998c08ce2fe9eeb10984bc30466145719af47602e0b8fe71a63f3c3e6b9f636827279789cae18a16473bafa0c41b917b7df6faa6d26d19cd62842f0edcd7d37851d3ef3bcff3d9d78f7d456d87516e539a34204ee3ee1dc59c638e1c1e610d83a168775dff0780e45b1b7b92b2aa1fb85cfaf8d115236bfb61f10a4fb73cfb767eafcc206239b5ffa4004e301e1b39d85bca593ed2eaaa6c8761ed890e7bf55885a74b0786adf22c6491036cfa29751795d112e472dc6a9633638b722380f6a1c17427d6a66d45d5977415096729f886defe22f743e5b259ff42270d4419d84405dc9bd29c50e6a34811b87805bc5dfae974ac6a5a85aef98b752cd44b09635ce381e84868b6ce0a210386f638e23de1a277e89a8924d529df34534c11d8ec02d6f88be281e70eeb81bfb2e40b0aee684b5ad8475a56a72ca9cc44b843e13267a23a36108b6359cb0f517998e8cf07695f1f23f6b891cc1353afa0e417b70f8069d51ade8df23582bc233611745cfb90508ca4338a11c9465099de5fc866b6e36cba127e314099b7d6d87a6480ee5bf6b2d71df2458d24dce7809feae9142958a8d11ec32b542e5b492fbc63f779b55a55a4302e8cc35a5e895c2a108c0aac6b966d63cdc249a9df7c908c86aeef9f83878899ba3f5bc6791fccdd8eb6cc705633304e3da86e875c27011268da966679efaa0c1ee37bf810bda2311b4ebc2e3a5342e921da4c31098878509cc286e2da84160d68409cc286e2d5881c0ac0d139851dc5a701002b32e4c6046716bc10108ccf56102338a5b0b0e44606e08139851dc5ab01f02736398c08ca2b3d7fe08cc4d6102338a5b0b362330378709cc286e2d381681797878b616308e7fd8b616fc1d41794478b6163042c9b6b5e01704e591dceb93254e92c5d2650bd6cc5d0f4ee0103dd7ad0e08b6a3386183ab808ba54f112c3e54399a958b4dc2bdae06446183ae0d1774ed1074478773fd91b1ad665b7f6c8b56748ee184b58d483e4138aa3702ec84cae2164ed07245a6878ada17c7a2b92c311ac17b6cb8fc85a3e87efd1704e771fc7701605fa264e756774360f4d61c7b23108fe75fb47597c4ea6473b3639cb8de15017842c39eb83e51d0c79645f168c76f11942736c4f96fd4f81a03c938b66603f27404e449610192b117c906e46908c893c30264148fbf5d89803c252c4046d1469622204f0d0b90513cfeb60c01795a58808ce2f1b7ab1090a78705c8281e7f5b8d803c232c4046f1f8db7204e499610192d117880dc853119067850548c6650536206b11906737c4ca61a6333f8c9d72b6799fe71198e784094cc6a1221b982f2030cf0d1398519c91fc0302f3bc3081c938646403f38f08cc5f8509cc285e82f43002f3fc3081c938746403f37104e6afc3042663679d0dcca71198178409cc281ea1f30c02f3c23081c9d8696703f35904e6456102937128c906e67308cc8b39c16c2dccc5daa82ecd0e41905dc2bdb2385f686f8cdab4c7e544cf43b23582f2d2f0389b3236316c50be8fa0bcac213685eaf56ed8ae4c6f0ddd11cecce8837cd62e6f585782713bd832d937a8945e111e9768c60acfe612fd2582f2caf040c93873c906650eaae05785d3d797b184b2d9cde608d6ab1bfa74ace50e1ec58ed865c2750374c32227f9c1ce671b4485ec89d6f0dad1b3b8a0fd13aafcbf09cf314e51dc24ba1b82f29a863886397e9a46e665941158b632ba11017b6d5881659c346603760302f6bab002cbb8b4c1066c1d02f6fab0021bc5e66a1d02f6b761059671fa8e0dd82d08d81bc20a2ce324331bb04721606f0c2bb08c830236608f40c0de1456601917ecd880dd8480bdb92186040572a6cab65970859c1684f3dee193e8415985a0bc857b93ea1259fa6a1c8a456871247a2b492d1068b78667481ac5034d1622286f0bd786d4283a267e81e0bcbd71ae015b2af07908d1dc263d5dc2d822c7203e378978b12c33506ae2b79ed53af1f344b99cdb04445739cff365bb5c270e72cad57ece3f6fd81fe0fcb3c5c76270eac51c07ee753216e89549da5572f9b9d2495f30d2497207148576aa28e4c94b45e319663f3336cfd3c9b279ea58691def1ee20b87f9d608b899c3851564ac5569e394dd342b659a228965b5dc7f0f68e4a56837f2e486de596a557899f3b64cb8377862596beb65cb64577f9ee795e854389528a30d16659592a597937a91a5daa4fb2eddb12379f2ce1e7d7b5495f3ed3a29a9ded69c174b75de0b14f698c4134a0f705de0bc07095c4c4b1d7e7ab374fe2827596ca2f3cbed658ea9ef5fbaf5a14a54a9271d9f9e2694eed4d4ee84221cb35bb3cac0ea653a8d5c5302dfaf766477f30662d3699a5e3fba8eb74d912bf970a0c30eadff5d90ef2adb6531ed214d02aeee0b650506a1e027e7ff0031210d8ac9850200 serializedProgramBytesString: - serializedSignature: abf6148c0f4104c1861db352a563cc38c5077a29d20cf7ea724b17af78f90c76bfbb092127ec7af2aad39428ebfcac3275e84580e7997101be0ebe8c2f564902 + serializedSignature: e867f892a4936948841cac874f183dc30c179d43d4129ea8aee59eb9c7a5a1a8d1cb62ec0fd4793690a89cf9735da048bff5d38ce83623597438a4fb626ba904 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset index 2f3a0b8..d2471cc 100644 --- a/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset +++ b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ceb53144710ef3d590e8e973c0f05a3891a310a7b3cd53c4c0011898816afaa94953a0f38f4125ee1c0987ccbd7fc47f97ff2317f42aa4c77ef2c37bb37b37b0b370718ef8adddb79f474ffbaa7bb676635e1007eacbb7859854598862158810dd8851dfc358df76dfcba4f5ef90bd8c7fb6bbce6b0ee2e5c8be8499f5b562f5ee7f0a90807d8f310d6f15ee0fa25c8e3ef39ec9bc7272addc4bf3cb6b2eab0d30a3c82e7b00069ab3b82c42a772a8a328be4b21af03a05bf616d9e99a2411cae4ae365096b8a5cb78d4c7bed5ec28f2cd636d6ad639f7dd8429a6b4cb16103af16cbc4b77671a7711aa5df96f8abc7bf2ee999fe2ec21109aeef969e49e2bfc5f30551df233d5ba20d95a74378f0fe9252992df124f3d72b7e378ae74ba22df161bf7ffffe5f51df21ee2989a6274b93e87b596a2397f705786d9168b448b4a86dbf37ae6db1053c419de4600f9c0435bc1dc354bd9ed1464aa4eb134209b778d80334873d24a0b09415b6c303188511a5a55cb29a25bea7f99ac31605264a830586f8ab6c08626e0bbf79c9cc8b583ecbb3840cbd803543308f77eaf50a86d1705f06a8ace2b05b3855f2b08cd73da6f70ad92e6f1925124d89609f45a4e9ced86d2cf100ddc3e72de67089af6f99d33c733f876507ec3f76d0834ce1fd1d8f562efb3efe568db92c2053f3a89eb8ba72d73d786a7a84d210f70ecfb38f1a390d8db0cbbbe2f94287e688f56799263e62e83a199b03a24b63d80d49beb21170d8e72f9721185fc67209d5f64d75bb4c25876dc3e451a3432abfc35294b40cb65fae51703886f547c815862ad11be0ac242effb65d97212e83f85b2afc29fe5a4b35c47f09fb509bad086b52a34fb05e0da20f0a0564ea457231a0088f513ce8104c2810cc244566a364ab31c01635d610bfa0520fa76aaf8caac7cb3b9630c03cc5ba1cb6cfb313a3f2174831876313bd491ea194abf87b842b8e72a9c100426aa5a5586937a42ceaa49ce9d459a7429c93be3f6a8278547638cb0b983cae2ed6e02711d6bd717739a413475e7ab088f74de682cad78569878f15aeb3a6237c4a3a7338719e8991e39a978272d904db4e0bdbce10d0aa6c4764b333ac81028f34a4e48646d0b5f7b078c66bb343d6b66dab2db795473f5bd8e86cdf56b932b2fd3685d23329b1fa71516e6739af29e5f47e4d61b73748e02d27a287c8b38a574432e8215bf51eb25e355f9b6a1fc00e3895a676f10358072fdffcf05a244391bb6f305b512eb2531bd7c259d3194352056c73ad810d4ec978c076551c60ba35e8458daf43af41851eef19e48ca2a77359b4a6a07e257b0a7370d43a1cd99e8a914d33b23743dc6f7cde74a837ea1c58afce81d1b6518a7c572ca793526997da5bd953d4ee32fe7e1711baa2357bb962cdf6b166af476ab652be745a6d5269950afb55ac06d5d8a95763b38a30f93d5acc9f34756f5111a7c24f2ae13aad27dcaae3fa6a15b86e531127acafa9621425e413701ffb6df2fd3ede07f1d71a64601c7f8dc13d78c0656b38ec38960e629b31fc0ee3d338ef704ce07d02e77d1cc55dd441f069152068d729eeb3132aae434598b479bd12c27d7ac29d2ac264dc372a21dcad27dca5b3869b2a6b18d47a8215de6d2af9f721c8e2f735d00148167d9f47824a65af24afc9e3d847b78eefcf557c3f0ef86c795497d35df4d759de95cbc32fd829c7b29094611c87d5f8ebfcfb377124edd1497a4b25e94300e562788135f12b47809f059f7e1dcd63dd3a139297d8d442454fb7188f23595a27d9804ab21f624be61ebf3dc7ba9d63c992d5d8ba6af916d4f72af25388e9f37a7578dc56e1913fc2c35b56c90b40777f9964d9e4231eca3be68e5acee08c7417998bcc7f1e797d2bcd5b1739ff892a0d4dab8c1c4aadb2707915e2afa9364e9774387da1c269de204e8bc25be4591e37cf2b08dff13bdebdf3986a487d5927f51d95d437233dde32f2e0d7995e9f71f8ecd3f17957c5e7446844f1f24a97e3a2f05407a234dc024f8e78bf4e924195240f62c6464f9aca62633c7992f8b5787f6186ad771f7bbee01ef454048793c00c54be6545636fe33ca618b67ce403a237a268534e7780bd09d53acb8ce24135cb87a4792e4b57f9f669f9b96d5248e4d142a43991fdd0247564ad261ccea7ef1cd39aa2b9203badbfa0b6a1f8bb612e810511c32dcace9f63e3d24c9ee61dcc1d4e8c36a2c78bda3f1a6402de995f15dee120239b44ce3678315fc42f7d927622437a18360916652859d6899b0dc85065357b99e701c07f18c0a41d201e5c3654eb658b4af792cb1d4c1bbbf4777c4eb0cff436820e87d7a0678df311d9610c444eba8163595a29eaa9a35586d01bfd9f07a40c05a43102a1cbf3dfec37c64dfa8d246b93f449533d8b1e3d30c2495e9968f4f987964ad83f8e8fa8939cec8449b09a05580570df2925b35f67b31f31075bbb29d81a25d8ee9d0e6c63e6604b9a82ad5982edbe49d81a046c3ba2c0e8e4ec3405579b04d783d3b1b2e17338396d09b62f4dc2d62460f36f831ab535db14682081f69549d0520234ff3e80413b33e6cd1212645f9bf6668758216fb718832b6d0aae7609ae6f6a61617bbe1d7f839332650ab20b12640f4d7bb28a16bae7605a5e9440fbf674a2e6a839d8fa4cc1969260fbce246cf5c29b79dbe0e70faa0e09aac9d3b13083decc58006890609b32095b8b808d063ee0f735776ae1d1ba4d01d72901375d8bc8e9cfcd0cda9ab1206049903d3a9d293a7e0ea7688b04db8c49d85a056c45286de32d9cebc57abd04dd6393d0350ae8e4235683cb276380354980cdd61a308316662c0c2425c09ed41a3083bbb4c682402b7c30076019ca39e7c077dea4da1618284bafddf3a376213305a7679c16e5b0478eefa5b32487dfc8a473803867dee134a30f7abe27b12cb52d6f554d57d538bc52497a9283ace610ad38fc12eb872cff5359ef09875f7e1dae82ed4573340f71fe030a537b29674fb7eebb917bdc92d83c896dd35ac24fafc0e33a3d67d3aeab27fb33bf5da78f6bd7f1395a3069d72eb5370c7f80f66c05d2a9f51094b9d46a8feda1f4b6a93bcbdf00fdd3d56824ae583d0021d426f1e935cb5a60aadbe07d92b6f74df3545ec1beae67a177a3f7c5a4a68ffd1f253bed9bd0490000 serializedProgramBytesString: - serializedSignature: 4eb497e40aa5f557288a992bc587830d06206c44e5e9054d9bc9ef29f7365c8aac73ffc277f9fbee9609e75ef590bdecca19ef400f39e4482bd55bbe05541c0b + serializedSignature: d089cba2c03048d37e1a800e95f6081f67da0bec2fe3daf862d7595f74f01251d020fce09a9f9503dbef4f82aa9414d3c4ec40f8c35cc6aae4569170dd3cf700 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset b/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset index e817e43..12188d3 100644 --- a/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset +++ b/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9dd95b1cc711c07b11cb6149800e04124842175a09c42e874e747148802c24848024961c846025b001c91cb2e53897733bca7d3989731fcee124cef1907c5f1ef23fe4312f79ccdf9097a4aba687ad9de99e83dd5aedae0d1fdb3b3d33355dbfaeaeaeeee9194ae242fe445ae5c78418157da24d8c8b19f1402cca6f7d325d90bfd6969d3f2296647a5f7e4ec97dada2c9e74cf8391ca9979f43726b59acc83357c5b44ce770ff4d9194df87e4b949b905b9f7e45f521e152995278d8b7e715d5c1375915a1f111378d2b2ca8b805e910af9d92b1ecbbd492c145c248ebbeae4c74db96719f72dc842dbc7dd12cfa35a0b72dfb43c6749cc4b997751624553b9c02fc24a2a545a29ffa2426cf88bda2e55e97ef95726ff2e926d489f51f93d8ee3cb557eafda2e51b22bd4777acd4d8e6b460db2edfc032abf8f6c437a50e5f7abedcd2a3da4ae6d7fb78f85b4599d73896c4b1d226f3964dbe71d56c75f26db90c61c7c622a3d42ae7d441d33e0905945b661ffa0d2f53f0e3d8e12591b1d3a0f916302e8b7e14db55dedc3b64ca55bc8b56d265bc59abd94d6a83c3b6d21c76f2379901e735ce3984a6b89bcbfabbced2a6d25f25a356c77a8b4cdc1dbce8334aeae7b856c038b870ea636c3843afe59c7fe764d59ea1ce75c75ecaf57f9c38e6b54916d52f79177857fbbb1db5a8748b7bd0e95ee14faf6e3ccd75d6317a977481b537553f65795d7a0d24ec2a353a55d8e3aee12299ba165b8e638af86c8d2954b9757abd2dd2a3da1645f27db901e27b2f7a8f424c93baed25322bd4dd9edef3439f6343916d23322bd9d9db1eaa7ec35876cfbbc6e75fc08d98674af4acfaafd37c836b5f3736aff28d986eb55388e3faf8ebb49b66dbda99c31871c7bdb2ed705a2fb05916a9b5e7565eb5a45b6898d47130e9dfce4e9f21a45ca1641f678c8f3ed6b3799ae1d8d60ef3d28fbd329f150c4f144f02c41c30cfb4cff00034497c107fc1cc6cbaec8aefca114a0e9e5c7318658912da743dbcbef8c6c22e5eec3cf2979c41c0a9d705fe26fae4b40e1e6e56f928428cb327f00231c0852e6e49e36e9ece6f0ac3bd235de92bfe95226e465e76598939446b62a2f05f2eec862bb8ff45309c219e739a352a6156d2dc81c1be843b93d8f25bc899f8fb0a4492cfd90cc5bc1d86f51467fbd327d05afe6d67d497ed75d734c21d397511f7499f2add0ceaea67ea90d943ebe01ccecfd1a791a3502e8cb2654332c8d632ffb86ab26de67683919082a86948c76441649cbeb10718c3b465d04c3ebe8d6506fdf16ef1332e8f0d2454f06aabb013548d5f03fe6efbcfafadb0dff8ea6abd629e2181e37faa8e60516e4c5223b5c12bc5588464b13505027fe880e3f0cc522377388df3a6e0e8f0b5f0165d833a557400442886bf28011f93787c55e96a74fe309e0f95c35930031e508d7dd75fa15d084b74487b722d778fdfd8917de8a35bd5278e1474fb0d240d0af0c26821b740431eebacd4ad01d78d9df7ae5b9b392c423ec4d57e5f9ba40cd9b294c541c7330d5f3dc883c9bb4e163b812990897ea08430123cfb3121e93435b6b46ad4d7d9f9469521eb182e51f97e758a167db5afe304a9d55e77933de1498f16664bc4f882c94c94439aaa38cf3032fb0524e95f812ee9dc3a80fe2bf29947e5db6bd17547498ae61faf136d5619c4a5cc59278f3af0accbf1af9b7e1608cafb4a69a29d3d44c026aa646a740a5430128bb4170b94e30646e0922b8dc2cb842271832b76a5cf5ffe48f4b78a55978a549f8368d7098a40a23fc195d2b80861a19cb617f08fb1ea09429796cf81e11a61d5a9c0187deb46bd1b4eb5dcaf917c164ae1b750871c269fc29456ca6bb06de107704760f75c870a76750662a8389e2269395d76bacfc49482bdfacab229cd3cafd98667d311fc0ae0b1cf3ed125e4392b0115f95ae6a20b34153a888ae6a7699aba6da54ef8d9a7a1f2c0957ef35a69e6477863dc91693e03d190adeaab3546434c76aa9a67e7b0cefadc20cd53db494852cc7247b033b9d26b469b8d1c45756530bd86632d27d1a237d33a4916ed70987e3f707b1a58d66c1b53a5baa797ab664cb7c80db8b598f6f0f04b6a583beb69479594db6b443572be84f723903e18cdbc3f5468702936e16fad907bfeb9be8d5e91a0b44e67017df35e7042d6052fe26e49fe5195e4662d00f828f807d704bc55a3f1226e2af379523a62b471529c790b2a139dc3d275ed5b56a8f2befd45d19a227b8a3e50c82dd926bcd927799bcdc518d97eb2a0de7e51a4c3d664b863d66a349706b868277eb1a2af6cf3772d850834ce9eb1b29b8b74a87fed85b681b6a1b36d45a97669e33df06727b7455029bb05cc33933dff2cf7ffdf749fded3e57d544cd55b3d7d4fa12bad6b759b53e80724f664e0afb86e99cf4d661da5e93c9d6da33b4b57d26c11d190ade6f12dc99a1e0033ac1707c5710c14d66c1077582c181c2fa0bed1028c468e39049f8892c086fd60907cf0c2b3532f2cc874db04f65083b66328fd3199ac7119df3c430fa1eabf33445687cb3aa6774a4b42eb61b5d2c74a61ca53439e3a326933f9b05936f31d9cfb90ceda7552718c28bf341047b0c8a8e999ad2850c9b529b4e3058fcc52082bbcd82e326b7d293a95b49e82443f7d71ba4c81efd64bb4e3074c37d4104d799057798ecad3f437beb3409be94a1e02e93bd5dced0de8eeb3c2cce25bcf8543cac7bc46c4f0167cfd70e04f6b583e86be31ebe363be53579dd13ba6adf8e9b01aa7dd05ced277582611396443b636bfb274c6c7d4a7701e82f600d75a6fdc56993f0ab59107ec6e42887337594dd3ac9d01b5d0b529b1ebdd1599d60980cba1e4470b359f039138b914c599c3719e08d2c19e005dd0560da723408938366c1177582cb85b5b2da356a3c6bf41d6ecfd186e3cbfb021efd81d47d6f1cf6eba5e9eea487e96b7b4c5a8d85d34a570e4b2feb91a61eb55ef591dcb272531e3afde6a973ef04aef80a37d2ee356935aed3aa43d09522ce75229616cbaa765654aeb394f4e6653634e8336930a1d3a07b1df5727f4d23e77d0fb3b5b9ef9184d1a9dfa4d3074cb512b414e91a4d8b598c4d66b0ad59b18bb34e52f732c36870c9a4c107751af40861b8a655de07d20b4ccabe0b62a665a9d5acd6fe536799f3bdda5318fd2e9bf4fb904ebfded035348035d4b7563f5ebaf2d8e08049c3e7741a9e316ae86e4ffd588f56dcfbd8a3fc4ebf9ea9a7183469744ba7d1854036d923cb30a3ee333cc88a4daeafbd0d9974bbadd3ed9043b71e5917602b8f1dfee12af6bbf7e5f7d92c95f38aa99ccfebca391ec2aaacfa18c2bd2fc9d3adbb3e2b212c2cbc15aedf7f3c6be2f061938737f5a1ceba1b507517d4dea8ac301a5c356930a9d32029ec75bcf6aa5cfa3897553a181bdfc307afc03f0cad1d79096321386214eb21a9a2a3a5b4b829fd19f509bcdb08f7feee62fd784721744fb6bdceb089d31d93c573725ac4be7e153502b9a973b8e3b46b260e533a0e23a17b4cdb0aa670eec0d628a80cee38fbba49fbbb3aed9f356a6f1a13d9f18273efb2abf4f68d46331db794948f09a3f38849e7e9203e8eb6c34c7ddc7ac77c374c1acce834788eb1ed0e64ece3b24364d44424a92372d9a34e83f4da66bf1cd463afbf87be69d2f45e10ebedc35ab56ad0d6754ce6a51e56f3d64f67d97056180dc64c1adcd769a01f83c135694d5df2a925aa9f293f5b35346ed26f56a7df95b5d669bf50664a5873f55378b6a5a57e5fb859a56ccc4195cbdf48c4ba31b288edf871da137d715c749858d3c9ffe17a60be20af0bacc7d67c86ffa3f6b086d1f4a8bdfb1ef37a9fbaf6d342e73ddb88ffa4daf9eb647ec2bc5c6964cb92a4712161b1690acf5e956d50b55a12c7e57e2debb426ff52bc48afe6fbba06bf674e2d01d7545bc2463288015952d0075d97fdafe4b73af2180ab023a62cbc6702cccb9a325812d664d63b124b79b42401d2e6393155a1805979c0cbb208ee359a85006b45a4602d70c2da4260ddc0fe6379ad918fa1639f0fa2631e201388ac3cea10ee8cccb2f5be0c3fce66cf5b8d7ddd2b38ee584279334e4f8c8b81f3ade48bd40e63012d27e6db1c631e7e2d151ce83bf50404070fdee3fd7602fa6d785f59d945bb9b43bff112a7dfb017c24f2b80cea10a0d8313ceab67f2728cca344f120da2da7abcc91ee280973841b62a90f3f2a0791c7da43ca96ef626f83c0f23f6262eec5d04fb3227f66a85fd047e5a838d457968eae10d3678d55cf01a09bc955cc03b5544f0f61178ab9cf060cd96eed1a131612d9e1b518f154cad9d5a4818cb08c6479c1877f87440e973828cbeb09c0b651d41f93227ca3d0a65aa21177b377380a07d8513ed1147ef3ee768ecd6b829dc9c1b237036b7d042803fe6045ea780df4fb3662a92167f52061c6c302bb960ee22305fcd2798ed0508731381f9917c82c9d8ccd960561298afe513ccce0284b98dc0fc683ec1ec284098d504e6c77201d314973a575c3036f35a2e98cf10981fcf27988c1d101bcc9d04e6273861867b77051bc83a2e901b09c84f7282b4a73f3a733ffdb1910bde7602ef754e780d22e860337dd4c3d8b4bbb9a0b611a89fca47a88c9d0f1bd42304eaa739a17abfe5a3f06e690802ee339ce0fca6e60a7f9c5341507e961365f0a939f75a5656b407b9d05e20683fc7dd8b2f8af4d7c70f636034858f852c15602fbe81c0fb3c373c3b962c963b403504de177201ef6411c16b22f0dee08407cb4e5e322e371913d6b3b86c003773012c2500bff8347be7f41b678c733d6c37cef612944f3851ee0ddc3bebefe430c2656be81d04ee97f2192ee380910d6e8cc0fd723ec32dc47b90fb09dcaf70c23d1018ae3b684f3d00c60a79900bf20902f9ab4fb31bcb99bd3673a1dc41507e2d17284d777f0a7f294d82a0fc3a27caed3e56696bca8ab18d0be36e82f11b9c18ed115257ee47486c131bb504de3739e1d9f7794ccdb9d097669f2720bfc509729f0624146245c03f605b145784f58f598b6d76b38400fe3627e0fd227d75dc34790b50712f403c4c107f2717ce20b500d1fc2a014690bbb8401e2520dfe404d9ec00795738ff23e3a4e39d08e6ffddc88a9a6d72b99ba0fe2e276adddd4c533c9aa3f112dba2857602f57b9c50ed90aabd88269db71078dfe78497707951ddcb136602bd66ab7826543a09feb7b86d57b76269047393f2a4c2831725f07e908b86ef5ec6b0a80e29bcf17c84c0fb2127bc606329f6d5ef6ce1d32102f247f902b210e3d08304e48ff30524e3aa773690a709c89fe40b48c61b756c204f11903fe504d928d283a3158c28ad37ab0e89fe229b7d3a49b0fe8c136bb8fbf48c9d0f5b2f5e4f50fe9c1365660fb832a26de2427b8ca0fd452e1b3f2c8d4dbd8baed86ec99d25587fc989d50eda8f17d168bd81c07b9b139edf43d7f622b1629fb06b25c07f950b6bedc8bdb5b279d0ad04deaf39e1057b9352e10e31ab08c8dfe40bc8421c626e26207fcb09d239dbb96af48bcbefa1954dc709fe7738f1d709ef8169313c41dc4c60fe2e9f6016e213c47102f3f7f9049371da840de61902f30ff9049371328f0de63902f35d4e983522f53cd28ab09f06c9d113ed6c1324e5a2685e699b80c99e3f8209942a13880578022f16f0719f58805b84b1506fdeb3de3cbb45915e94fa0e0b98d09c929a4d619a7a0b6d1c5ee1108195cf615e2aee2d13387b4bfb13c08ce8dbd37cd62c241bafbdd569eaaf9fd9da3679d44a1cc2efa2d6ffcf50efaadad14cebf005c9e3b2e667d44284ebf2e0192c14fc44ff0fc073db5908a90000 serializedProgramBytesString: - serializedSignature: 12a1d36c4307dc6a23b0129d47ba1e0d780ed5b95edd48b985f404a98e237733bbac32de778add627e2ec181fd2772c02e747a60abc6cfeb24e6916ee90aa807 + serializedSignature: 4a02b00ca8e0b725beea3ce2a765d439bc58470213f9cc103f8a958fc1408caa35725747b32539a626f3d88f04b23ede04d0e564295cb83dd0c81b32ba50d70f programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset b/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset index ce43a75..41cfa32 100644 --- a/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset +++ b/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59eb6e1b45143eeb787d895dd25048280dd00bd0ad285db745fddfa40482daa6ca4d42154a9d64ddbab55dcb76a2f4157821c45bf004fce62de03b67c6c9c63be38dd3dd824d77e5bdcdcc37e77ce73217677cc2e1dcc4658bd668896ed126edd16b6ae16909f7264ef5d6fffe843ab83fc7b58ab29b7439a6251fd79d4f705dc15b977a68b94fbbb8d7a57c9d023cafa06d8037fe5ac32f402d278b469bf48056e931cd3b1fc7406c49a3aefee6b05e4e01d7457a83d24084e24e7c299ac7651d255d296b42e87ebda7f48ba8d544d92eda74a801cc1d412c2c705bd1496e257dcfe057e4727e761d91fc476055a94d3e173a3746a0b8df329e5c86ce65943c6099bbed418d36000c1a6e0a7f3dba4b778c1a5e74ca21b997e45a458dba8096a35dfc1ee982856be00c42e6e9e2fb0f625d36501d25b7e821eedcea19dd06e14f0750b6d06d03260e6803d7b6e03d83d8d19a712ab12907dbac0153795a135ffa84b6f1de1009d7e57a20920622fd0abef5c4ef5bf0fc45dc0fa5b7a8ee1d3c9bfadcd0949965343b9cedbb72ebbe991e401b96de9f62377b6f917fc3224c7daeacc330eb738c38bf462cf19e4395645c49e40ae3b64aa527bedd219f5f9db50883a3eb18d5d0ecdf8aef7bf4dd505dccccb0b92f8906c716fe63e7af3f7f5bbe71cd3da9da5df273acda428c6ac388653ccf998b200c57c175b3151674907ec7447f9e3faebf43fa55bdbad41bdd003919994e1a4086bf0d3c1ce2d7902e76a572703487698bb83c983d924c1ab1558581f3427774308d13d94678c64478e15d131e9f6186115e38d2eb98703ecc0c162d0cc6c9606370cac06085cd346df20391ab382017d7b6a0676de8a524d05d1b7a3909f49c0dfd5c12e8791bfa0749a0176ce83349a0176de8e793409fb6a1cf26815e32a1335d1f1ac2f06f1c1170d6decde3741c06fb5ec2ae83607c8270abcb5b977ce1a842a75fa770383711a83cc1dc80043b9296e2572d17c8be6aa945d2c45927b0715aa8e4c3ed6bb2cae94f8a4cdac5eb649face7b5467d2c302dfe32699a7ec456d56b63caf8e2b5df9cd19be2a5e0dd80dc94d987461fac15c063d9d20000e7d16d695e9519422cfe2a305e6abb99f0bf1580feac2e81853a3bd57d10b327e37117271f1ce203e0cb8979d9d9666cd17898910c7408f15e0bb9019418880f1e0cff7392cf85fddb8bf8c8717a35a7c50aa7d7f9ff79e6ab70e6e3bdc0a3d572a6c2945d4c339a590cae7ca0e7fb3f0ff6f036abb1e289c8ce9f46fcb344b72bd1adc8fa344db266058d5dfa39f1aeea7d546f6b0f5cc377e587e347603144e0a53409e48ebaa1b5e6b26c9f8e1f61f910610b6912764e12e9b6745c4395ed23ec3ac4498d38372de22844dc67691237a789dbd503430fcf61c0b0f0db54498fca625a549642547e9e26953c2cf116106fcabec1f85a95d1ad3a86619b0b51f6459a945dd1dea7968f2d09dc8e0c19fbb8b7e827fdbfc4a4f9642644f0e534099eb1e6c596ae327edee984c8bb927e401fe89dde257a215398576348593644d9d534292b09659331db2b8448bb9626693c7909cff6d43f0e2a078e63804e8588fb324de278cf985793fb7a79bc88a71ace40444971de971a75d334311b30155e9d7fc5e62f68f37b319eee5933ae67587f7bd6099767593f7943d29377ca45ab17eb746a0f67565bac85f68f04af8ab2aadc8ff7737c26c4b947a36d700ec78cdf6cf99a429b50039ed648ccd392d8403269fa369b49e52156f1d9b013adff75b6bb36bbb8e9bc04c4262cafc0035a45e53d118a0ff71f8d69a006db270000 serializedProgramBytesString: - serializedSignature: eb2d669e05ea0854623988b88c4a713e09d0b12b658b0db7d5a9920db6dfb50355fb54ac59820311ef206043443571ad36b6ddc111e1ca757d437a4d3d648306 + serializedSignature: b9ec796e407e0628563795d3445d67e9a7312b2931675ec99e636639396fbcd1841031796ec3f06f789a648b33bdf0a81c08150cca5a2dcb3d4356691a403100 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset b/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset new file mode 100644 index 0000000..afc746d --- /dev/null +++ b/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: dc3ed24bdd2e124499328dde1c74cf8f + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed9d59531cc911807b10c3a10b0909d02d245680403003e83e574208a10b1d20db7b58cb0292d02224039225df6bafedf57a7d5feb7b7daeef23625f1c8ef09bff811d7ef19323fce8773f38c2aeccaed6647757f6414f0ed37887d0d4744d7756e597595559d5d5a38a9ca55e993deaedba75d5eab7baad516bc2ba67cda84ffd2abdabfeec2327ffb235abd25bea7d4c7db7c76a0eb9125e6d990dea7d481dcd59f3eaca07d6b84aa7f0fb6bd6a4fa3ca4ae9d5447907b53fd9b5467652ad545a3d6696bd8ba6435651a42445cc78be6745e06f4cad4a8f753d663f5ed24560a0ac9e1574deaed9afa660ebfbbab2aed9cf7acf53caa75577d37aeae99b5a695cc175162cd2b55167eb0ec24abd3653a05a9b5fa73954e3790bc269207e9467dde09720c5acfebe30a7d6d8dfe9cd1df3b65d67af23669794febe36a9d6ed6f927c97934ff9447ce1646ce569ddf4fcea3f9a703eaed65b58dd4bf46a7db49de36920769b32e63801cabfa66def4f0a65c82eab15ca7ceb93b3d3aefd4e94a7d8ebaaef2559db742a73bc8f53b74da62f97de02992d742f220dd65b97d6097ad57c52b1eb9ab75ba4a9f7f26828e6b745aa7d3368f8e6d11746c25756fd569bb41c7dd24af9de441dae1d1b1c3d6b172de23b793c870fc640fc9eb24799076596e9fe8b2e52e7bdb5337ea134e590ecf6e7dde2039863447aec9e9344ff2d6eab487e4e5491ea4bd9efaf57af476ead71750bfbe08f65ea9d37a9deed3d79c25c790ee25e5acd3e97e92b757a707f4f543fa78bd4e0f92730f9273213da4af39478e95ae55673db29deb0eebf3cf9363481b747ac46397231e6647f5e70be4589597fd8be7fc63fabc8be4d8d19bcab9e49653d5eca9d771a2fb71abd04682fa1a47d746720c650d5b765bfb8f47a73079aebc6c0647c8b36acc1ab3ee5b393c095a5cd4a1dcb9327c1007d155f006afb68c3d443d56974e9a46d2511ca7e795e7f61a47d28d9995a4defdf83ea6ce9842a197fd45fcc15704546e5afd4d9230604ee50f62140181c094faa65b39c7145ef5826a92cfaa3fb794ebaad869154a4c5a23eafd3eca7b4155db7f66984a103278afb9aa64da11cd5d95e300bdaf8ea7b186d7f0fd21d674126b3fa4f2e631be9a5111d629953ec2d2fcbacfaacfa632473432731dcd810d976f874f8e994e2b6da0f639ec97dfb1c8625804d0575dd6cdb03287d1da6b3e4bbcc3d0ee64b23880d9327a1059c695d76be5304ebaea23185f47bf8666ffb679ef578361902e663260eecda841c1c2afcffdf14f57defadb9fb36ed5faac1c0e295b42540b020bf2da338d3e09c12a64b39579a8a8177fc6841fa715d74a88df3e6f0acf8b6f802a1c99dc06c8acc0100426a0f358adcbeae429acbecf267910508d58fd836658d538b01526b035a5061bde930481ad79a257012cbccc046b19826175e0082e3311c428ec395182fe90cbf9744a5d7b5b917888e3e80375bd29440b660ad3db2e0f5333cf15c8b3d91838c6ab1147b8d240380f84579a2a59eba924d48f119c3509066f5a65f0a8ffaa974f782d2fbccae417cb4bddb28695e7ded15155fc96b53ab217d431ad2aac7ccee6d5267ab8a6f072895b9579f23388eb97932efd9c72ef61c40a3572a2dfab2abd89b580fc713d640697156c99354ff8142c93c379fc408c299cbc16b0cc51811e528f1e024b2ca32adf9eac0da005a6b02488d3605518e2fe9ba8a5bd3ecc9ded90b8880bb30fd0d6d9acd93bd761d9e54586f3fc1aaeb75b9fb0b7ab353529e8e9322f8936a920034e63373081d2828c7d590d1f8f71757e5cbd539307379386c81d5823ba482ec03d8b535fceeccbb9b1a8c93016fd5bc5c371c6a2159c4f6d48e8532b4d3e854b8f538be653ee261ab70b09f6a78d91fd6953687797bcae9c2fad32991bacb8d9306ae4c18630d35b8e76f6597f1d6ffdd5a67260e4861b3abea90e94338ec1dfacd6974c76bca556f3a5d6994a0595b74571e6465ef01a93606882db0d4df0ef15f19ae05ace26cd9c4d762cc826f5a61689c8ae88b6c8f84b2ee61606f7cd6a3d381082b195b5602b6bf06916b832c1905b67b2101cc2ad36efcac99dbffee35edf3fff75c1679a2c6f9af526d3a0d3957e0d6961336db8b9d81479a6dd6a052d01c59d6737709d4d9ba9b381fee086fa9bc5c86c5a7d726e07c0f01da7bb6934950b566b37c080752a9ff0565e7893c925b0abb8b928e3a777ba56bc917377e491b303dda62360e44c524bcebd3698cc0c96e88c32aa74f026de683231f6d223256cf5f0dd3d940233acf82d1f6e99777a5bbed97e5d68bf0d3ee5c2abc0d96693092176d78b1365269fa806c3ee8ee272f5bccb6d36f1c2d1e7d6a2f0baaedb2a68d757645630635be65d08c1b1a233a00749562308d9c81bb3e890c77620570baeb56c31f564d05a7a12bad556935be1f0786751dcea8a2a63ccb2ef9bcc58f63de3e23a57afc9b970ccee0e306b31eae571b1203feb433f93ae10e76ddbb871736fc271733b27785f42c1cd26c1e0f6fb8d639c5772172f79874932cc090f44a972c032cb4eae491f4cd8a45b38c88712427e8a137c38a1e05d9cf58e24b55e2b67bda309add7c659ef5842ebb573908f2784bc9b137c22a1e00ece7a4f27b55e2757e59309abbc87137c2aa1e02e8e457f5216dd26c9b0c07c3a4a95eb78c139ae890c246c22790ef29984907b38c1830905f772d63b9bd47a7d1ce4a18490f71a04e770debb783780dc0be0cec313c58be0ce999819c328d8481c7e0328797db9406a9fc9ec609d0b51cc7e9e37fb7e936038842dcdde754de715675df380a9005821833dd1c6e5c2182b640739e1c345107e886bc4979336e2c35c23be92b0111f310986befd6a14c1017dfb518ec5b5a42c8e710e385224073c6e2a6035b6e4084c36f1824f980457a338c39af328db77d005cb6e5c97bea7fa911bd6107efb3e9c9e4debebe0db7029d1ceb9e1ea15dd0b7071d6c09fe638bccbc4e130cbc1df83da346e599358df79dfc21a4fc3bf081747a3939c46ef36697480d5c85f0bb746a0eb1c5e674fbb797ddc8b41717439c5e9f21e932efdb175994ba88bd70fafe36ddf787761fa391d9f89e78161f68208661e174bc274342daac4d1e834a7d1b3268dce2cd86ac9342a86ed06384d9f33697a2d762f3a90821ef40cc7e079138349cbd9a9e6ec1da33bc7ecfba760a59bf8e013c4df434fce1c5051b9ddb75e452de08ee7433cbb5beb037ee17e0e1b8a86dde3634a77d0ceab37dd5deefe2688d6427c6590e3f45e13a76704390d26e6c4938a43e42c47e48689c8f9d863afada7ffdb399f06cea60abe7df9a59cc4ed3e63eabc383a0f713abf60d27997e59ebd16ca74f7ed17b04eb7d4e7db3edd0a7b12e2d4f31c57cf31533d4f7aea592893f66617d04fe714eddbd8cbf035e5f38bd56b9de7f47bd1a45faf473feaf15e9b0c6a9b44d561a1ade702a7c13837ca72a54689dbf99e316a9fb9705b5de4349d8862ab7e6cb376ffe7e83aa2f20a8f6b05eb67b2235c1547834b9c0693d15b139419161b98afe2f38b65a1614ebf9b26fd4e44ea2d4e2af34e7862f264bd45584f58adfe32f8dcda009e396b3d261b39e7ac1c6e78c93f1999c3f7da43e977953701d59127636bf80e7ad8ccc03d56eedf3eb5d0278cc3b4304519dd24cea0da457feac3ff3475b5d6c891a548e3be98a5a6e96db06aa5b66a450ef7b2742ed09bc26b011b88aa96997d28fe5396b6804bfad9914cbd656f42ccab7fc3189c42f8388101a7dd81c0246d22bcdcb0a7a8ba5080139f15e11716c0d9ecae65568723f0aace56e4c11e7724a1ad4668609b11bcec16c66fb3aab77984fd5c1a60bd515180f59224acb5011e060efe3035feb5275340362d89ac8ef52fa7774b03aeb7115775d623dc1bc016eb8735a23ef9ee1fb6ea3050788493c2599437e11dc670c35ab9d5fc2e1d86da2377e5ed119b647b043f6c0fed0b0bb1983986ca432c36f37f1e26e5214cba07104e385105f632f7257b9906ed05e31aa0770e48e717796fe9497e77a3d6d5f764a3a8b690fe671d0907de2709b25183b4a71733d674e0345410659d14ca6e8272b61428399f74af5e0aa2ac9642b99aa09c9344b9cde095516fcf88a2ad9742bb89a09d9744bb0e7b6b7e541cb660fdd610a7150f62a314c45a02f18124c426ed9fb7d87e73d4b504d42307b3560ae61a02f36139c1146cde6230971398ef9784b92572cfe91ed97b247db4430a6b0fc1fa48126b9d5598758ceb19071cdfc7cf709218bc1552f02a09bcc792f0362fd0270fa5d023f710a81f2847a8075308b59340fd6039423d9042a8bb09d40f9523d4fd2984da4ea07eb81ca1ee4b21d4a708d48f9423d4bd2984da42a07eb41ca1f6a510ea7602f563e508b5378550b711a82f9723d434ce9c3610a81f2f47a882b37c31a84d04ea2724a106fffc52fa6e775804dc2b92e0c2d6e8d3bfd29425283f298932fa1abd7fdbb228da4d52688f13b49f92444b579b28e034af36ad20f03e5d6abf743fc4c0ff6cbae8582e86b68fa07db53c9abce9b69c60ec29765b6e2741fb1949b4d1d7edbd0fff09f6a47929ac9b09d6d724b1b62418a40acf5488423e2f05791f81fc5949c8614155faf790541194af4ba25c1f82d2d15414638b14c67a82f17392189ded61dc0de5b46f0f3b46407e5e12e40e0348a8c43c864b33d639cbfe7fe796da2caa8200fe8224e0560d785a9d04705f34c4a4d1a35741d462d1eb6182fa8b92a89d59554fe967556253d29504de974a01cfbfe234a34f49df76c60c81f7e552f4a24e232fec2059da13d35602f82be50e388d7de70e02f8ab9280a30554e29b1d5ba5401e2420bf562e20053d520ce40102f2eb9220b76a90b05b191e9559ea1bc4ab09d86f48827556a29cbe741efb52fb473e86acd34b6c26b59f607d43126bbca74304fb50b170aa81a0fca624ca64cbd08268c51aff1682f65ba56cfc703bb9f0a3194b6d59ef08c1faed52608dbfb3248ddb20f204eb7724b1c27f1e07cf2a4dabc29de780d317c42f23b8be2b898b2e802c9587186a08bcef49c283be9d7f523ccd4fcdd51184df9744b83d722f68fea94cc1beb04f0aee5602f74d49b8d19e884fef0cbd9180fc41b9804ce30c7d3d01f943499079cb1d4b3e6017dff8d9fbd2bb2bbf97e0ff91247ee7b15a6ea5c9fd437ba230bba4606e24307f5c4e30057b583198cd04e64fca09a6e0c6313198bb08cc9f96134cc1c76ac4607610986f95134cc107bfc4607611983f2b2798828f268ac1ec25307f5e4e30051f9e15837988c0fc4539c1147cbc5b0ce65102f397923093edb74fe35df71c41fb2b49b4fe7b9c4b7bbfc85a02f6d7e50a368d1ebb8a80fd4da93b83e8b7e6046353b15b736dd692f9a5d83ce0fe2db887f60efd03a86bb52e334ae2450bf6018ca96bc7302dfc186a0effff72b89f1ee7a7c483658226c1d27e07d5cd98bd79ba683628c6afaf9a340dd78fb7e7ca00abe4f0bf0d5fcafaffdeeba64df83bbda3caf213fad6c130dee0824ac12bfb3f0e3de01c4ea70000 + serializedProgramBytesString: + serializedSignature: 336f556a4948798b1391d2bf0122ad11d19bbaf5948ba00d0b8dd392cfc79306b86663408cc4753d616f79d2038e2e58ef9da9a675fa46382567badcce781700 + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset.meta b/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset.meta new file mode 100644 index 0000000..1e8118b --- /dev/null +++ b/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ef141fe835e78a24bb174baa36a5f880 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset b/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset index b71544b..5f6e4cb 100644 --- a/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset +++ b/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1dc5f1f8f7d996e58e6ddcabdc052eaaeebd5bb862cba6d8c64db22d2c1724b9514d6f06d37befbd9750420b2190d00224f416208104121212428084ffeddeaededcbe9da777ba9bf39efe3ff9639deef66e6ef6bbb3b37daf511e737e12439c5f4bd84236950d638b5919dbcc36397f4d758e1b9d7fee99babe805539c775ceef554ed8109653c793fc6750a28bf3bbc439ab6635ce935bd91ae75821c217b172e7ef12e7d972e78c5f5debfc2f77ee4a34711e5acca6b1f96c1eeb9ce858878825e2a16a792dc1e39568e6fc9ec2763aa1e54229fe923c11d4d9f9b5c809a916611b1da5d57d4bd97211ad8d4ed81ae7992a56e9c85c2d24369b3485893f987be8298fbde4b187f3bfb9fcbbb1fcbb99fc1bdecfaff3d82d4b736f6f70af9299e3fccf72fe7f27cffbb8e78d73e4795ff73cd14193d102c8e8278ffd35dd0738ff9b3a7f1e9f81fee9c2dacbe31552de09e0dc897342e93e501eaf04baa967af92cf9e08ee51d7f9f16a197e123887b2db6bcf5d23ef3f199cf3635b79fd14edfe5ee09c879f2ab92e90d707c963ae3cb6d3189e1690e17eeefb1a8dd3d2b125cbccbe5ac8e3fe75dc9f4e464b791c1c40462b375d1a4f4b736f6f70af7acf1037fee23e95aff8f15a70cfb5f2d844323f5dbb9e25af9fa15d6f8a5ccf46ae37d3ae2bbbbd0ee8729df6ccf5cc6b9fd7bb7a664dd264dc20ef3b13e80ce5a9f0ddda7337caeb678138c1e76e449ebb497b2e5b7bee26e4b99bb5e79a69cfddac3da7aef702e7201f3551cf0f75cfb32ad3d8474f4d976e9a2ee99ec993c75b99d717dd2a8fb7c8eb6783739e4e9fbb7a35ed22afe7cbe36d9a9cdbd2cb69aaf2af49c742e6f5ddc3b478deaed9d0ed52e64952b7c759d2fef9f10ee6f599c3c075286f8f575ef65bf2bc581e9f95f79d23cf8b34bd54f86e2dbc17782f0c5769f0aabc7e2e38e7c7df20ef1bae85ebef1b01d206868fd4eefbad0c3f4f3b3f3f4ddab4d6e27ca77ce60270eeb06baeca598cdda83ad8a9f0b0d82979183b158eb11baddd571f762aaeafb1a47f5436aa6cf21e29e74270afbace8f4f30afed3fe1ca68a16c3e4b937717f396ef7769725fd7c25f97c737808e8af5efc0b537c0357efca594731138e77a6d91e7ca0f2bbdeed3de7b9fa697b2878bc139f437ea7d9768ef537668e2af64f702e7c0f736577596313e598e33b01a0fae4d94c709e09a927d37b8066da0b97b4fc1a7f2da5879bc17dc7fb7661bf732afcd4ef2c91ec6437186f1986c8887927dbf211e0fa489c783e0fefbc1fd2a0cc6638a3c666bf21fd2e2f190211e53338c8792fdb0211e3f4b138f47c0fd0f83fb55188c87aaeb35d3e43faac5e3d100f150b21f33c4e3f134f1f839b8ff3170bf0a83f128605e5f74023877f2609b71da7d4f326ff9fb24f3e64325678f57ce3eca37eae9fe94c64b0f7f5a0b7f5a1e9fd1f47846d3e31732fc524d7fbd8cba18e8a19e83e19769cf2b5f750238e7f12bd3ee7b4ed3ef39791caec9d9e395d3768896f68ac3af340e7af8f35af8f3f2f882a6c70b1aa75f239c54b82a5b2f067aa8e760b8e2a497812f326f19f8a226ff2596f4dba6e755f8e5f27c3a72dfcbda7b5ed6def38a164ff5dc0c96cc2bafc8e34c569bb7dae5c86be9eadf3398d7b67e2fdf75053877f46da7ea33b3e4b104bc8f1fdf94cfa9f6793796ea3bde6475fb0e934fe806ee4f1797d9f2f836f3daf9dbf2f816f3b601de72e3d6bed87d6f7b950fe6c8e33b9a9c77ea9093ae4f612ef3b6250ed0b8bfcbbcf5a977a5cc57dde7f6557946d9ce7bcc9b370e00d7a1bc3d5e791d549f92aa0fff8379eba7f334bd54f86e2dbc17782f0c5769f00df3d687bf91c77f22ef1bae85ebef53f5e1395af87cedbe7f316f7d589dfb694bbccfbc6d89f75d761d57d6c16e81264767a7c2c362a7e461ec5438c6ee40edbefab05b08e2c28fa52c9957557c16836b2a6f2d61b5f97db8ca378be4f10370ff07f278903c7ec8bcfee943376d3aa97c61d2f1607954755da5eb47cc5bee7c248f871adebf145c53f5e865e09a92fd31b8a6def387645c8b54fe3b441e3f01f77f0cee576130bd96cb63534dfea75a3c94ffac2b1ecaf7c27828d99f19e2f1c734f1f813b8ff3370bf0a83f1384c1eb335f99f6bf1f83c403c94ec2f0cf1f8739a78fc05dcff05b85f85c178ac90c7669afc2fb5787c19201e4af6578678fc354d3cfe06eeff0adcafc2603c9a6872bf66defac8d7ccebb7fecebcf511fd7915aeea3d2bb5f055060eab9371e9aafabbd295f5abe451f9da6f99d72f7cebead56dbd3c5f238faa5e02d36275066961629c69bd44f12997c77f4b5daf02e75cd7e7d3c852751315dfef98b7bef09d2ba33b7375ed3e4a7bf77f98b7be5006ae43797bbcf27aa83abd2af3fec7bc65d05a701dcafdafbcef6aed5c95256de4f17b79fd1a70cedfdb45bb4fa5e33a79ffb55a7885f61e3dfc70795df57b67520f50ba5dc1bcbaa9f26a8316e7caa4adf49275ca5e5d34d92a0ffda0c9fe41ca56be7ba3267b5352f6c0c711d9aa1ef0a326fb475776cf49f27cb3267b4b5276df1d9a6c2cdd8fd0de8da5fff575a4ff4f5afaffe4eada6b6fa4bfcaaf7a5ab566e6769e1c13e17f7afca5b49f4482d5fa07f1b7ba971f1b314ffe15e78edcbeaacf224b7b871a433b199c43b9595ab87c3ed118e820e39968ea652ece1d79bdc7b9efedadeabd32ed136a7c4da57d15b80e756cc93c79bef6fc7c695baa2f5ea649225bd323dbd5a38feaefa9f6f2ac4d87dd75e8a79eeba585efd6c2557ea9f4862ba6b5cf37d7d25f3d3f420bd7e5d768f6a1e4ab7468c13cf5fc440b8d9b1e9fad5ab87a9faab3a97468a5d9422bcd5614c78b35f9dbb470257fbbf7be441be66d27f8cca3b5cfd79547f578eda3c56b1f2d5e6aaec0c51ae7b65eb929e99b00e9cb7d9ff2ef981f50f59e307c881c9748b463661fd29e25f36f7b702f3feecbbc3e645f57eec05d524696f68e8e1abf8e9adc4e5a782779ec0074907958ccce8179b7b3fbee7ebbdcf7f6d3c62c135d359bae02d7a18e3d98d787a873e94306aab69cf2215d343dba48064cdeb7c3cb13f521ba7eeab95e5af86e2d5cf9902dde70c5b4f67935267eaaf6fc082d5c97af7c483b4dbe4a87eecceb43ba6bdcf4f86cd5c2751fa2d2a1a7660b3d355be9c5bc3e44c9dfa685eb3e44de97e8cd82f990de4838e64354bc72b478e568f1eae38d572de73e5eb929e9db1ea42f2feb545f71143e6493d4a12f33fb907e2c997ffb817bf9b13ff3fa90feaedcfdd5386796f68e811abf819adc415ab89c879518007418208fb9cc9b7773dd770f7ad67d6fae9a53a4f2e8feccec43f6d7741ccabc3e449d4b1fb2bfaa172b1fb29fa6c77e92811a27dbe9e589fa105d3ff55c2f2d7cb716ae7cc8266fb8625afbfc602dfdd5f323b4705dbef2217d35f92a1d8630af0f19a271d3e3b3550bd77d884a073557e264700e6d258f797d8892bf4d0bd77d88bc2fa1e646d4d787e423e1980f51f12ad0e255a0c5abd01baf5ace855eb929e9db0fa4af63a783da027babaf0fd1fa1e1245ccd3f720ce9d7b06a79bff7724f3d87fa298797d46b19471b4abf7e007bcef4e0c67debe8723c175286f8f57de10350f42e5af119a3dae05d7a1dc91cc9bffd57926630098af55711fc552e7cca8f78e661eff9b1805aef3e3188ddb185746c12d524e96266f9c6667e334b9e3b5f0f1f23816e898adc99ca83d33519339c16bbbb57633222953dc03b82726c9676e00e74ebc86dee0bd5fcd1d40ef7f03e80f9f3b8a79f3a9ca8f2a4e93b5384dd6e2a4d2ff62af7c76b43c9fa2d9e731f2a8fcdc54af2d24a682e7f8719a66bfd3dcf80cfbda7b9ff2f389e9f2fe1bc1393fce90d7cfd0f49ba1e97993f7bab8afb9f71915071157e84355dc7a817368e7faf313023e3f39e0f323033e3fcadff3b5efbbae8efb2fade37d27d7f3f991019f9f1cf0f909019f1feb7d5ee5c1da324ef19165dc10b5be224819a77cf32c96cc07ca57964839278073276f165ea3dd378b797c406296579f841aab557636015ce7c79932fc664dee4c4dfe4d6ebc0b9ff2caa97d8f26473dcfc66b726ed1c2a1cff7bb0660a9c67136f39653b35d6645cb5cdd8b54ffe0a1325c8d2b9fe8959798a3c9dba3c97bd12b478caba48b837adf3c2d4de7b9f286f7d7ee5ba0a5a936fe9e98afd9d832709d1fe76a69aaf41c08c2c1b98837bfff56700ee51da8713d50eaddc37b7fad7e0bbd36a7e4d4ca5da4e97f28780eeaa7df7fab9b8ec3559d4fe541182f68834a4e5de993cec6e4f87d02ce0f50ef83f303549daa54862d61de3ad562709d1f0fd2981ee4ca18a9e6196469f20e615eff748826f7502d5c31856383ea5e304e9b580aaef1e3c152ce45e0dcd16b845affd454d36bb9f6dee59a5e87316f1d468da12fd1de7789f77d23fb6b7214ffac242315566b778b99c7470fbf073ccbef5b14c00e8e9569322a837b8f73ef1da5e6152bdb5076b342b38d155af84a197e013877648c526b5976b9f227aa31ab8edaf3abb4e75769cf1fef3e3f563dafe6890559733610e892c9d8b2eaa35dcdbcbe6e35f3c429b146865f01ce9db88c51ba9eecbd9fc93a68a28c797c907a1f3b15e837591e4f4b5e4b2826a727ed6d92f2f7a700594ac699c8fbd76befef9ce1fbd767f0fece2cd5efa8b457f1be9079e3a3f248b9661be592a79ab3a2e619a8fed8b5ccdbaeda0daef373956eaacf428d9b2bde1db5f0cba4ed3533df27e4a9fb2037157e9216aeaef702e7907b3a1b9463b5890acd062bbcb213aa5fe53670ee301bfb9ea683ead33f4bbbde55bbdec9fbfe5a9d6fd2e2dc15093fcbfb7c62830cbf5d0b97cf272ab570652b1b811ded2bafa9bebc13c13dea3a3f6e66de726bb3cb62fc024d8e7a4e8d2f9c0ccea1cecaa63b68cf1da13d7784169753bcf7d7daf746e62903c6a9f533e9ec40cd57543e6c18e0a2e6cae6816b6aae493eb8a6faf20a586dbecdba465e3b5f93758141d685e09aea27ba28296b829acf902e1e2a8faa78c03a8baafbc23a8bea6f4f33a7315195bc3f21fbad6beb44d5cceb9bab5d5b98f0a22b6ba2f24dd2a7246a34dbaa02d7a1bc3d5e791395af37c5bd9ba6db45cceb1f32697f6d65b83fddc6bcfe742bb8ce8fdb99373f6c77654cbac77bbff0a7fa9c4bf58e9dcc6beb3bb5771da985abfea31d4066534de651da334769328f66de7ad90eedfa759afebdc039c85f13d5f8593aceaa1d702cf3b67f8e75594d96e9cf94ed9d2ec3559bfd664dce719a1d1da73db74b86dfa13d778c162edbb4932fc8ecfdea79510ed7b71e491e969510736c66b172b68a6d61797c828e1819ca741b0ef564dd1b7088b940fc17ff19245e5bc3763a8f969b76c1582cf6d8a86145acd0b80b465731df43bd7daaf8bdcab9a34208bd3391f28a47525ec195ab74fe95832d3caa9deb33c50e207c138f0a2764189be31cf9532b1d77bdd4f9e795b2c4796d25dbea9c953abfb708792b1db553efac2b4a7cbb0ffd99858e4c7737928dce1505748b735e29345c247e6f139a960bed4b9c6b35626f944d6c1d9be21c7788b7a5c6bdcaf9dbf4ce5289ccaca3795312ecbabbf5894aa6694e6cb8f679c226ff2f45f6468a70f44d79fee03f4df2440976464a4afc1f43d7c9f0c2b744ca2810c8129e6b852c4f94cf0b5308fa8f636a0ccdf6edf21ec18ad3c6c54c862777771183640a77aaa8fae4eedb5efe3ecb1bb5229627aa093dea885a3ab05c5eae9861e5270a59594df2b9a23afe8409bf18fa5b14217ef7be0a719fff04682a0a3f6f0288a97ba5ce1f3b9cff95cecdd39ce36a27689d78d92a21242575f2b9a86c0138b5f8ac4b490c71231362d1fa2edd2b168e6d82951e72b3da582421e7893a589734a688bd4b54961ac91a93ca2c6fcd2d1e39367ff4b559e6746921d2a53e6fc352a6b129655a446dfc757bfb74e9d2b2365ec974e13f6686ad10dbae4b078c601313c1967bc7b6b9eef5b36d3e6438546368e6d726ad0da6d3002398652228e65d2f8e90e07c47c3c3651db17e0cf7c998615bc1b06b4aec32d101a3d8d440319f536c6752abb9a616d708119c8d096e1f5070334cf0be010537371954eba8b3240fdb2ca4ac72eef56f4ebc3772b0eed6ccf6d411c99375ab8059530b53da70849d8c5ae989d3114f9c9698e4ce4125b7c22477092ab9b5c9a0c48cc7e86be8f52b23b9afe99c7119d98da5ab60fb2d21db98e889f527cb48e9a5761ca9bfa638cfae77386c13bd015b9de74d1d4de98976cfd8dbf710347398a9fbcb9f4618e17d4c96cfb1f7c4925d37fe6eb8f1b73509e78502ef8e4d6974705554a26d16dd2b3c39736093437f7736feee7626d3110a45db36739b3c5c8effacc7575bf44e49835d13cdc692c3b0a6577a1d30d3686f2228b0ae2225b8d8b9e6f69a4e17a115c216dc6af630d92c4d5672d2dd9d9e6e1f6668948948f39903e16921e7ffbb3fd948fbac9f48bc705f8c25ecbea66cc913b6bf81483e2732408b829e0ffbe1f9b003f6b281d8cb06d5ff651d316f961b8237eb64ca0f8265948d0dd89152bfc6c67e26bb17c994daacc8e46d627d4da14caf61be7fb01c3198995b3a99a884597e67937df0241c623246ce6468e0c8e9163618b7b02e987ac330f5f2eac82b695ed6157b593ef6b282fabfac1bf6328eb6ce065b1ac1ddb11c5f14428eef81092f0e41784f9370de781ace523ba57e727e5284b7c285f7c2341f61d03ce153f3de26e1bca1c367d1ebada5849fd6520ec6649481c92e93da6998f4c1848f36083fc7a7f0be98f03106e1d7f814decf203c4f9475c7b3689b41e631f799e29317e59e4ea8d49abc1a745de81cd70a2df8f535b2569afe5de94bb4b1068f95278aebe92cf39903f4b1e0ab135a70a78214797cb541ae653a6345697f93c1f3f6185f5a91d2b6e315be15b21380bf7f93085ae0bc81a76689acc4fa69df0d30e50951be6fdaab798257c3b78a0a09ff7b9b4c8152f1eee4f057106be76b077b1a0a1f510019ed6a92b0abc20cec2a0ced318b1968b2185e264d0ea1341d6412ce5de414836fc8e7be616a3233eaef198fbf271733fb6926b3cf1666bfd831b5b27a7461ec677a172f53a61bca94f58dfc9529fb9b84f3427c060bd8e53918933c33a8e42118905926208dfd01198a092f31085f90e54ff83093706efb078460fb79265728da1215a4ae10eb7b482d80d2f55428b73697f1cf506d157aa477807c215b66fda77384e3e3294ba72be6eef24d49ce73fb5c93fa3edc428149306f4bcdcb44709ab654219603e61b72c09ca6fe7240914938bf7f81c141e789c669fd4639c572bf26ccfd41dae06946008b4d7a729fb4d0a067be3bd0c15823616ea5c2dc86a53137537dcdbfc1f929b086639e67b1c1f334f2e9794660c297188437f6297c249681f804fe94a296677513dd1c769493158f718e6eb751b9c391ffbdd9f9cdc9ae935337b9dbcb110328354e51b0d9a9270f655562f0739d1396e3fc57b5212eb140485c2b1ce346f11c97eda61b0f2f74c2c738c722e7d8c757ee1e85e593834df6c7b3c821c10c7e3486f95013e695a160ae3fcc1cb69dad97a5558e18f7dae4bca952cadd0a6a5a39f2f92d4c7d97919767d53e93630ce613971a7ce28296fe7ce25883f03cd15516e5e0f064e72e6ee93bebd197bccc54e4188be2e5cc3c309cfeed58e13ace942c9cdc61999481cbf124196f4a12d1c918e5b0a15e3cf84b94151927ca4a661e32acebfd58b24c30d113bda80746482f9399d56672ab3226b75a90eb9812abb4938f116a134dc6cca9f1d5c2cdf57a97a9145d8d1bf424cc8195191c589756fe1cd8644cf37283e6d93e359f8269bed6a0f9473e359f8a957aeb4ca51e33a99ea6d49886a9bedea0fa2dadfda93e1d135e6110dea49d3fe1334cc2798d8eaf1a0eda509d8909df1082f05918964a0396c77d6229c1cc65a3c95c5a08b7e04ec65923aa226ee5c88f091d80b1da1402abd926e1bcc780af87aeb3f89c830b9e8371da9289e03438e662a97b8421752f69ef2f75e79984f3fbab1852e7166b7deb5fe79e8f61aa31991357cf6f9d9b97ad36366f1660a8b762a8b705437d20867abb09f5ead050c7a789b3d0448867ad1d86ac7547477f596b11e6c67686e0c64a31e14786207c31e6238f0ae8239760167974401f791086e318030ee38c8234380e3609e75672acc90177f2672587988473658ecb04499ae6dca198e05d01052fc5581f1f82e92d3309e7d5ea1332d13a4d957a399688271a127165677f89781826fc2483f0dc2efe84afc0849f6c10feb54fe12b31e1a718843fded59ff05598a59c1a82a5acc6849f1682f0351896d30d584abbf9c35286697e46089a979b84f35e9c3333c9402b71c16b4d82b94be61b4ba5d426780fb6dfda448dac19acab4795cd5fb9bf0e8bcb59a6b8f0801ccf5bfdbc6b3df6aeb34defe2930d5738fff29dff6b5206e87808df5ba34a90f5a34505a6c51e9316ed81161b65cd6a95605f7f0d0ec73438c7a4410ba0c10aa778af126344fe2a051bb04c7cae2113efeae12f13576299f8bc1032f1464cf3f30d9abfe753f34d98e61784a0f9664cf30b0d9a8feae94ff32d98e61785a0f911987d5e6cb24f3e12bd54fab2e58e6f582afdd018d9a271af1d2c8e43d904e7f774e0b3d6084195ce5f65ceb52dceb5f5c2bfec107d26e5e26a994f9f5685e97f89497f3efe92d4688a13502d3cab8ad318199fe586412cd767ebadb38de28e6a3957ca6de7b9f1ab666ee7f54ef1a49f38559be2c40de4d2da00adc9cc770f6b9acddc1f7c267a9a56730d6664971b8cac894f23db8a09bfc2203ccba7f06d98f02b0dc29bfa14be1d33afab4ce6d53fa3ece136faf39c63b1bce66695a3d87079ef089f5d873b3083b91a33986b021bcc4eec9dd762efbc2ef03b8fc492fafa103ce15126e1bc0a79030b56853c1a237523468a6ff4d6340b92f2c7e9188cd3cd21703ad6249c9775b7b0d4b2ee9a91fecabae330e1b71a84bfe853f82e4cf86d06e14346f9137e3c26fc7683f04a9fc24f3009e7639177984c888fb9dfc9ea33d9f544d37b7896bd2b933c90c6439d8409be3ba0e09331ecf718b05f30da1ff6534cc279d6b83713add374269d8a09be2fa0e0d34c82b919dc9f89e0341d49a7632ee581105cca1998f0070dc20b7d0a3f13b390870c16d2618c3f0bd98dd9f5c30c69527b2b9a7e4cfd2cec5d3f33bd8b0f61b7f025ff6c937cdefffd4826b693a6ff7b0fa6f8a30133ff3998e0c7020a3e17b399c70d36f3e2787f36739e49389fcefb736670e6bc6be40956ef7598e7633179d210932e13fcc5e402cc629e0a6831176209fb74c084bd0813fc4c40c117639c7f61e0bccb27e74b4cc2b97f7c960577be9762c27f1982f0cb30e1cf8520fc724cf8af42107e8549385fd4f23c0bb8a8e54a4ced174250fb2a4cf8af43107eb5493867f29ba04cae3148ce130ba6f938d0dede7a24d8b6232f9a5c8b718ee14b8ccf31e48b7fc3d10b9b7f78ad291db991bc1c82915c87097f2504e1d76316f86a500bbcc164816255fd86bd6281a9eb94eada01c6ffbaaadf666c99af09cbcc4b6399e1e88b59ec8da674e775a6d74d51f0513fba0913fc4640c13763827f1750f02d5816f87dd02c702b26f9cda0926fc324bf1554f2ed98e4b7834abec32499fbb17742f06377626abf1b54edbb4c92b91f7b2f13bb7b0d177cb74930afb4be9f89e034bd95f760a03f0801f4bd188e0f03e2b80fcbdf1f05ccdff7639c3f0ec8f9018cf31f42e0fc2086e39380381ec2047f1a50f0c318e7cf0272fe19c6f98f21707e04c3f1a780381ec5047f1e50f06318e72f02727e1ce3fce71038ff1cc3f19780389e3009e69eff4b16d0f33f89f1f82a041e4f613cfe1a90c7d398e0bf0514fc0c86e3eb1070fc0213fef710843f6b12cefb9efe910992349d54bfc46cef9ba0b6f71cc6e39f21f0f8156622ff0a6822cf6382bf0d28f8050cc7bf43c0f16b4cf8772108ff0d667bff09687b2f625a7f1f82d62f61c27f0841f8cb98f01f4310fe0a26fcbf21087fd5203c4f6ce6c7a72546dfa711c66618e97b34fe97899596e2c47e8b99ff4f01cdff352c9df95ad3a0e9fcba49b8bbb768b07198374c0694c32faedd2b064467388d4ca48c5d618d13bc2b8cefa645a125d601f63b5312f39468924912739d11c1bf3709e67582ac44c03ac19b585e6a9a89ca69f2d25b98cad941557e1b93dc2ca8e47730c9cd834a7e1793dc22a8e4f7309fd532049ff53ea676aba06a7f80a9dd3a04b53fc4d46e1354ed8f4c92794fd53e996497343d551f9b04f30678db4c04a76980ff0103dd2e04d09f6038da07c4f1a94930aff4ef9b89e03495fecf30ce1d0272fe23c6b963089cff84e1e81410c7e798e0ce01057f8171ee1290f39f31ce5d43e0fc170c47b78038bec404770f28f82b8c738f809cff8a71ee1902e7bf61387a05c4f135a675ef10b4fe3b263c2704e1ff3009e7f5ab3e012b62df9804f3f665df4c04a76986fd13d3b85f408dff8509ee1f50f0b726c1bc5e302068bde0df98e48141257f87491e1454f27f3073ce0dc19cbfc7d4de2fa8da3f6092f70f2af9474cf2e0a092ff8b59f4908016fd3f4cf0d080827fc2580c0bca82f7a518cd2e2f04b34b60c2f34310dec8249c332908caa4b14932fff25a6126c9d80317dcc4249857d08b0256d0b34c82796f5671c0deaca618e4e14121676392470495dccc249967ae9101736173cc9c478560ce2d4cc279c56074c08a414b0cc79880385a9904f36ae3d880d5c6d698c6e3026adc06133c3ea0e07d30141302a2688b693c31a0c6ed305b9e14822db7c7844f0e41f8be98e39812d47174c0fcfed4807ebf23e6f7a705f4fb9d30bf3f3da0dfef8c419e111472174cf2cca092bb62796556c0bcd20d33e79210ccb93be6f70f08e8f77b60386607c4d113737673023abb5e98c673036adc1b133c2fa0e01c0cc5fc8028fa601a2f08a8715fcc960f0cc196fb61c2178620bc3fe6381605751c0330bf5f1ad0ef0fc4fcfee2807e7f10e6f79704f4fbb918e4838242de0f937c7050c9fb6379e5908079653066ce878660ce4330bfbf34a0df1f8ae1581610c730ccd92d0fe8ecf2308d0f0ba8713e26784540c105188a95015114621aaf0aa8711196fd5607cd7ec598e43541250fc7f25f5908f96f0446ba3c20e99198e0b501058fc270ac0b01c7684cf8fa10848fc14ca422a8898cc58aeec30316dde3b0a27b43c0a27b3c567457062cba276076b731a0dd4dc49cdda680ce6e1266169b839ac5644ce52d01559e8265932342c8265331e15521089f86c1ae0e0a7b3aa6764d086acf3009177be16792926946d4679a047345b6652238cd7e42b3301cdb43c05182a5e28ea0a97800a6f6ce10d49e8da97d6450b5e7606a1f1582da73311b393aa08dccc3781c1394c77c8cc7b121f05880093f2e04e107624c760565b21053fbf810d45e84093f2104e1a598f0134310be18137e5208c29760c24f0e41f84198a99c12d4540ec6249f1a54f2215885f2b48015ca43b10ae5e9012b944b4d82739cd3333211cc07d111c1cb30c1670614bc1cabf6ed0e58ed3b0cab5b9f15b06ebd02cb266787904d5662c6bc27a831afc2249f1354f26a0cc8b921005983a97d5e50b5cb30b5cf0f41ed724ced0b82aabd16b3eb0b03daf53a4cf0450105afc7405f1c02e80a4cf82521083f1c4bc54b83a6e2060cf66501615762822f0f28782306fa8a10406fc2845f1982f0cd582a5e153415b79824f3fddcaece04f64bb8e02330c1d704145c8581be3604d0d518e8eb8282aec1d4be3e04b5b762c26f0841f8364cf88d2108df8e01bf2928f01d5827edcd013b69776275ea5b02d6a98fc4ead4b706ac531f85d5506f0b58433d1a73d5b70774d5c7607d207704ec033916b3b73b83dadb715836b92b846cb20b137e7708c28fc752f19e8461bfeadde274219bca16b332b128dc5d40be51fc5d229696f305e46b9d47dc05e425b577263fe9b290958bd00a71a58a0d131f525a2442cb1c895bc5d26f2e37f9cc34e758c956c90fb5cc901f79e26f709f4d2e177717acbb9f7af186b8fa1539315c9126167cf9f756c6bf129e7c7ba95830af647aa52e719eaaf0f9f1981330eaf79aa88fa9a5bec8e130bbf693388b598d58b85f218eee727dae5d89f397fb38d74bd7172e7cd7c3f802ffcd8c2f71e71fd0f113a313b118dd678ad100e6dd9860b29362552275dd18f0cf7971ede608feeb18ff0891ae6b3235fde87912a6e7fd263d276b7a26dfe9eab9996d915af2cf0b95ca0f0fe19ae2d7c34a8793b1f83d608a5fa1163f681b7a9acc946992691ca02c3f3138058bc183a6188c60d8160f7c6fdd52e6eec1ebc6a05ac6a0465e4def3982e7f253b1983c648ac9c48c6c6db2a34399ccf19b43b1b5fae5a3d3b0b83d6c8adbd996941b8b8484cde27e3f25c7227995e7c8bd5d769c8e91ff19963fcca9ade7ef35825d958f1c6e92e5272667603179c41493513e7c95ffb898a5f989cd99586c1e35c56616eab752f768ae5fecfc4bf713dbdd586c1f33c576bc8fb45b54673993696da63eb9eb2c2c5e8f676293d08304b749b3343fb1391b8bcdcf4db199a0c5c65b0b81a510b72dfea1d59d6c1ee31f605c8596475e19e1d573f660317bc214b3d91995ad33c5464fab6459a46a73f39dbfa7b3231c415cdcdeacdb9d83c5f949539cf1cdaf609ef1d6b737c956553a4bf4a3f1b998c64f99341ee7c3277af55ec752f7acc37da069873b3fb13a0f8bd5d3a6584d4de323dc58cc107e61a3b0bccceb24661f1a56ca9d8fc5f119531c87a329c7eb5fab9d9b545ce738715de7dc512536954bf58661fbf30bb078fcc2148f6901fcc4def40c1762b17cd614cbfc8ceb847edb7cf56b4b5c8469ff4b93f68b7cf83537bd92dedb7d06f70c5eebcbe49eb052f0628cc17399b4dbd3d53bfca6617d3dc625580c7e95494e4bf58a78da65da66c35bf3f54fa74bb1583e6f8ae5948cfcc922e7e6d542db55c2aaf66ecbfe322c862f6452b34f6789fe6af661f7c65c8ec5ebd7a6788dcdd847fa8b159e5af589d315589c7e53ffdeccba725c94e5da9558fc5ecca4fd4251d30acb5b5e85c5eca54cbca59f920e8f09fda8c0d5582c5fcea49546937ed4297b0d16e757b03ce9af3653225a4295628be60a96ae9d4393a6d762f17bd514bf7246dbf35bc3168896c43a3922b844f44b5438bf57cbdeda3072797d7cf37518a7df9a382d26e684f790538f825c8f7178cdc4e1e0bdec03a8bdc30d188dd74d346664584b2e11f9ddae9af28d584cdf30c5747a467593b98c6fc0ce6bc8ca03e23d8f51d5976fc2e2f9bb4c7a83f4dae45411d3d4d4833d3c995c0fb79e793316c7df6752cf4c8d63b2ff84ebc9efe3d6b5c6e0af4b9dbfb788eb99c5ae7efde4b760f17b13eba74c173fb75c4a3e90792d2cdc54bb158bd55ba6582d0dd932b1fce7f7fe7099dc8631793b93dc6af64a9978df285b4db763717c2793dc9a5ac61c2038a77ad8cc4a94f0fba6efc0e2f76e2623e07385e7592fe336d718b3f0cb8e6ce75f22d1d2f973bab8938f9d2d905c6b1c29797d9c20d133ebd60287d5d6ee86796a82c9ebfced1b1d4fc26da4b4b6becb3f65925ec27b0ea4a68d98fb3328c101d748276bf860cc5421bf527a2bb7a4ad165f092a17565f254ae1616c8e73e44fa98fc3d4150b538d7618a8d3c2d8d51d27f5d9183ef3628da81ff27cb8dab1926c192325cb21dd97936e68317d9fa76a5b99aa8df2f8e7c91383eb694d756bf1017f5b63b30d754e210bf3b9497757c03c392a9768e79cac00d83689bccc330b1759229bba75be55ffc08ffed6a14280aa5fd4296e31c8e226715d85a9b9d3b3aa983b21708193cdb2b31ae5f3d4f89012590f816c05cb672b0ce8163b6f2993f5ad59a2342963eee79eaa9dc8c401e4030393203fb21364412c400ee99504f93125c82602e47481280e60968d4d82f90325987d3c16c63beeb80aeb64a1c26d290eb83e6d97c4f509252ebe5245cdf2d08b800a59df3e9295c7c4cade0005c2a794d89a0a2b731bd65531292d4f1b9984f319251cb11f9fc799c701cf0300cf1fed2c038b6201724bdf24c83f51826ced01a9f70ac501d55ba392a83ea72e15959b8faf7b3f07b8f72fa2ab44b8963555b4ccb8c01d3171f843262471fd9912574ba62aa3d54ed6e3af8f532b92770a294c7f89ce5f2d8c61b5f492ac24aa2fa346552d2c2a2ea8cac627517d455f159d22ad69532ce0dc22cabdec2c4db83e1c5bff4e437f44f1ee4d5e104c771cfe1671b586b98bdc3cdd9dfd9d5bacd3fcafb0bb32378d83cecdb03b3037832a44ae8fd6646e1dde303783867c6ea0eea4204f17057abad0795a6f40e61a5a4db929795ba7a6d779733dfd4266c64937aa3336d57392e32ae6f1907c3eaef2b7ffcf873cf2f990c7d71c02dfee81ffb87effef947ebf974c3b77846b13ab6499af495cc146e8faf448d167a163529b440af1f7a9f2c0a459734f89312793c8d6a7d4e07bb8a822f51f9468bb18d0e243c72b1cfb4c69998787b32315ce7740bdf71b9b7016c612e74f00e73f6dc259144b9c4520b3ffcb269cc5b1c47930c0f96d1438d7a140a1fadc77121645ada8702e0799fddf36e12c8c25ce5d00e77794383bd591d9bd96399c0e65372a94af0094ffb10565512c512e043ef37b5b5016c612653780f2075b5016c712e53680f2474a941d25ca91cefff2dae52c25a26b81770ef0b02da2fb823f103f909b80a7fc6f1403be78198eed359132e9293cac6da9b08e0258ff17d5201db7c2757cf7fd686c722515bca300bc9f28e1b505f02a1a4c965e0af0b1467bb19881e248b3713615cadf0094094a946d24ca02998daba2b2c2e554e80e05e81a51a2eb20d1ad917de8fa72271553520b5c4d857132c0d8380a0bcc6f3016380ea06b4289aebd4457e4fc5fef19e68a0821d960c3d90061561499b8c053cd56c11161242b46e6008c4da3c8c4850d26139f0ad06553a2cb12d2f8b821cfbaf1b3b1b60054b328bc5d416d99ab86c9e39e4d2f02089b475171c6aa2cde8a737e0c51f607285b50a2e49332bc65ee64d10a4e597216834e8366005acbbd012d8e3d2dd9005a2b4a68aa032b93d62eecbe22edab1e4c857522e8606d6d2356d2812932ac9f036b6d4389d5ffec1dc22153b201fd0f01ce7d6cc2493a024d86331b64fab636e12c8a25ce4900673b9b7016c712e71a80b3fddeecd7f6ce8f20ac69920d11bc08fce6beb6a02c8a25ca03805576b00565612c51fe1d5865475b5016c7126505b0ca4e5174dc1635c88edb3dc0223b47d10af23f3ba238866df66a80b58b3d23d4a36368a12d4146ef4a89924f7bf5f619f115352e0d326c6da8b0350116d88d125be73a33b677ea32a10d924d5c9e026076b709e6a818c29c0460f6b0092661771b19cca100664f9b601296da6430870098bd6c8239328630c70098bd6d8219c795338500668e4d300907d4c860f60130fbd80493701c9c0c660e80d9d7269884cb37c960ee0760f6b30926610f1119ccbe0066ff286062935df4c109c26c4e3634d11bc01c400913ae58d8c6e0b71fe2dccd7612c037308a81b27c96fcac2f5737756b1e7e5795b8237ed6b83fc0398812675789b3d2b9a99279d7d0e00366f1eb4d2f059d6cb9b60125f49764403f0016ba9f6d40e338de53052c747f4aa07c8ea2b71bb83a86031059c0fe0653e252fb53b97b8ba9e30c6987de3dd14a185c81485cf89059e2228076883d93a8097b2fc9aa452500e5d068c776aab1cd6b6350fd6905b00d8b2273c34662e69bcf11b6c0c9d6830d02c54c5e1415f5cc3bdae2d8a13117586abe4d3849379f23c3b919e02ca0c4a9365d28d2b27f9c770db81cc02ba484d73d63afe9fd8425a145364e10415d06fc65918d5009db3a64509702a8c5364225ece22083fa3b90fd87db0895b09b830cea1b00ea087be6b9110ef192b585fe05508edc9bc3155e94a4cba6c860ee063047d9049370260719ccb300ccd136c1249c634406b30ac01c6313cc38f61f6d0730c7da0493b0d64906f37000739c4d3009db4564308f0030c7db04338e7b6dac073027d804338e3bfe550098132961aa8d6547b086b9b1ec16007252149d717c684d498d081ed9ae7f1300bcc95158e1f0066a859500e4942816f0a98906bc03633b5822d5b0e66fcc075d705329b1aa6f77f117af156095ec0a96f2b9d6f0c065518163c01ea75182eb66b44777e1a8d716bd7b15912125db21f018608bd3a3d85cd16c8b84d3605a50a16b04ac71868d9b3c91ee6340b6c9530eb0c8993662256d8193617d1e58ebacbd39b328fecb527a029425f64e9121444b3645e67580f6009b367d226d8f934de67a0be09c6d13cec258e2fc01e09c6313cea258e2cc0525fd5c9b7016c712e78100e73c9b700e8f25ceed00e77c9ba617928e4d92559a1602dfb9c0269c85b1c4792cc079a02dbbbd914e4120eb8efb0340b9d0169445b144b904f8cc45b6a02c8c25cae10065a92d288b6389721740b9d8ce7d0809a721902d035c00fce69228b0c275e70b9cdbb9c012d6d0d69f0f06580fb267da6b1c27cabc09501e1cc5dc0efe551fef52c0863318bc1ac03c248a5e4f35f876b873abdbcb59c696886cded0bef753090aa843a39aedd150965e5d02ec722925bce6ce89bb6bcc1487c15ae71fcfe0f11b09ea0a802db3678d791ca7b58e0428974751c0c02ad0f4da194770a24c7cf73ee801601e16e5b6266b32986714c76d4dfa826265856d4009eb9364406701a02b6d031ac799700c005d651bd038eeb5d50e005d1df542d44c3a3ae2f865c98741c1b4c646a871ec3d7a0c402db3112aa13f25837a37805a6e23d4387e23f57e0075ad8d500917519341fd02405d672354c2810e32a85f01a8eb6d841ac7cf2d7d0ca056d8089570713519d4cf00d4c36d844af8f11b32a83340e57f834d13c00a283fcc443610f71db0d14a9b7016c6126717609d1b6dc259144b9cb301ce4d36e12c8e25cecd00e7e6287af2331b752fa42c88c886458e0630b7d804338edb4dad05308fb009661cb79b5a076056d904338edb4d8d0430ab6d8219c7eda60e03306b6c8219c771f9420073ab4d30e3388b6e0480b9cd2698719cea9507606eb709661cb79bca073077d8b855006925896c82d8728075a78d5849d7199161fd9225b11e4989b5b701ab79db8099f291c8f68a2fa582db1dd8ec5136c325ac4e91c16d01e01e6d335cc2428c0cee37c02d1c63335cc2ea1619dc5701dc636d864bd8fe27833b04b885e3ecdd0787b037806c1f9c4301da5d9468db4bb4c54c5fb914d17a2532841780ac7f3cf52e8bc9dd3fa731beb3e956e7d139ce23ebe8c0f5a002d706803bc1a69125d28d2fc84696de05384fb4092769a73319ce46c0339e6413cea258e22c06384fb60967712c71ae04384fa1c4d92f40950876a5108ed5bf4605f91000f9d43840261cc327833c0e403e2d0e9009dbfe6490ef027583d3e30099b00f800cf20d00f21971804cd8ff4a06f92300f9cc384026ec8725837c2f80bc3b0e9009bb5ec820370105df5971804c584f2683fc09b0e4b3e3009970c0910cf24060c97be20099707a2619e48e00f239b6ecd347da5346b678fd65e014ceb5052569b70e19ca05c02acfb3052569872319cae600e5f9b6a024ed1d23435903505e60e7469c715c4bbd13f8cd0ba328e7d52e2afc66fef816c6c759973864a63a112813a5bb3a4e711ee4038bdb9cfbf89e2b55b43556b251b11dc0762f8a0364c25e0432c86301e48be30099b017810cf20000f992384026ecd92583dc0140be340e90097b76c9203706902fb3a56a46bad89dac6af6675087b8dc1694a42bb3e9364a065679852d2849f70c20433905a0bc726f6e551bd94cd8955428cb4106bf2a8a1985850d6e46e16280f06a7b76e68fe332b86701ca6ba2b0c6d49df9e36e8db301c26b291176a8c337aa98925ae26a2a8c1301c6ebf66e9f141418d1a40bb2c56ee701acd75362edc89213d893b3b04b5843f9ec46190079833dbbf5c771f38f0301ca1ba3daadbfa17e0e662680791325cc66ce49851c4c9e26078ec970914d0c6e0170ddbcb7be9e33dbf9bdb3c1d525378046e22d51a22d377e80036b81c7717ffe6b81d5de6ae34e00a443ca6495a30260b1b7d9889574fe0819d63f016bbddda64f0c17500e61907d62783ac079874d3849bf764f86f37c80f34e9b7092eefd43867303c079974d0bd74837a721ab9f7e0b70de6d134ed22d94c870ee0b4af87b6cc249fa5d71329cd300ce7b6dc249fa416c329ce500e77d943807b1d43e25ef94047742f846f1379f28be55884c7edab054508ba0793a890af600e059efb7653898b4464ad61cfd3540f9802d28496ba36428a70317f0a02d28496ba26428bf0656f9902d288b6389723db0ca87ed9c201ec7afedec0016fa337b262ec4f1d306cd80853e12d5a7dacb458d73635463462ba9e08d0776f828253cbe85d55647569973818b7055e50370ee07dcc9d0e550a16b07d03d16f507b3cc6b3979344a191fcb249e13f71215d46b00d4c76d844a58869341dd023ce4cf6d844ab866830cea1100ea1394509b3b271b181f269ee23058ebfce35e337e63415d40d67e328a9aa41a14e6a5f3badae08636d63e01d8e1539458fb18323757a2462c57d9c40e103d455bd20e6c1002261bd6680cecf6697ba67bc5f1f3445301ca676c1a70235d214466992b01ce5fd8849374690b19ce3301ce67eddd3c9bb0b2443633be1328a47e69e7f41a428b25ab52b502589f8b624a77116b9853ba5781acff2b9b3c6901657627f3a4b300cee76dc259144b9c17039c2fd88493f45384643837029cbf8ea23b24393b991738ae9086d60cfd2f80fa9b288a2205b522cd905b1c17586f0565fa8bb680241c172203b911807cc91690711c02be0e64ed976d0119c7b51b570290afd8029270532a32900990b55fb505246155880ce46bc0227f6b0b48c2f91c6420fb018b7ccd169071dc90b23d00f9ba2d2009671493815c0c40be610b48c2bd3cc9408e02207f4709b2295303bd53c58c763254fda850ed0b8a93dfdb33ab8db040216b4fff13a07c33ea391b99f498c7b1bffc2900f52d1ba112b6b3c9a0fe1c407ddb46a8842d1c32a8f701a8efd80895b0b54306f56600f55d1ba112f60e9141bd09407dcf46a871dcabeb4600f57d1ba112b688c8a03e0aa07e602354c2d61119d44700d40f6d844a58f92783fa1080fa918d50e3b817cd8300eac751344ef151f4b80f641c0350fe218a2557059a95c679aed1a500de27d41bed7af73a5ccc920bb0e630772217613f1319c2d600e1a79408bb316fdf269f85b95d7a426f968ea81abf9c0ae95cd0cbf959147b177b77874daece8864222159b7dd85c032ff68cf6201c2ce3a3294eb00ca3fd9386798746f04b26a504f90d13fb7112be9462864587f05acf50b9bf643229d414cb61fd2db00e79f6dc2493ae5950ce78f00e75f6cc2493a219b0ce77ec0877e6913cee258e23c08e0fcca269cc36389f35880f3af362d1720dd87936cb9c061c077fecd269ca4fb7092e13c1ee0fcda96bdb90a623933e93d80f2efb6a02c8a25ca45c067fec3169485b1443918a0fcc61694c5b144791c40f94f4a94fd0d28335d91ee6dbb130e67bc46857927c0fcaf288633f88bd70ac84af626794bfcbae912a010fad6ce0d22096d926c83c82280f5df514cdfceac9a143f1f7a0700f99d2d20e338e87b1500f91f5b40c671f5da0300e4f7b6808ce3eab57b00c81f6c0119c7d56b8f03903fda02328eabd77e0640fed71690715cbdf60c00f93f5b40c6b109f92400f9932d20e3b82fc7730024df13d20a9071dc97e3170064821224dcafbddab9e14816d9fc223278a703788d28e1f1fddad7889d5df9abb99a53459f0f17c7376d8e1fbaee005d634a74fe16a71256bcc9fa7c7e0b5036a144a986c4f2c56f75749599cedc4f30a87d31d56ec4f19b7b3916e0cc8ac232339b3448d8db436699b90065534a949d7d65f282587e59657fd02f9e6d13cc384e671d0a6036b3092661ab860c666f00b3b94d3009dbda6430fb00982d6c8219c72dee7b00982d6d8219c74d507a0198ad6c8219c74a7b5b00b3b54d3009c770c860760530dbd804338e7b07b70630f7b109661c5b406d00ccb69430ebbf6c2a8efb1c4c0658dbd98895b4224f86f52f2c89b53d25d660df5c21ac89927d73653cb0d87da3e8a4c32c3675451a615d946c55c5fbc0523bd884b33096389b02ebec6813cea258e21c037076b20967712c71ae02383befcdb122efeccb38ce767b09f8cd2eb6a02c8a25ca39c02abbda82b2309628ff03acb29b2d288b63897213b0caee9428dbb3e460b0775fa38866759055d5f38035f688a271e97f0d05e1c006d91a8aa301d69eb66472d2a160b24cfe4780b2972d288b62897205f097bd6d4159184b94a301ca9c28e66472540df1fba70780ecdd270a90050d14e40c00b26f142047375090a500643f4a90fcab2bdb9c934a87007f75fcfad03b0354fda39850cdbda0921a919dada682771a803780125e73218d0f37548a98134fa3ee4705ac3d0036d09ec9aa719cc5361fa01c1445a76de61b35114e2320db59681ac0996b13cea258e23c17e0dccf269c85b1c4b906e0dc9f12278f011fbdae96f5415ee44c93a3d9f11b896909b00db6a5b54cea1fc9aad42f0094436c4149ea1bc9504e051d0f436d4149ea17c950fe1558e5305b5016c7126519b0ca3c4a9459ce49456d5743fc4075043697bf376dcedb8689e3e291ff019405518dfeb94dc21ae6b6a1e3fecd887300c2424a841d00c286f7e98d7c80b1288aa9a4356cbd135c8d4e249d291f8043aaa45b7f9552a12d06688b29d1aaef9179d77b2f14c2360b8b6d38abbe0f01508747d16dcb61f2ecbd4ed86c24999daccfbb00c01b410dcf3bd964aaa7f089e3804137006f247d769e5e5bd470745b65c6dd206c708a73eb1ae76f57e40ce7c8bf485616c33ae53e00ea281b1788904ed423b3d561a04d33da46aca4b372c9b07e0aac758c4d9dbba4d3a3c83a7757009c636dc2493aaf870ce7c900e7b8285a44de793d0da545b404601c1fd5c48086f299d6cb00bc095134276186ce7c6522e11265b2e9ce59a04c9f68d36225d2711db221b2df034b9d64134ed20109329cdf039c936dc2493a544686b33fc8ec536cc2493ac64386731ec039d5269cc36389b31ae09c6663f392b4024fd6bc3c0a609d6e2356d2662619d6bf81a269864dcd4cd22d1dc89a9907039c336dc249baa50319cee300ce5951ac7dc066064394715cd674060059620bc8387efb69200079802d20e338b3a8170039db1690715c2c3f02809c630bc8387efb69380039d7169071fcf6530d0039cf169071fcf6d34100e47c5b40c6f1db4fdb00c805b6808ce3b79fb602900746d10af7bfad0861d143b6adc83c80752125567eb2c1f9838b885f67452780691125a6cecc5f4f25619390ac9ff20900b3d42698849fe22083f94b0073b14d30e3d8837e0580b9c42698841d166430af06300fb2092661394d06f37a00f3609b6012765c90c1bc05c03cc42698844d453298b7029887da04338e7bf5de06602eb509266193910ce6ed00e6329b6012766490c1bc13c05c4e09b30d4baef0711b8c719fba7a22407718253a7f2b74e3f845b27f00942ba29805ccf7f65352e3be3dd832006f65147d91deb5b95ce186b19fdf3000721525c86e1264a57313cfcc7caaf476d9e7e8cddab01f92b0e54db68074269864b53a8ab2dabb2a7711733fa90e31c67735ee29c03ed74491d14735d08c7e2400591645c98d8dde784bee387e64703440594e89b227d3773458e2d098ea285d26e0aae314e766be187a9b73175fc95b45db33d4830aec0900ec5a5bc112f65f92811d04c0aeb3152c61594f06b61f00bb9e126c723be4a9a2fd4d86aa1f15aa0e0055853d0510e1a8235901b416a03c9c12656ba6efb291dc348270ec9b6c8a4053006e834dab7448d73d9075a4fd1be0acb40927e9ea1c329c9d41c371a34d38493fe84286b304e0dc6413cee258e23c1ce0dc4c3dbd8adfcc17dac70f5373e013b74431b9cfffca45c28a36d9acb57d80f51d612356d23d0ac8b03e2dac353b4b133e2345b8dbeae03e6c8dd0dfad5a0f6333456db05c2059e39ccf11cdbe1ab6d201b2d4f9e72f2d963bff4cd7136210633adbc1b688ab5c5e9990bdd109e59a55b3fcfece2d55dc34b2a469e48a0d71931ff7c81503725b1d19654ea271192e30aebddbb6ca453e07922bda5fee109e4b2237a545c6312612ed24b94d8efe7319ef735d25dfb6ca91b6cad196cbcd1be0dc96e08b4edce6f1b0da86f130b99bc84679a6aed72d93734b2fad9ac34998f34d6568295e578c92ccd78a4de6ca85d4923a635a77fc70eb69952655f2f86ab4061dff1a9eee32d98599764ef0edfb17838c30dfb9b94c28c57fb2fe1f466973389c2c0300 serializedProgramBytesString: - serializedSignature: c93c8eb59cbf8fbce583c61c10ed6ad78d787bf84f978749d760f38abaa57b5ebf3ae8d33a19f2e4a4aa0cc068584ab1b6cc3d7709c5261da647a2ba94335604 + serializedSignature: 94ba9029e4deb87d55f5408b4f8486cbb4eaea66ad746381ce5501f27eaac3d93b0c04799c51614387283ef67dce23a433cc697eccd15414fb7ecdec59438803 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset index d7603ef..755ca68 100644 --- a/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset +++ b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed57db4ac340109dada6515b101fa4fae69b08d254053fc07a2b78c35e5e4430d55402492d4914fd34ffce339304355d1b8a8a524dc86e7676e772e64652b008975ac7d0a173aa5395da744377d4c75b1db38f3b5ea5f4330a30df62b4b1b74e2b399c7cadaa258c0dac428ac0794fd7985dd96f9283f706781dac98dac3e3e0949a06539b76e9944ea8a21673447484294c688a71a9198c3bf4845d478c6225966c553034b113ca9e0fa3d373177429b07cec5d8327200f32bb227146dc85c75062dd21cedb3420abc0f4b531dc9872e63b9045170b448927596d04530710a041d1161f45b4459b5a14cbaafcc6eeba8c364eb822949565543c0fa960e33cdcce9b1084a01f480439082e76aa748499b9ae68034ebdc848e940ad87303ad4c238107957307bf8641e240e5796e71c32e36cf241491d3ac0da130b9b323e88a58e58df002d92dcee23bb77303f8ab661ec01de753a5b89cbf436ea93ea237a9cba6998768186adb7a638cdfe23f2131161d717932a24d330d1014a78db135001149de1b02bab902c2e21551ba31fb0e13ed470205b084457dc92df1da6477487de97254a1e8a381d98bf27dd240da00e5d3ea68f8bc24c10a5b2e069833d3d69488df7c99689ebfe373580b8dc5c29b7f19ad5bc54c223cc632acbbbc9c689e1fc3acb8bfaa2d617638d8360fef17aab19c967d064a5678de1cc0e67c34282a50f89c7f2996983d796f935332cf693da1eb3dd8f96991fb6393657e953d1fb55a9a843fa99b42c8f888ac5c939d1f84bd934ad48d36a23f2b170077f4c81fceb0472c67801bf86115ae70d0000 serializedProgramBytesString: - serializedSignature: 7b2e67ee83eaa1ad00ab0d92a7e63eaf5ac2719e097f50d206f83e1182c9f1a96ace65a127c595880f0a8d698c9ec8c80e739911b789b93508796f39fc4a000d + serializedSignature: fb43142b40560e62c1c042ac276a9d9830d70140b9d6f4113548e8d0a6a23f3cc8159231e40fce4170eee407cf1413ba3da9e73b8cbc6eb9aabf572bb6731100 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset b/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset index addb66f..3c7e7e2 100644 --- a/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset +++ b/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d49771bc711801b24418222294adc409194048a1b242e804859b6b39ba46cd3d6166e596487e2024a70b8c824a448b79c7372fe415e7e81aff90f39fa27e4f9e09763ee49554d0f511874cf60001435500c3e6080eee9eaaaaf7aa9ee19804d19058fd80cbc6caa55b5a4e6d486da53c7ea08de2dc1f110fe9c4f6efa637502c767f0ba0d79332a1550121f53b141785d814fa7aa00255faa5d38e6297f4de5e0fd0a94cdc1274cdd87670ece8ab540a10db5ac1ea9872a19eb0f10b149854e755a0ced8a25e07551bd81dc1c29859564282b092f6b90734a7987a0b47bde13f52599750879bb50e6441d80cc1d9298f836aee88d720e6dfad8a28fbdf06cd7ef13fad8c7d27a591a1ed1a65678de629f5156417f6ed26513fa3dafab553fa77dce75f56bd6c7a441bf4196966469781cf0e837e0d44f5c91445aa7c73d32dd72339e72f77d7475655cd165673de9434c4fd79e0b9e32739efc0e7d6cb7e477eaf44c08862306865759da084bc3e3b087e1b0c3a2e9be635bd38185a15b6ec653ee9b0a185eb330bceec3d02d6363d8554786a306863758da284bc363cac330e5b068fec6b1adf95b0b43b7dc8ca7dc7715301cb3301c3730ecf694f132baa48f172df997ab6038696038c5d226591a1e273c0c271c162ddf39b6b5fcc7c2d02d37535a2eee8e117e0cd31686377d18ba656c0c7baa61188fd16cf2298cefdbea85ca90a2a845a5d39e5b3278c243d1adf8828fa998339cbf81a239d3acb341735a412da879e3ac7325d6c9f45ea2d76d38234f42b3e555fca3ac0a54ee00fe726cca3c85f44f68c6c549330f3973ea3e1cb1d453751b26c1271e299b50ed014cbb39b50eaf2f48de5350bbfccc2093707af596590599ceec7f08292ed017f0f980345ca3d757a4698eb45f81b402c52247108d2cc2f135d5566efb09bc37d5b9ae919975340701b67427d470ddb40cd6a0f6196a9b3f7ae46d7804d1b76675376cc950d4f497324ffcc8d0196470605ed1326e13b25849dabccad0d8bd5a4630bc8de5169adbb7c3fbaebae36b8b990cba7b982c287af887bf7fffefbffe73f9cff152d3165406a78dd84880697e60515e3a365026c1df8478bc258b8a7af1c74cf869fa5f3b47fcce79793a2fbc035a69662a75400cc39f6578b3031f9fc14af200b2de9082ab50ec4faacc33d9561df8a40d5367908236bc4d26bc89f3c61b3c9ef8e14d9cd955c48b0f33c1760bc1201d6c049b4d04299efb42946079e0e5be5b84b2cf81c42b9a4d5f427953a0e6cf141742b31ea6669e1dc433650c1fc3696423dc62224c2bb53d51c2ebea81dee1c1992407390548c152cf75fa064429d86ed09a0d90e004a2b6b3fd8977564cbc8b88e3d2a0de1ada3c10377980d6c24fcfa58dafc148f939e46dc3f9398a54309d8f991f510dc556555ac29ffcc58ac97713f971d6d66bd5cc46bcd5403cdba6577e65cab67b94c5132d82db4c82137ac9e81d45ff0b8f32e1ed76e109533be93cefd9e4118cd65f29673d117e36e9a9b835f45a6692a0fa6d3e6fb7f9bccf143fa0849d2a1ac0055b2dfda65ad0c62df85b80e70bd6aa718f7a8bd2b6f5ee77181d3a6c3a0c9874e8d63a64e18967636dd5d7dd69ab3b69aabb83d5ed6cadaf6b0dc2d4d965ab73d054274614d812f742d571d1d4f7a8e2f35fa75417c7e1c675d20b43d9e2b821e5b7cc081bc575db3c34ecd72be6ebda2b2ed9741831e9d0c75a26c6fdbbc410fd89f657afc5659b16574d5a74322d3e02ebf7c01bbbda9f616aed31d58aadf79aa15118a7a521bbf05e53d7a0feb22fda358a01d73dcacdd38656f904613bcfed180fe86add4bd2c0bf0b5daf78f24a51f7c1fd6f092d6dddaccfe466f4c4a84971af8b537617f79b5c4c9d7afd1c473fcc3b2629db706ef811102ff14c7b57b266ff8d91ff06cb8c0b56c1e69b01936f10e1b8512baf73c6ecce49dabc3e51a3d7076d82276b147cc5361c4d1986237c84198e864cc269195d89d6dd76c1c3360fdeacd5832336d0b76a047dd52678ba46c1d76c1e9ca98307afdb3c385ba30753360fced5eac1511be84c8da06fd804676b143c66f3e0ed3a7870dce6c1f91a3d3861f3e042ad1e9cb481be5323e8299be0f76a149cb679f06e1d3c78d3e6c1f76bf4e02d93600c5d3f508600183736cc91118f9fe628483e8620630bcef91a8a6ed36c8c653027584265e76c954403a5b14098707cdac6e04313034c2c6e45e202d9be11e990c0adaf825ecebf3668ce2f6778f336415a3ee4e278c666cf4f4cf62cabd2a82a8c276de5fc72eae5b5599b953f355939afdc6dccd22d49db16a663f933ed39d3b2975b515c8687b160ce66c1cf4c16e4ce2c702f21f07b4f1c0d50bf7dba4b045be3cad999f720c07796caabe4871c58f88ace9ed3b6a09da537786ed2823a0faf3be41fff565ba9bfab69cf191ba79f9b386d08733a827397a02ab408e516cbd4af5fb7c15f8cb6e3ee91e41328f9984ae0a75395a1dd93ec99a5c1773161dd87e017ec6beb673e0dbea7e917ca7e4f53f97e42b5b7b7045961f2da1cf31bb72ed826fbad3c6dda22571690a61da277cdd25fa257e3daab4d19da8f9aaeb235056bf12bacadd9dc86c25fdc77043ca4310a04749180979051a0816b970632b7ab04d61674f9629604b87780d4e1a63e6c62cedee10939f7541d80ccb67853b6877204515d20017c5b1f47b9bd8680f4af5811d2a224a48e32488b7a6669044c7f53454c4b92981267553756674b3717012d4b02c279a3f45adae39220f20806f8e38640a6a84db5c53dc23faedb9c58dddd67e5b37737c54baf413d4c2dd0d8e699cde9e248d434bfc767e374852d27ed3352a5ad437ddad871d301b368311c358791590c473ffe3f8f14b3e8b74f10c22d37b0a251e653c9516640b7955d0dd0bbf42e5d8264bdf5d772e76b7bc9c8d3568971d58c3eed6c465b890ecaf71a10653743f99924ca618dd2193d8ee0a4ca36f43e94839a92823ac5a07e1e45a81f3420d44906f57e14a1bedf80506f30a80fa208f56e03421d65501f4611aae0442506f52a83fa288a50ef3420d41106f57114a12e3420d44106f5d751843adf8050930cea6a14a1de6e40a87d0cea5a14a10a2e4ec5a0f632a8eb92505306a8612e678be2ed96c23bc4f06e48e2edd278b1e27d82ebcace975f1fa91fb8b81438c5c06d4a820bda34e1ca8bb6c17629946d0ce56fde26cad2fd27c1795d6cffa983a1fceddb44796e134faf14ca0443f9bbe8b44ac16d11b1567999a1fcbd24ca51c31c8e4a14e83be247ea33fddb31efda08dac4003f894e5b155cc38bb5d52e86f20b499478fdb0f4a647e3f5eafa21eb9242d6c2907d29892c65e8dee14274c10d10b110fd26c3fb0749bcfc7bd179dd1a4bbff7d978ddb995c1db3a0f78e5eb9b237d4ae3c18b31784f25e1f51b3ab6f9e66fd19da1212990d718c8eda880140c74c4405e612077a202527052110399662077a3025270c52d06728c81dc9304192ef4161c25c5a69b0b0c654e122546c23cf47e40df8cdaa6ef229dc881eb9002d7ccc0ed47a70d0ade6c20d6062f3194cf2451a60ce362b8b58c6017175bcb5c67789f9fc7b4636ba98d1e51f63090f9a8806cc488f22203f99524c8a4a1c37381a55fd31585392605b39fc1fc6394600a76713198030ce64194600a86e962308719ccc328c1145c3c8ac14c31984751822978c1410ce60483792c0913b742f9aaa7f1a2c73843f5421255cad0eec205e78263a418de7186f76b49bce196918223a4d832b253bd335fe8cce21d1627bc39a4033650d2d66b9be9b241c8f9dee365cd057f75147fe6a700f97bf0c463f13b9019fab547fcada7303fa2e02f13a9f84bc35bbd5a63e69e7050377fd6e34b97264b83edb3b78d4e1faf64e80732df65fbf1df04b66ab753334dd2d77337c0f38e70bcbbf644ed9152f888ff0fafeac1e2f1710000 serializedProgramBytesString: - serializedSignature: ee8bc5b5196c91c5bd16106d000a2f882de3367af3b4bf804f5bb4c61c48726b3d6a5adbd093485fe1fe8c528827f5ee39b4289667241a463a057d460a192a01 + serializedSignature: 80651ab0f7acb447c3cd48e1d819709ddccce6711f08bb80591a4ab6964dc3911f192af1ebcbc811cd7f322d5ab77cee2a1dd8f6c0793b01fa663e67ef2b270b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset b/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset index a4da100..9b6e586 100644 --- a/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset +++ b/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d59431cc711ee452c87001d0884904042b2245602b10b48e84092c525091d087128716c07615849d820614092ed1c8e1327719c3b71eefbbe9cdb79c85b7e861ff390bce53d8f49574d0fdb33533d3bc36c2dbbd8206deff4f454577d555d55ddd333942485fc89b5cb8f5b624c0c880e312966c503715f7e1b90e582fcb58eecfa51b124cbbbf2735a9e6b172d59ae849fd6d82ef9392c8f96c58abcf2a19891e51c9e1f1769f97d585e9b9647507b47fe4fcb56b15279d1a4181437c4886888d56721710b2f5a567531902b56213ffbc5cbf26c1a99824e9278aa417e8ccb33cb786e41326db77b5a3c8b622dc87333f29a25312f693e87142b26ca047e115651a3ca83f2bf3c23ce69c7506e92ff2b5d75d5aaed79577d95aa7f521d57a8728baabfa08e4b14cd0af55de7639b2a37abb256b58dcb7fff5175db557948e3ed902a5b555f7dda31943b5479589defd78ea1dcaaea075cf4122e7a767f475cf509ad1eca3a757ed045efa8ebbaa3aaac57f5430130daa9ca3675cd45ed585a5cec5f165e25d5aa3ee5d26d4aa303f597d471bbab9d7d7dbd2a8fa9f397b563d95fc95beab8c1ea7755efa5c2691736b67155eed2ea65dda6db1a1f507608a79d556bf550265dfc24ad3e57e9340aaf0dd76bb4ecbadd1a9f765d36def7b8ea6d996dbd5f50c74dea7838805ecb54d9a9be5fd18ea1ec52f557b56390f79f3eb48fbb747a5c95ddc23956bb55d9acca13eafc35176f3d2ede4e68f5509e345c774ac3b65c957b5dd75c779ddfa7ea475cb45ad4f71b013035e9d16ddba785d3964e5bd7c6ed634aefe093de55f5675c389f5165afa06db85795675dfd9e55fdfec3d5ef2e43bff6f9fd2ef9284c6a45c67f42db519fb6549d3d9e0e68ba74b48bc730e25d9631685a2c8a245e081e316868b6afcc1e948174197cc04f2b76bb22c3dfa2244044c6498cbb2bd2cabbc8c8d818abd6f81ec0cf69d9620e89def476f1774f17c0dcbcfc4d6b617d59d65fc2ac0002fb9c3cd32107c61c5e755b0eeba7e5af93ca2dd9edbc4c0dd262427e2e22bddb926d6fcb6c22410ae0be664cd2b4329405596303ba288fe791c371fc7c849ca691fb6159b782f9d27d9931f5cbf225eccd2bfb92fc4ef539a120a379a4131553bd950ed96a1a94d200f749f0efef6b645d3402d097dd54c3b03489def64d8f26dec7d07232e0ac87158d4e842ce6a8eb1249f4e7631e04c3cbe89590b66f0bef1e9918f8c9422303eade83126434fcdf86ebfffedbe1993d71a768dd2289e1bb298b687ec002bd446ca78782bf08f178690a1875c31fa3e0c7d4633c8ff05bede6b05d7805946164722a200629e8886c302affcf21dbcbf2fbbc6cf0b26276062f062fe8d1520a489623d0de309a8d5913d42514d415f9863abb6ff183ba6255ae0cd4f04323586940301b0f2604375108620e769b15413b091b97d1f6aa3c372ddba7d1a343bd6e557dd8432671735ee18f2d4cf68fb9b0a571ad425c0f6a296554ce4c88975288e3aac42c2be213721a64ad50419449cb332bb206aebaa7ea276506037604124d4a0a56926a6aed8f7c7560e46b107958e6c83587260dc4090da440035b28a62b5d4c03bf06c265946ac1b2623379542d7c9f4277b028fb58111771d1705ece7672a1d8ad8115bb0d15dbea516c54fe4c6a2da7d0c769f13379716599f9a4fdad5f5e7b4fa2f40827090fe5f5d4fcd31fefed81f1ae45bc5bc85971388e4c08575008e382c8f3ac08676c6208cfcee1340b265cd348fd860c70cf0b6b3ae6b421677b1bd3ebb8defd1039f1477f4760f4eb107d5841e4e4d6a4994acaa58166ea83b8b43ab34bdb6c22bc3322e12a8a300ce1062af5ac54b8ce60f8b56c6ad6db5fb9b9bf6aca76c1e1afc3a4686d8922acd435044e141b85df9c266c9a5843690bdcc16ee1cd5eff277f3caaa934ab660ba51a8833b1893caa06ce3d402ad3b26d78f5c0026e9bdb6e69dd34a16e767984cbce82493f5b4da3a939c830f51936db4c8adf4b28fe1da01342f1db4dce655f44e7526b22dc1291f00eca5411a39b7934d5208b44b491c26a7ea54bfe1aa30f3980765aef91cc772dc5805c1da51230db278871e3d549935927f51465f029074d0ed34dbcd14c7c27a570b4dbd758151ef4c6069554d8fd3ec0440238b257b6c7647907b94863304d07b821e26f508756f1c9609cc4e1372482df9ee197026ec76fc6814d9b7a2b9a7a61f16c1a4a0d269f9c207cf23325e17cf22e532481db6d9ebc0c8699332f6b712e038608358dd45043879bcfc53c77761ecebf1ea5e20b69706d825ec8cbd6bfc928769bf4d64ee92d7a3ebdc7d4df31aa3fc8be077260234d54afe08e3b083f94023f047b3736d7e2c077f7d36aeea7d9245d8a92ae0a338b65797057fea6519bcbe28cac0b23db5e539f9d549f10f5a6e46f4afe77f66cdd90847370afd9da8c16868f7d263eba283e6a353ec6519fb3b2f4f2138683161307dd14076448f7a1bedf44fdb8c9c3e9d6daa2d971d8317380ea19d2af1394db0891963e6122dc1391f0418a30388f9341085799091f32717c2a22c78729c2b08a713a08619fc5dd56827012b3da39b11e8b5f1338b461e7c11d0c0f0b395efa3a43e1458632d872948881dfe7e3d514f61294ba412b6783a8bbd7acee2326c2e722123e6a227c3e22e1368a30ccb0602b5ea41956bbc90b5c88e8058e9958ee8bca720745197c39eccf8d3a294c9ad81e88ca76ca84f46044a43b29c210aa868210f689695d262c2e46c5a2dbc4f2a5882c1f37817c3922c8274c1c0f47e4b8c744f84a44c2274d84af46247c8a220cd05d0b42789b99f06993bd5d8f6a6f674c663112d12c7a4dbee8460e7cd159131ea351f13867b20d6bdbaa2b4f3e2feca513e7368811014fa03cc690fe82dae2d3813386bb78664a5ac403990601217d7305b4a0e899b6618431cef326c9c628c9ba0c929938714ab7a89d874779a6709e9449b832f763c248f0a44982714a829e4812cce236565b8e11b5ece59643dfc21546920b2649262849c0dae9b4915a8eeb505c821c7d6ab3ee238277e77d17f7d95bb8dd2ddc4cafcf24d5242555ef1aa4b2b5b3e249ade12c4dcd9b868791a9df24d32d4aa6c34699bc8ba49644975022ef593837118ad30113a71fa0383d2df41d2a13c26fe391c5e9f22af6565bbfb1900b6b1a34c9f3414a9e5123f25efdeb236414578b329807a5c13d96864cd23f4549ffe41aa51fc7d5d579a5b5615cc702ed9afd752e64bb6892ed43946c83a163ecb03c7f439eb9bf1a5383fb197f2f1946ca4b26299fa6a47c2ab49496069d728689775150598bd62f9bf07886c2a34f0883055ad23f90324c49be5f94cda7d182410e3fbb0d66cf6bd7f7b049be6729f9aeadeadbbe0da6df04b3f8035ddd11d36ab96c78b5e510c673683186fa49ab08bfa4b081da17b19b651ce3d6c339164aafc8525f2d8faad52b26a93f4c49ddee8a3ae65d91ee789f3de684e1faaa89eb298aebf32e5bd47bcd789c115cb49b97e3664986dc7b689169d9765169304cbc5cbb155e3349769b926c20ab64d638eb931a99458968cb71ca1254cab56aefba49c6694ac634e348b37308fd1508b730a380f1f61c6a303856b9f6b823269c9ea3709a64c609728b01d91548047433d7706792374c38cc50389c0ae9a3f29d178f9aa499a5a4b9b2aa55fb5d19d3ea26cd345e6dfb2fea5cf8cc29786b5ae272f91bc33bcb43c8c992a4a43f7895c46d4fa95599b26f5801b41764bfe04d2756c764f66d28e0354c4f44df11ee5b5f6b7d38369b14d4a8ebd0c69d2e5df04d4dde0781cb9544362d8934ee01db6892823c6571a5d59224ee296a5ba33565e7e22ef4b689b6a1f08f035a04ec9528dc0a711907ec2caac376b1fde8a45684fd6e1e0072397befd976e01c4302f61ec81cbc22004cce4a2b6c1e5f975095c74b5240ed1e2774e05f32fb19f47d0ec50013fcd830cd71c2646d72013b1ac4ae4dd3886200edddd20c68cf7382b6d3352c337656bc03f3ed5806bc1738c1ab59ed9ada4c550c50bd8183b33cee227e316771746dcfbb7b23fe56ccb15ec235e725a437ebce0070536ca1713eaf47f0848f2b4f64b1a644e8a19a08197313813d6826eda5d3d51474bcf01ecf4853a02f787f60d9393b81438ff480d323c13d796aa3a9a5e53ba821579f51dec951e9f0507541045a8b97daaca5108bdcd110e685d6fcedbe6ce43737eee483b29c0bca6e0dca1739a16c26a00cb64c01db94d980ddc605ec290dd8254e603b14b0f3f85cc0147ac7c764c8b0f28b706b228cd0b3b987431af4cb9cd04312e27c1843bf4d051b47d8c06be402af5a036f8513bca32ebb9d17f48ea270f70419edb58a0bf2760df287f90867332a9d5af10d678c50b285b35d1a948f38a1dc4b84b3e07b2f18a1ede582b65583f63127b40d0adabbc6b44b679f35edaae402b34103f3a5420293d132d9c0dca681f9723ec034f94ff7362a46309bb8c0dca281f94a2181c938ccd9c0acd3c0fc48e144f6134518d9f769507e9413caad0aca6e577ccf3c975b7c33a22734f03ec6095e8bf0a6451b3f814f69f07e9c13de1a05afb578378fbb362cda739c93cd3817704203eed5f5f48fc59f04d568507e8213cae0eb4d13c2de511474a73e2bf4355cd01fd6a07f2d1f561c6c39babb08a37c8f06e527f311e5531b28ca6fd7c0fbd47a7a53a71d7615a11deed1a07c9d13ca68eb488cd0b2ad231dd1a0fdf47a5a69de6e74b47141d9a841f999c2093cc5b870dca941f9594e280f0967faa43f6afc5e982b1dd4807e8313e8ba2cc3df969415c6035c30eed060fc5ce1c4fa934538f4f76b50bec96d91d4661c6ad343f16d7828d360fc3c278cfb8960044cac087835fe7d7145587f096ca3cdf04b3480bf503843fe78110ef9bd1a945fe484d29e66766ea06966ad06de9738c183f9ac9e1ed9270685fe6e93e25b2f2ad500fc3227802081797f52f1e58e9b34e0bec23d6c33c0e9dba3edf5cbe2b3bab806de57f3e1f3bc3729eeab26c51730621a785fe3046f8bc1e7b1db1d1b74551a745fe784ce7eb9b26991224f7b86d87666f66a40be5528403226d26c407668407e8313c870cb66c5b84e7e4283f29bf98032d89ca4189fc4d8ad41f92d4e28a3dd72608496ed96434283f6db8563a53d4568a52d1a94dfc98795aee0ab88968d36ba711e5bd9a941fb5d4e68615e4dad43e6695ecd0660a506e0f738016c213c68b83b378c5e946df67d5c83f7fb9cf08204b3d8e90be23a06a069b454c6258b5a2ed0ca35d07ec0095ab83f2d537c8167ab06e40f3981b4972fba36d092ed010dbc1fe5c30a4d0950b14f1deb35207fcc09a4fd748469eab8111e3569d3c0fc492181598c8f9a1cd3c0fc692181c9b8acc106665203f367850426e39e5e3630bb34307f5e486032deb96603f3b406e62f0a094cc667cad8c03cab81f94b4e30c32d0417e38e8a931a94bfe284b2858032dcdc9b3120b1cdbdcf68f0fe9a135ef88bc4d0d8da8f36261b3e2ec2f94e8506d76ff231b0832df816e31339cd1a94bfe584d27e415466c1d7f9366fbbec978defc98b1ee1c2066cf9639dfdb0ad0c3569c0fe8e13d868f77b186d96ed7ecf51b161de62998237dabc0de651a9cc2391655b5722e0beb944805d4e89507b96133e2bb70932b22402de8b48047a91a15b22ea855cd6ab2ab72b4b80bfa50e4fa2c29be367c5349699d75626f18fdb67fe0e5bb0f76bfbd3043bf0a7f67b50768cf605f339b3e05cbc27939234bb7ce6d150eda39524dc1edfd0f2ff4168ef472d49c21388b1ce1cd85e768efea8f7bcce1bda0a4fc3d613ea8bd812d88c62e1f0e25227bd39ec37d95498d69d3bd9ffa47bb59264f35aad3b3c477fe6b46e8b9a95b0ba685f0a201dad07b7cc99568b680f99172f5b63fd9e803fb99e1d89669cae98a9f5c9a3bb28eb1c525d10f64f39fe6593921438a5bf70e219fa8d9a1b79cc98fd450afcc55f1d432a0543ea9df76d3d47b60ebf0d98cf4eca6bad589ac6bf8d368bf4e027fe7f7c76889d6fac0000 serializedProgramBytesString: - serializedSignature: e0881a6d0cc397d40fc24f5da3e7bef42106860b34e7de5898ffa5964ca3d05c78405c4d4e56b32be90a142b5c6d20cb5f02bbe2b5b84534c2d4da9f5d6b0408 + serializedSignature: dea760dceeb58069cf3b37a4695859d031521870b53d0cccd707cbe95a8abb1345bd7117e6a39ded06086b9a8417b2e923961e1539e4a5943b5eff3bef85020d programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset b/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset index ea05dd6..3c54d9b 100644 --- a/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset +++ b/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b57134910ae0e9984282cbaaba0c2eeb24fc6b3e88ce8faae7863cf7a394078e1ecc10003664d0227891efc0bfb7f7cf0c7f85bf4abea99cc90e999219ac6957572984b5faaabbefabababa29b8844b2de0b64e2bb44437a8463bb44f6dbc2de1d9c24f7f85e5cfa983e71eee75d42dd07c4e4fbeaeaa4bb82fe3ab4b3df47c4ddb7836a47e957cbc2fa3af8f2f2eddc59f8f56aa884e35ba4fcfe829cda88b3922d6a5533728536c971ac7fd1ebd45ad2f4af120ae54cde0b68a9aaed4b5a074d86e83fe16b35aa8db469f0e3521734b248ecf715fb1491ea5e059c05f85ebf9dd51a2f963c8aad301b95ca9ae0d0171d8331f5c165d2a687d80320fdb8319071060b0b026f8f5e8162d1a2dbcac26627a2fc9bd8e160d115a4e0ef13e31042bd7c4cf8fb9a78bf247e25d7650033537e82f3cb9d70bba09c03706a4ac63d8265cecd31aee0722ef05d44eb6cc33895d39d867053235d35a2809013dc07753345c95fb1bd1d417ed9751d613deb7c1fc7b781eca6849db3b78378db9164066d6d14cb8b4724debd04df7610d6bef8e31cdbe7be46b7884a12f9583695874798ea87f139ef88ea10e328e04722de3a60ea547ca16c9e54fb5924070781b93169af9adf1be43b7336d3123c3ee9e150b220ffff1e1fdc6d6fcbb0de7a869b7c89525632ec7b42c60595e554d2724649be038458f151d845f99e0672aabd513845fb76b48bbe11d509295e9a803d42c3ed7f07288bfa6ccbe862cfffb10b28f261d51f22ede76242a3e1245795e267ce6f10065813db9a8e6a99e067cc104fcf849039f1f69b2801fefdb1501cf9719c14a0a82793aa421386640d063379d31f141f4aa0ce8c5ad53a4174dfe6113d42babfea9a14c275c0fa4b621ab7424735fbe79b43051cdeac15e7a2289ef6bd125db9f67fb3647c0b98ca6722515b7a9d944904ecb5576cc149a140ad957268d728e8914825afbab90220a5ff1a0966771d4ebf8d4f8c1440df6995accf0c628f59b3a0e41ce09414e4aa5349a944c918983e57943c0fc882b119838d03865fc94627a3d102675a0d6730cdf90af2eb93c1d9447c7df59b26f5b08a9bc255883065b6246fe3ef3474adf67ee8e6ccb9167855e26b8ffaeec4bc334d6645dbe4de9dbab726051280b480bfd4f9ba53fb15783d30c2ab83cc1d4ef9fc9a67c2d2ef06863660e0d9f5669014fe5100a0278c66d4af73a9af4f2e53f838c7f02bf99e45f1701611e3e82a31526d55d00b323e1b48b9f8e63656740f8c391b1ecf372ece47c9892087428ab6a47e4ed0cce0f8ebbff39cd2fc6f95d4d70240aafe6b0e871789dfe9f473e8f231ff3bd7fbe51f0980f976cce665efdf6fafbb1b07860942fd943578ecc6ec3c9e66866f898cc700dd8659b80f1f4dba697f86c0bcf9ac0c207577c51a52d8cb106dfa42df88a31f8aed8846f5222c3a60cbc8b269b7dd97c66600d38c7167014036ed62670d30170db41a4ebe13d2e30aefc2679f6a0acd882b2148372ce2694bf0550eae4be2d2c64257ab24769d39fc139ff6903b81003f8679b004fa54ef2f637bbc0a81878bfd8046f22b1c0443b626bb09db3059b43a726f3f618a45fe3aeafa6a44fd5636509d54c57eb94f97c8013f7782221aa8efaba3ca3f4d9e566ea0e0db79fcc96999fdbce532ce71ff06f7364fe1d45be6eb2f44b72f7890cafb87c8073aaede7e533763a58766664675783e7b5701f5bfe8efc07a8236d9c4f0add5c85fc220000 serializedProgramBytesString: - serializedSignature: fc77364b71936aa7df4c8004546c86843e9131977b13fa44fbc0c9c604cffb24543823bd1364c46da7d2a8fce63c57699c0cbda7633095523c0d2e8cc7e66800 + serializedSignature: 2f6ceef3d916e0c1e71627820f4c056e91cfd4629f5ee4511fba4b7a401bd341acf45692514c21045fdddaee21eb621b7ee3ed30c1bd0a426528bbfdce36080b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset b/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset index b913989..18dfb62 100644 --- a/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset +++ b/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df77f1c4715c0e7649d4e7293edc8967b2f675bd69d2cb91759922559b664d96a495c225f546c0515c73e1b9b9a406821f4167ae81d02249040e801023810e0f3e1c31fc0eff0437e8779b3b3d2bbd999bddd5b3d69d744fae846b7e5cd7bdff7a6cfed15a518ff8955f1973ed6c59a5835eb65836c828df3ff9a783ac67fad77f6f133ec1a4f2ff3d70c3f57c5d6e7b9137eb6c596f3d736feee3acbf23b6fb0019e8e88f3dd6c88ffdfc6ef1de2efe0e830ff1be257c58af94dbdec38eb64a759656c691e117de2a6ebf2580cec8a95f2d746769b9f1d124a41262971aa92bf74f333d7c5b931aeb47ddd7976519835c6cf0df07baeb1512ef34121b1345bc6c43fcc4a16cab49cffc5192b7942be8fcb14f096889ca6de73ab628b94ebecf7bbe5f53de83da465f20fdfb358a6b5ca3db5329dabb967894ceb947bea643a4f73cf3d32dda3dcb347a6f3d13dc5324d2b76a7a5dd8fc9f71532add1dcbb149d2b1111907b7e993cde27df174919a5f27fec17fb9ebd8a3e7ba53eaf5876c6fee522ab52a60b90aea532dda7c8dd67c92d7a4ec97fb94c0f280c0fc874bf3c7eaf22ffa03c7e1fbace3e0ee92179fe7ef41ee75faac83f27dfafb0ec8e9f90ef576a6c74e33a47a68715fb0f5bf9cf6957aeb3d32348fe2a1f7e5c20e53ee172adcdfaa8a2d351eb5cf17ee5bad532ad577c522fd36348d763326d90d79e5764ad51ceab31bbd6bfadc5b73cd8daa8d8da28ef55fd6fb82e5ea55cd7c472e3cd3e7e9c39cbe93ae51ed5e6f53e6cb6ef6956f46cb6ce955c95ef4b64daa25cd722ed795abe4fb85f37294f8d855625165a657a02d95f828ec1ff170cb2da14596d323d89649d94e929961b5709e5b89d871b43db57ed8acdedd2e6179828f309fbba0d32dd22d34d48afad32dd2c8ff1fb4a9f91c736a2fc54261d4ade1d56de89fd326f9bfb3699ee90e9f6a97c12afca634924dbcec7e6725ac9e7b4cce72929e39ff2f84e995679c827c1bcd57dbb902c483ba52e17d17b48cf283a9eb1742c3d2e798ecae3d5480fb7fc3bd17520f701976bbde8bf49a66715fdcfcab44bd1bfcbd2bfacd8d2bfcc666aebbf318ffeb6dccde87a90dfefd58e784cf4084ff03e5a865d6529711178c16bd7d5be337fa7154497c00bfc6c13d96679f7f02a17a0e939f68a7e6996f7bc766b7b8e2b62f391de4de235c3af1811422f39b378de91052837ca7f8750b7f73a3fde2a7acdd0f11de167aa79611f11775de2dda7f3fc37574a1fcf7694779d8778a574836705f22e71b59d57e63309bac8ea3d5d5ca6d5831fe3476ca057f9fb51a161b778bd29341d12dab7f16359319e18e7238a469ede12b9396dbfc6ffd7e5d92391e975d477e44dc7ade182eda6e3dc1ad03e25fa2eaf7964363c02e84b2ec962589c122dece30e4fbcc6d0aa6460c0d62665d40864b19c63bb594a8ce9ba1c04fddbe8b4501fdf16efbd7c80e9668b9e0cb87b95b060cac34f3ebba8f21fff4e9e8be79a56cb52a20bb23a8f696e60415e32b6cc21c1dd8478bc380d8aaaf8633afca2fbd23d83f8adeb46c475fe1d50225aa65c0788e6af87ff738bff8d8afa6d828b84d34d42214bb1512eae5b6432c61cbe4a83e084c0ed6c4cf3a96c025ea4035e3ad3c0f3d7306ec04b27ed9a020e3f7a82650682f97430119ca323287a741748093abb62f67f8dfcde2b9cc44dd1bedee0f7ebba6eee4c611a6c97c254cf739ee0b95edba1f4a7918970b186701a08cfd72959a62809fa1904c74d821704145ca28b09401a7b8834267af931ab7bdc2cce8e883e15f4ae32427a278fe38764df0b3c60bade8e820e31f97b4368e21e2f0b3dc74bb9881718fe506a6b8aa584cee5e099455e5c5e6e7679a9cee51022b1ccacb81caab36ad9980c0a796e08e16a77072ff6ece025c2c15b5c1cec5f37933bcb74d4a15a880dcd0a756b783391c722ffc50b5613e628f453504b8991fcf46bc3abf347ead1cbcb77daebe37a77570877d3a86172fb5c5d2906b72fd5704a0327689fead1cbcb77ee1c8d3bca7785b97ccf3365b9cc2dcb49903ccbdadada7a5f59ce37655969cc727878b8dece571aed2bcb05baf224a6c07a48cb93baa638214206a614c60be810c2bad14eb543a88fde15227a973b8ccbaf82293617eabc06adc34ae6eca6fe97ff38fc5366f64fb949f82a8d70b0ca8ff0453ae1d060c2f8d031a28102312e788c4d8e63ac52eec83361ce73b129cf35ba3c213c07c5cc50867b00bc335860be4b4cf9ae35d99a91335637d9508179de63ca739d2ecf8522cfacb8d22a6650700acbb94257ac452c3d4a5aacbd4e31eb7a7c76be13a27d008dec39c62e9e0e0b2de03868917f6adabdc2583fc90735afa2383433ef13e5f456c0e2d35c31eed0d7661b456d162e9d4df5e4525369d8a42b0d5076faf96f9aff0d283326701c9606acbd357ecac532930e9b753a2c453af40b1697e52c351051e771fce851a9d3032a802d9a962ce690bcc22c79b9c9c2ad3a0ba17301b5b96d539fb0e58688103ff6ac303553db34cdd44b45fe9aa9952658490d2ca7641758ab4cb0b6eb6025443874894af0b6280e7e10ad36e5b54397d75cc5311dfc70d6a753d69872dca9cb71110a76c83523ee29bca8ad35e55ea5cb7d494e51b376aa7504b47f9d49835df9ecbf3979b870fbd79b72afd6e55e91c7fe420be60653c14c690ae6ab25fe0ae6468df094e8e08db0d91a8ce7b663d33b2887ed79dea644605d29198338a3d3d5d4ce6e3205de6e9dfa3e6269b3cedda25f7d96d4ddfe17fdf4eeabf5ecbe3ae1bea50eab5cd7c50cd4b698dcb147570f40ad99dbb16810ba677881c57540ab380bcbb8a99c79353ffedcaad30cfc09db3ecb14cde0b843789d59f83653c5b34f53f15c48f8ab78923ae1d064eef712e22e93badb4dce3a10b0ecec30093ea88b82aa02a2c06e211b459a1577a7786e56e7d93e3be84beb9d26271ed238f1459f4eac322139ac43b26bda9114daa4eed2e90d31758439079569e856c0d6da2251b1d4e76d177a445703f6c80ccbb916ffed82c39a8d666baa7595ba98b898c9f56075e5c75fc57ecc73c5dec0f46bc1f9f23755ee295d2cc0d004760e071a9aa44d929b824aaed149865edb712f755c8d59f06e9d6008a5662f821bcc826b4d825b020aae33096e0d28788f49f0898082f79ac2a22d6858ec33493e1954f27e5d155331d3554cb7dc2c335a50df117698af532130d32243bba19ac9a783a99a39600aa78e80e1745027185c73da64af2abcdd2cfc9029a23a8346d46193e43341251fd149864ecc592fa45d76881c35a9dc1554e57a537074070c8e6326957b82aadc6092dc1b5472a349725f50c94da6a272ef341495e33ae1104df779f1e112b3e066138ffb83f26831493e175472ab29a0cf070ce81326952f0455b9cda4f2c5802a9f34a9fc4050954f9924f70795dc6e927c29a8e40e93e44c50c9a74d921f0c2ab953233925d6c266679234f800d3bda734e025e2ebcdbcce983c3118d413677592c113430155ee32a93c1c54e56e9d64989bb8cc3473240799bd0edccd5b94533c20600161883b372b426844a456e0c032431bffcfba1da60fad85872997e231b17a2e77b78c9fd9931e93455774169d9bb4c85e6bc62bcdd6fe6d2812c362b70658d6367965b3d8b9015774092b86e45e8e6bd27af8045256794e439f58ea1999dc6da2da8d77ddbbf1f243a4d744644447648890487760225ee307e6de467c4e46f699383da4e3d44bcc695cec44ba212c02b953f7f889994238dc6be2f03a1d873aa591b1e6502d6bb2d29e1e7e0c0f4dfdd404f83e3f56dc67b26254678579c614360be30510cba2cb2292d585dce9d0fb7e93de633abd5b14fa38574bd309debcf78b781c620ff39b32b29ebeedaab1db99e9aaa9cf992c1dd7597ac0a787aefbf2d074949bf3267b2674f61c553c97cb11fb0eac863af236ef44c20ea10cb3f7eeb9fb62fa3c75c164d9559d65878d9ed2ed0dc32d4303da11e9cfb642fc75d164d5c33aabea8d56393bbc964d2de2bcb3dfa3d6d75ea5fab1ed01936dd7fc79ccb98b20b7febbacf1a8d9269dfffd58d56fb2eabaceaa66df56593d36e759d583f632bdd952a70cbd9d09fe1b13bb819be5cae36dde3f9a1052b23cbf94d850989eec6be4df7f097a8e71be50567a267b55f977556699f9510bc34c1d4816faa9fb7c56e8fa4dd5a8e784adf3be47d7f9848184b4c896c5498b2d93779ba537c0ab71e9d5a294d8bcb9b3c068caafc54dc86d8e3e86fc7fc2d812705ad61972c36e2f973628f70ee20576dc01c89b73bed5d85d42805dcaa7e1b923106e0d5cbb413183719dffb6c36372e24569f0c8eb29b12d16d87ac488cbeaeb606cf60e862820bb34670ad92dfa486be068064581ef100d7146347ad77222300ad89e8c4d61bb4d89cd7a8890b5b517c67e5180033f369c3750c271eeed8e029eff14019e445c11ae8e3aa7eb293c5e1f93e16ccfcb450fea96e8715d13f206d5f65d7c84206c9abf11b7cf4947114afaa88b929a184b7aacfe933e5ad7a92eabbeab99862eeb9bfecf7b9369287f6f0608dd76e74bd4316fa1ac6396336b8fbf357818e717b90fa161e393a2439007f794e5d4472bbc1858489d741255d96fa5c4b92c0fcedcf9a3341dca762a940711ca47661365eef40121ca062a94bb11ca476702e580ac25b3aeb34b84281354281721946fa344697d38d16a01710bd9c90590612ba7c25682b0bd9d12db0223b661fe1b3d700904eeb170b5cf7b23d83e77209cefa0c45929715e3602c5eaf7b33a3a98655430772298ef0c13cc9a08c25c8160be2b4c30095b693298e508e6bbc30493704c4306731b82f99e30c1dc1d41981b10ccc76702a6a92baeb6e784c59cac35af4430df1b2698840d1019cc9508e6139430616433c0ec073b591beee0eb9c001f19b67954d8e208dbfb28b1f91b5bef89e0d87a1942f9fed92cceb9286b283be764307720981f0813cc2846661582f9c130c124ec0291c15c8f607e284c30093be76430b720981f0e13cc284eeeae45303f12269884fd493298eb10cc8f52c22c67534f0fb3a5e63eb98c0c5e1d15bccd08dec728e12d90f020e36131deb665c3923a19b838153886c07d9c129cbf55c37d115c356c43283f411d83e6e71c9381aba0023717817b722662d0d48c447f22772142f9494a946b35c5d9ebee7952b43554686b10da4f51a2f5bfb218c5e9b31684f3d3e16978080788640d4f1d42f999d9ac3f73bbe1511c6b2f41283f1bae427e208285bc0be1fc5cb87012ce5192e13c85707e9e12e71acfadbbfa795dd2b67d0915d8e308ec539460612d2763d8ff1dbdb59c6284ed0b94d85631fcc0733bb53f93abeb615a2374c7e75622d0cfdc88a07e71365bf3e8efe3ad4628bf4489b2220f4adb52528c64936b5b11c62fcf44447adba44f38ea21dba4df84507e653651e6166e42946485bb16a1fc2a254a7baa63945f644df87a7fcc0329da7a2ab46711daafcd6613943ba0249c14261b50ae4228bf4e89d2ff08881027d908e834c2f90d4a9cf622598d5c18cbb22b33b54846168b9b10bc6f52c2dba08945ab3b0e5fee3dce4e8a4fa25ebdeb66df8b10e06f85a7de8ce276aca508e5b72951ae666e434bdd438e66607049f6f1a824c2fa9d9988506ffd4fc20825eb7f1e4028bf4bddb2c3c5f833fc4d0c7fb98df5bc5f97679944a0655f80707e2f3c7527e1ac3b59ddb906a17c9a3a32fdf53909d784c822f304c2f97d4a9c769fd3b9b7685c5e12bd588c21783f084f8343b87595acc1d98350fe9012a5bdfa03631ed865e467ba83b0db4e36ddb10b817d263c4d4f1437b12e46289f0d57d343f8390ab2a6a71de1fc11254e5822ccb0a907f646793be13c04edc733d15ea7efa239a2ed08de7394f0ac2f62c98adb2d02f663f7a31a77f311bae729d1055b9088620bdd89d0fe243c2d34e1135dc80af87284f2a79428ed3d1b7694de44d31777dbb3d7f623a82fcc447c7a1be510c627d928a715a1fc19254aa8ae714cba3c743a023bd84a11b69f53629b27b059a026d8197e51868b8be6feb53908da2f28a1f91fad44f1f122cd08e72f297156fac4b93f82301b10cc5f85096614f7a1372298bf0e13cc2816f31482f99b30c18ce2c7a0d208e68b618219c5959abd08e66fc304338a8fe6de8760fe2e4c30a3f8c99d4308e6efc304338ab3e28711cc97c204338a4ff83d8a60fe214c30a3b83df51882f9474a9830241e9753baf01d79519e372f43d0fe4409cddfe41961cd483679568f50dea144a97bfc43ee1728db6923bffc0abfeda658e181fdbfa4a31eb2b9a22308edcb3311a5de9620a2f80cb67b10ca3f53a2746e64b9bb63b40281fd4b78629470fa8d2c46572394af50a2f43f351cc5d9cc33ecaef9eeb93440fa2b8444890c89a4cba24832e6f6917febec00d33fdcd93a6bfa529b649eef6e49baae70595ffcb658f287af97eb60f091868cdc429e61535f029782475dc76072c5cf37cdbacb04faeed2fe068863fa52373a6d71331ddf3aa7b334bf7de6189cefe295142cabdfd5f6ff1dfc2edd2ec2b452142ffce9864e7eb115c6f013ff1fbf1794d571c70000 serializedProgramBytesString: - serializedSignature: 8eb0a9313ddff7af2118b93aa8b36fceba50fef529343deb45d20749609f49fd50867da90ee056db8f42cd0c0c33a6796fe30f363323ed5e7fddec5a3232ad0c + serializedSignature: 194a6568c4e2c33ba50558b285dbc03a711282c01eaf1cf528ef7e656021cb39d9f5ea5fc605ef1f6282167b6f40dea285c8900b43297bf29651ffb21925050f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset b/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset index 73e3808..e05933e 100644 --- a/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset +++ b/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec9d057c14c7fbf0f72eb8bb4bf0a00910aca58540b0a22581b69416020941120849b02a6da953777777f796bab7d4ddddddeddd999dc93d3799e76ef7264f98fdbdfff6d36e766ff799e7f9ce336ed14cc7fd2732c8fddf7c67ae33d119e2cc730a9d35ce6af7af89eeb5d4fdd7bb93cfe738e5eeb5d8fd7f81fbdb20273dc997ec9f7e910eeeffa7b977154ea5fbe53a67a97b5dc17fcf738adcbfa7b9df16b977ece932f7bf22f7ad481df7a3794eae33db99e5b48fb44d22623effa8423c8b30bb220ddcff4f7036b9bf1671a5582099fca7f6eefff2dc5f2af86fa5aed2f2bdbd9d7db859a5ee6f4bdd6fca9d1257e6122eb1c1cffb39fc0fc7bb8c12d734ef1a39d6bdd6736f73c13db362b4fb5f5df7bf85e2fdd1e2bd49e23eeafed790c9177f039955b2b78a77d8b331e2fbc9e2be9f78e73825fce344f89fc7bfe7ec2cae3b89f7a728bf8f55e4efe2e95fb8a7b8af2be41f2fde9b0aeeddf022dfc7bfe7ec2a7e3f55bc3f0ddcb3dffb03dbe437e3c43ba729df9c267e1fa0f966bc78e774e59bd3c5ef0335dfe48877ce50be3943fc3e087cd306e8cbdedd4ddc4ff0e4357c5ddcf711d789e2bde9e2be2ff2bc8e08f30485e709de6fd17bc57b325e4f043ad5898f53fe1b8c53f9fb24254ea55f9da4847992f74d03c1d2117222678230a56f4afb272b61cadfa7836f75bfcf10d7a9c8ef33c5751af2fb2cc5a63922bcb312e83a3b89ae6725d175f724bacef5a96bbe08efec04bae625d1f5ec24bace4ba2eb7c9fba8a741f392781ae7b24d1f59c24baee9544d7053e7515796ce4dc04baee9d44d77393e8ba4f125df7f5a9eb6211de7909745d9444d7f392e89a2c6d15f8d4b599b8aa799f7c7f89d007c9e323e7c76ce47fb3ebc94e7cdec3ee61dea3ca46ca82c80580df52f1ec4210de050a5325bfaafa7d3af856f7bb645a88fc2e991621bfab4c33127368981bff9e5b3572e2f2d319e09e5d2f02365f24ae172bb22f56644bc6c529c4df05d5c3739683df2003f9fb0a85c14af1fb29e2f94c70cf7e1f229ecf12f7ab1c5ed6ee9d2dee4bc4b5545cf3c475b5f86eb6b85fe37d3741d6c174752e599f6b2cae039c785f6f823c6f8a3c6f863c6f8e3c6f813c6f893c6f25585de2c4d7fb2ef1e2b8d1ebf1ef61df3b65e2b9283f9db6c8fbed90e7ed91e78918cb3acfa54ebc7f5eeafdd6b8c48bafc69b13c85a2baed94e2cfd7713722e53e45ee6c96d921f1fbe5bbff77ebfc289f7fb2bc4f572f17c7745fe95e2f95cf09e7cceae5789dff3c03d0cbf9b225f3eaff0ec5ed405c48d6a6322ae958e7f3f5f17e0ddf5debb433af8787783f76ef6013ededde8bd3ba2ccc7bbb2ce7ab512b7577b6c9b5ee8c96a7a6b025959e23a0cf0ac27ae4385dc79e27e93b8ee27aefb3bf179cb7c1f3a0bd9916be26547ae15f77b28efc9e7b2ad354c3cbf2ea62fffdbb5b7d985f136f1e7ecdbbd94f71e49a0a7ccff0f50f454eb03073af1f97619085b723c28803fa9eddbeb819c8395b0e4bb9bc5bb373af169f54671bd0130bac1b3bdf9ad9e4ecdff16320e11d72ddef37d0689fbc3c5f550a0c711e27a9878e6bedfff6bffb6456e72e2fdf4264fa716533d592d127192fe70b3e237378beb2de2f90270cfaeb78ae77b837b264fb08cdc267e5f08ee5d9d5a8e56c2bd3d3edcaae777003e325e8e54be517de728253efdb0bb536177a7d053c45bcb3313c8527debae00be758fe25bf788ebddc0b7eef67469351609ef5e10ded1203c57ef565bc4f363c4f5d85af0c3fb1496f709fdb70b9d3e0ec0f2fe002cb7292cb789eb0380e5039e2ead8f42c27b1084b7359e65ebede2f971e27a7c2db07c4861f990a77f9b2e9eac36590964a9b63d0cf4927d3f41d2c8238a2e8f085dae14badceb439713c5b78f2a71f5a8b83e06e2ea7127aecce2bfc9e7ecfa84f87d1f70efead336d7871ed2a62703f8d7d38ace4f8beb5340e7a73c1dda652832a4ddcf28329e11d7679deaf9dc01e0b76465a4cbbf9d2c234f12d7936bc13f9f537ce23961ffbd42a7ed0964493b44db2bf2bcc2e67971dd0ef8bea0f8c476f09c5d5f547ce2454f9ff67bfad043daf452009f7845d1f915717d19e8fcb2a7430735ff9676bfaac878555c5f4be013aff9f3890e32ff977ddfa7d5824fbcaef8c4ebc27e91ff770892ffbf11202ede5238be25ae6f82b878d3d3a52396ffbf0dc23bdd8963d951fab2ecab3fb31658bea3b07cc7d3bf93c8ff3b05c9ffdf0dc0f27d85e5fbe2fa1e60f99ed045e4ff9d651bf72c713d9b804f16b882b687738e13b82d10f94061fb81674f67d146ecbc3500db0f03b0fd58612bd243e423c0f6234f972e5948789f80f0ce75e2fcb4cb46f1fc3c713d9f201e244bd9273202c8bac0fb7ec0a93ebe2fd37c7fa1f77dd7363ebe1f21787c0ad87deab1eb3a5ec8917d1d2313bcbb31415892fd45e29bcf95f813e39d912f9cb8be1b7ecfae9f89e7fb827b16e6fb9e7edd4623e17ca984f3a5b87ea584f395f8ee6225bc45f1e1754b9436d4b0bf51c2fe465cbf8d0fdbe92e9e7fe7c4f74f7d0b9eb3ebd7e2f7c54a789728bfabe599ecaf0b504f752e13327f506cf8415c7f14cf0bc03dbbfe249e2f01f74c9eec53fb59fcbe14dcb3ebf7e27921b867d75f1479bf0879b2eef2ab13df36fed58ba774998f5e0ee4c9b471457c18ce954e557aed21bf4bc4e8aa78d981bfbf5a5caf49f1fb6bc5f5ba14bf97f9df6f4e7cdefd9bc7ae47b6903535812c352ffdddf19f77ffa9f8d49fe2fa474c06ff9be9b2cdd3a5a7ec5bbd5e5c6f706a3e3f96fdc07f39713e57a5ff8dcaef6a3a937d477ed259b6675fcf6b13bc2bfbdbff56e2e96fefb75e7bc6bfe7c87ea67f14beff88ebbf80efbfe2fa9f135f0790b26e517e57e726c83eab00b6f64ad4ff23e4b25b682bbf67dfca71916e89dfeb3d43792fe2c4e5a955cfa50ed0a6db946f549b655f59807c345a47d153da9916cf9ddf33fd998fb97edaa74dbc1c39d617ad1b1fb7513127265a2f664f54f4fb45eb2b61d74f1c761f5986eaec126df16803456603efdbbecb95f71a8af78ac03dbb3652fc2d4379be4c79de385e8e1cb78a3605f636163a38e29d81e27913a72addf785f380e06f52967cc6c29263617788eb9de27a97b8aae3943a5e897c43191b8e3617f266807b766d067414e392d1160aff16c2f6dfe3df73ee4ec1575b29b2c55863b4a5e22f2dbd30fb2df4d8f6db86f86a6bc5575b8b6b1b60978897685b25ecb649c2f6d3fe957ab453f41063a2d1f6400f391e2afb92272bcf45bf5cb4a322aba3b87688c9f2c5bab3626f6771eda4d8dbc9b337e3098f75ff418edec62e8a5ea2bc8c7605367615d76e4ad8dd1287dd5f8e31fb61dd5dd143d46da3e9408f74f18dece39eac3cbf5fdcf75464f514d71e3e591f2aae83c1fb0f88abf4d9c39cf8342dc7071f74fcb7851fd284f37080ef254331e617edadd8dd5b5c7b89e782b56cb745fb29f1d6cf8bb7017f7b3a0cec02be67dfeda17cb71cdcb36b5f10577d3d5903c5f8d740694f16f22ebbf601cffa88ef8f12dfbfacd82cfaaca3198acd32ffef0f64f50732a1bd328cdf7df8e945e29b814a78b2cc18e4c4b5cda222bd45078be72bc03dbbcab92e2bc13d0be731712fe757ac42f4c852f4905c87c6eb21db88d1614e5c7d86bf279fb3eb7027ae8dc8efd9355bd15fccc5898e50f41fa1e89fa9e8ff3878ceee9f14f723c57b25e05edacfaea394dfa5ef3fe15495d10b643d4ba6a1b54e7c9da091b89629cf9f12573196e088f1804063fe6a1a94f3b5a7817b7695f3c08bc13d4c53727ef67270efda3544f8ff90739df8f4b313f06ff9ee361f7e2cd3cdce8a9e624e71742c903bd6939b2de7428df0ee3345ff67761d45f6b3e2bb5d14d9bb88ebae8a6fcaef9e13bf8f53be13f3c2a3e3e3bf8bee0a9eb36b8ef8bd14dc33b9620c233a41fcbe1adcbbba67bd2fde937dcb2ff8f02dd587a46fa93ea7da3651b16da2b8e6224c24cb49ca77621d4174b2c224173c67d729e2f735425ebaf23c1f89c38b82e95b15ee34273e9f90dfede6c4e713b28e2cf389a98e3e9f93dcfcda2fed9ea1e821ebc633153d662a7a4c57f478113c87f9959cd75902eea51dec3a5bf95dd6f56b22bf92fdbd23c1b76abccd5178cd51e27d7770cfbe13fd965139d75df45b56951b79b1b0f83baeeec3b3946fe7c66c1bfebaa2978cc77c452fd12f1c9de7e8fd5fda335ff94ee4c9d13de2bf8bce03cfd975cf78ff8fee097465cfcb807df0b9ecaf967de392354b2b8bc5b397c455d64952c92fd4e77eca1831be1995f3e3a7817b76dd1bc4959813149573ed17807b264ba6e785e277e95b623d4b745f206ba117ef2364fb538c9146f789d93d62ac22771ff0fdbee0190b4ba6293f36cb76cf62c034493f617489c247f4c7450b804e05e2bac8a99e965e13bf152972649fc4322047b6c5e53cf1bdc0bdcb6ca4a8ff8e5c08c293bf37047fb3eb528d2ed2fee5e03739c6abdaff867877a5a2b7ccf35689e7e5e09e5d57005d64be590c9ec976c39be2be44c8a900f7aeada32e15efc939cc325f9ba33cefefc4f797c8fe8252f13c17dc33b9e7c6bf173787d9653bfa6b45cfb7147915f1f246cff0a9e74044cfd58a9eab85dcdc807abeadc8ab50e47dade8a3cedd96fa942bfa942bdf4b7d543be573d54eb56d2ec39d06eed9752df011917f44d780676b14fda6c6eb37e6d6f8f79c77c47d85129ee452e9c4d7a12bc57793957016c6879323ebafb26f6823d0518c2745d78367ebbdef765aa8e8f7ae13dfef209fbf27eef753f4167389a39b80ec4d4878ecba0e3c5b2774785f09eb7d44870fc4fd018a0e62ce4a747f207b7f3cbc9d252bd966dee054e5f13ba78bdf0628bf49a6f219f425d96776a086f9c1e0d9c122fced01991fa2d87b88b86e06b23723e1b1eb41e0d9419e0e63f395b03e4474f848dc1fa6e820fa86a2604c297a6882f0362bccb7c4988f95e3f80394df2453f90c32977ddd4728cc59585f2b611d1e0b8b35d3e2c23a1c7c7f047806c2f21d4f72bdf43470cfaec78030c43cd9e8d1e0d9d19edebbb650e47e8c84f789b83f4e094fcc1b8dca79a505e09e5de5fae625e01ee62d478bdf2bc13dbb1e05743d4ae8ba55d149e66b27283a9d20ae721d6f31b88761cb39d50bc13dbb1e09c23ed20b7bfcd74ad89f8afb9394b0c53cc5e8c94086588b364e4d837dc5fd29b17793f257d6ef45c5fabda85c735600eed955cef75a02ee993c593f976bb645dee17c069eb3ab5c27b70ee80a9f4ff77c7cfcc7886d701d7132dbe4fad669e09e5de51add0270cfae728ed012700f6d93eb3a972ae149bf395f094facc98bca7577b23ef13990277f67d70bc57bb29c394b792ed8e4c8b68b6012b7769dfd2ed7dfd5d49a315d38c07e5e26c17a8328a372e4d87746e2f7268c57de5b2fde53c704617d4094fd13e4b89fecdf05e5e004d90e52cb48294b3e83b6fa19dbb9c889afc75de4e932313ffebdaaf72f063efb45bccf56bd2be62d45e55c9e69e09e5d2f01ba8bf940d1cb143dc47aba896d3cfb27cafab39cfb24e627395fc7182d903eaedacdbe9773fbc43c25e7bb00dfeb385c0138246b1b5ea570b84a5caf8cc9888af91cd1cb815cb56d78ad2247f86414acdd8a8a793651b9ce6a2f70eff2cc2df46ccddd08c293bf37047fb3ebd51a5d649ff30d8a2e3788ebf54e7cb922e60f456f04f26f14bac8355359f83b93e41a03b9a6556d37341057a53fabca2eb98e49f641d4539e6f10cfe5fcaa1f12f885983726fb1baaf5c1b8d7c9329dca71f19b814d621de12469b74ccb37c5e44c866b74e16f52967c06eb43729e91ec8792b66d04f76eb893e19a3a0d1bf9de549956ea296c252bc95ced4f12eb9aa3607d92b479b2e42b6dbe2766f31459060c507e93b2e43318ef2d803c5d3b52cce58bcab93fd3c03dbbde06c2106bd4a6c8393fb23d027dcdd573eac2f8dfa30f2976b22b58bfc6ff663cd5fe6e391e72bba2dbed0964c8fe4fc9efe118bfa9b20f6080f29bd4513e839cba03bdd973b916f56727b60ed7bde6ff0ce29a5de1bc5d6c1d7bd07e482c0d4bbf967516b9b67023b877d94ccf8dd747e77fd3a4fe1aff9bb6a506fd0f5bc39f25f4f8d80b73baecbb947344d5f2e53ec051ce1b55cb97df9cc43e7e27b0e34edcb776bb54912be7e704f0cfdde478d61fe2f92331bebbc9f92f7f2abfc9bfb1fc16cb7ffe7292e6c3d26fab7c6836d017fa90d07f7759bf900cfef6cf56eb77623de9f4cf71bf9b2ecb815af0bb1962fed3ee32ad24f2b764f53acc2fc0dacda89c17f3287826f23de79f78f955cfc53ccfe85d8a7c31972d2ad70716837b767d0c84f19890f59fb89773cb36827b97c7ececf8b0d9273a9d221171ff80a293989b137d0284fd84b83ea9e8f9a4d049cadee6c4b7ebb7099d1ce57d399ef294787f3f700fde8f44e3bf8bca758baccfad81b867efc9f9cfb23c52d39c7b9d2de69044c45ccd483d1fef8ab99a91063ede15ac228d7cbc2bd255a4499277ddeb1cd93f21e23f22e749caf5971bc17d1df0be8ce76648fccb7adc834afc3f28ae723d6431b86757b0be332ac6d523b23fe97945a7e7854e62ee5444f4bd47645fb9c6ee399b15d972bee27645f676215bbc1f116dcc48db24b201d3aa79f3b25f154b0b600dbb4c6773e4da08d1ee8d7440c28d803abb4c1f6a9d5d3e17e54044cc670c540ec83ab25cffbf11dcb372608bf7ddee972adf4d4efc5db570e4fb48fe3357ae5790f512b85f0856afc2f6efd1e5fdae0d793fc7cbd3d58be6ca38d6944f73cf0572e16f52967c5693f5f26d208c6d9e8e79b2ee8bd4cbabec4c542f076bb665fe9977aea25bb27ab94ec6130a3f502fcf7b5be1e7a75e2ecaebfc268aff064c1bfc7d2647d818e924de4fd0be8d8879bd7ed253a48bf2ae4e9e98c31be9e6e8d7bfe8e630a87d1e3eda6f727facaaf6c11c4496dffa2c4ce7927333e53916065677d1e48df3f315fd61fa14f1375fedf703e973be6c430c527e4b943e4dea7d58beafa9f745bac7cbaa7a9e2eee1f54643d08fc5849ff7b6d53f4b94cfcfe822243cca58bca3d010ac03dfb4ef68dc9fad401e0de0d670fd9fe97e5700f27ae2f7aaf3b1579b29fec19459ea863ecf1b922af671279328d3fafc813f583bdc47a9bbdc4daae6a650d52f6ef59a6e8d14bd1e3ca78be11f15ef42585af9883147d59e12be72449beaf28fabf22f4f85dd1a38f5e8f2a7992efab8abc57058fa98abcbe49e449beaf29f25e13f22e14df5de88317bb6e06f1e85ef74c17f7afc77faf8e3544fa79eff9da934c9613afc7d28533183c63d73784fcb5e0deb567815ce7d4037c07ec58b059f9fd89783d7de9f5a6462f3967e72d45afb73cbd58b386bf2fe7f82b633e7b77507effdabf5ed1b7c5bb629cda190eaeecf941f1cfa372bf0531365f9596c0de09fc6ff92ebbbe27bed90cee5dbbf669a1c896dfbd2fde3f04dcb3ab1ce39f0aeed9f50327be5ff6034ffe42e15f0be728723e12ef1f0aee13c9592ee47caec891639087817bf6fe95f1ef39729efd2ce5fb4fc4f32de0be4ef570d43d3725a7aa7e3e39aebf54f883aca3fa99bb27c73b3f75e2f3ae4fc5f53310af723cf773f16e2eb867f129d7d0ca3218cc4dd0ea22d75388f50651599e1e0eee99dccf3dbbf66d10ff7ed53c46e4bb7de57eacfd95f0e4fc8875b86e91017a1dabbe5d9fc0ae04dc23a2fd2df74b8d0cf6ee17271a4b93df662adf66f9ffb66a0daedc33612ab8777f5b2cfbb944bd37fa95f2de57de7b8b64df6fe7c4ef55c993f554391623f3a669e09e5dbf01bed2093c63ef2e43647dabc8126395d1ef80cf8a71cba8dc83602f45ffef953012f11f1acf3b32ccf1bf0e4ce6d1eafcc08ec873357d2a7b354445bb24fa23b0558cb745e53e0d53c1bdcbae40f84bc176250c716597aa3810faa64562cf22b24c50eabb11d937f89ba2a3ec6fff252683cb93cfa0bd1a7651b99fc411e01e7e3b15dcbbf62d69e1d9b7a4372eb31a574ce75f01d75f859d724dde1fca37b20f1fec93c0ff663addaae8febb135f66c8f7649fbff413380fd4b5a970aca28b5c83f597a28be8eb8ffe0974f9d30b63e9784517b957c316e5bdb280bac8ba84b2374154ec4d10fd1be822f637286ca3c8906baf262bcfe5daacff14d9b2bf1aec7b10fd374178b2edd7516353b2b42bd34734deeff83d932dd67f15893664642771156baad2e45acc23c13dbbca759147817bf69d5cdfe5cadc28da00919d812e0d15bdd214bdc49affa26be3df8b88355969b27e3e0ddcb36bef98ec345997cf1157b9ee6b8af2fb04711d8ffc2eebaa931546b9e2f924a163fd24b67ced7dbf4cca15df45c47b91293166eb44bd323219c896ccc47ae8b43a4a3875bc7096893557cb2e1432a629e14c8fc98ac8bdd167c4c266dd49fcd96e203ca55c4babab845d57842df67f2b16f59c88a8ef4566fbb0b1130847946d69f59470ea79e1148bf36f8a453a8f883410d9dd47389d4138a29f344dd98b82dfb3702e14e188323e22f73e92fb054196f2fc8d442c1b83b045df655a0325ec065ed8cbc5fac7e5a24d1791fbf5ce4f316cb0a784ec7f4a6ba884dd50842df6bd5b2ef2f488dccf68cf14c306fb61c87eb5b4464ad88dbcb05788f95f2b160b1972efe90529860df6a9907374d21a2b618b3d3a569c28c216fdb811b9e7f1c214c36e0ec2167e98d64409bb8917f64ad1ffbb523296fb5bee9b62d82d40d8627c29ada912765311b6c8ff578a7e9388dc576c718a61b704618b31adb4664ad8cdbcb057897ee655320d1788eb921a085b8c41a53557c26e2ec2de2cc2967bb48ab9b191c214c3067b76c8b39dd2943d51d2c49e28abc4fe0725325f2e12d76529860df62d917367d35a2a618bfd494ac4fe8725622e46449ed5b13cc5b0db82b0c598619ab25f0bbf67618bf946a5e3858c15e2ba32c5b0db81b0659dbfb512766b2fecd23211b62cc3c5dab448498a61c37d5544bd2cad8d12761b11b628ff578b35f911b18e3cb23ac5b03b82b0659d47d9a786dfbb61af16fd3fab2f1432c4dce7882c3f1395970d4138620e595a3b259c76221c51feaf11634591b54a3841eb1edd41d862fe405a7b25ecf65ed86b6688b0455b2022cfe1a8f0616323104eba90db4109a7830847ecff5f2675ad54c2096a633a085bd49bd23a2a6177f4c22e13eddf32994e45ff4f64bd0f1b1b8070ea09b99d9470c49e3a65a2fc2f93e5ff06251c68e3461f36d603618b7d72d2943d86f8bd1bf65a51feaf5d2c6488798a91fd3461efef23ec9e20ec1e22ac2e4ad85d44d8a2fc5f2bcb7fb917f3812986dd03842ddb285d95b0bb7a61978bf2bf5c96ffa2df3a72708a61f702618b36479ab2b712bf67618bf2bf5c96ff9bc5f59014c306ed30b9d63badbb1276772fec0a51fe57c8f25ff469470e4b31ec3e20ecbe22ac7425ec7411f66611b62cff65de71788a61f775aaa7b19e4ad8d2ff7b3871fd79fcded5a952ee9b68d0e6ad923d5591fd3322bb8f225bc619b0274db044dbd3f277d99e3e02f91db6a7992e7efa2dfa2bf6f4f7ec59b705b16780628fe80b4f03e775a60d4c2c7bfd7844f62045b6188b4f03fb6b45e4f925d27639feb10ebc9b88a5fc7d82f2bdfabbc252f6d754852bc76d8e06f7ec2af7759a0aee99cd22ff5b2ff71414637ebc0c917ead892f2997bfc7e41e93206efdc4f75045bfa19e7e1b2ae3dfab8a13b9efd43470cfaec3417c0f4f2c7be3684476b6225bf415a78179f111d1ff1591e3bd62dc264dee3bb51e7c9328dee5ef1394efd5dfb17817e1a7c9fdac8e06f7ec2afb28a7827b66bbc8ff37dea8c4fb6e49e25d8e2bcc00ef33f9c7068bff88ecdb146d9f34b94fd55670cfae63007369dbce208e455f6bda58473bc69bb60b787717f02ebbca7da336837b97cd7e772ab2e57732ee8e03f74c2fe1fb69e315bf191fcf362d47fc7e3cb867e1e5c6bf9f26f7953a01dc4bbba19c13153927c6eb953611d82ec61d23809d367e85ad729c364deeb925c66937c9b59a0ff99317ffac6e84cf4b9eea1439056e753a93bfc4725fbf4787cb2f931f1acefbbdd9ffd83ffd78b095ce26f7d322ddc9ddf3f8b9e095ce706798f6e4ee8e7c7eb20c7d22ff7f81fbc60a2ef4a4b46a41dc552d08a65c89fb6f113876bcc27d3e859f5ace0e1e5fe1fe32c499e15ed9578b9da1cedeeebff152e6bbc19638ebdcbb7cf7ff655cde6257edea6f2633891d51ae7e33d795e99da05eea3e9140cbdcfb12ae611effff7aae6911d77e9afbac929fe7beda297626b8d78d3cb4eab697bb7febc2cc17c8f43aea0f52c79e7bc7b5cb68ca75ad61da67f2fcfdff626447c4081f1a3929cd4b867532f968f831d562e2ff187a990c1b549926640ce5c82271cf863999ec960f4a98da58dd42bd7f7bbc473ad9096dd19361d1dd995b108be1b74f6cfd40d93bbfbf5637deb4e14e266f3e7549625a22b04c5e065fc110c484ba75eb64314555fc111d7e3ee497578bf8bdf756f0f78247403d5ef8c547005f1e92effeb1d1fdafc47d798efbff02f773a6e244ae92a75a892bb05a2c653191f539e8eac568326531d4511dea06b58d3a79de920875832abb62a8d93f7a820d1182c974c008a6e908f27ad9425282d52b61f2af09eeb7cb5d12eb79c9bacefd5e57694bcc9475d20e5698ea7936e63cd3b555c9601a6184eb68086731c24d744a36549464fa2182eb62829b1a0aaea7f309dea7bea2567c22cfad814d77558c495bc3eb552c9c0a5eeab3f7e671df665e5fe6ea50e936dc56f07ca910c48e9494d85b9af9f696e6dc5b06036fa9795d313faaaf8b153e2b612569accc739f79cd9549fcd715dc3e56db2de0d267bbb9cb4a511766d660ef4bda33dd6ba1ab5f09af01258a9716bee3a5258f17d6f545a92d16330d740991c54c2b3f09b1259e101b62825b1b0a6e84096e6328b8b1ce49f9f495c53bc44959b1c8ea71a5ae35c5a2f697e8ddc40ed9d6b743b6e30ed93b814306d50c73be26baa8640fdbfb89ca76785436c504773014dc0c13dcd15070734c702743c12d30c19d0d05b7c404773114dc0a13dcd550706b4c703743c16d30c1dd0d05b7c504a71b0a6e8709ee6128b83d26b8a7a1e00e98e05e86823b62827b1b0aeea413cc0a993e7e042728a83a6382fb1a0aee8209ee6728b82b2638c35070378de04c9efb17383baecccee30dd7422ecfacd4eeafe3a32db5d9d86f065f795a73ba61e576775d7432ea03fd44e7003c3ad331c1830c05f7d0f9092fcc17ed403ff13aa41257e693fbc860df3e3284fb48afa43ee2572fcc3f7aeaa291d1cef4138d43f068ec8509ce3214dc1b133cd450701f4cf03043c17d31c1c30d05f7d30966adb96c3f821374cd646085c008c342a0bf2e71f30a75d10e49dcde18db9a24196cf03e05364d224de194c9ebf7fd1324e9d4b57173e3cde3c0ff9e7d66c6b8bafa9c6514cf5968d4c07299013a7f62d13e5ac3298b7162c5cb38f0bf679f7966d7bad53c6d14ee6903b120c7240ab20aa41be4f0e1c3c7050a721016e44e6890cb962d1b27c31546070a72b02e48d685b7b39f845a1f173c0413cc26a7541bb261ca07919e8949dfa526a467e93219de06ce27cd64e225b3dfd6702905eebbc1076cd86c9f810a0aa4b2308e27e90ed58c4bae02966087ea10f2d6fe025284f1fddd135cbd2bb84cd8bfadf665cbb712e31caf4b105a9a399c663747ed7d0fa60d467698cef599734ed0c6b7eaf6e370b71fae8b33de91b26407c6191cbdcde121ec2de229781c4eacb21094aabc47a76fd2d80aa6075f4acbd65cb17f86d4c23ff591d27a1277c69a360f73ce6ccc39279b3ae7084cf21453c92331c9534d258fd2496ec06fab8fa5ffe7fe534d78435cf868ac08dc4d5704b2b7594af3ba03d6b8cdbe3d9d196ebd22d1dc887d78e4cb2fd2f9bc25f96e3a4f4fcbf8df6c147129af4396f29964156286449022770c66cd749d35ac25b18857272bf8387791334d54328384b9932ebfe3ddb087d44a7e976c32a86e2cb0fae8ad9c0d38b75a7c249f449a38b79ca1cb2d796ff224909dec782bd892b446bc31aacf0267f12cd02e9db10c74672c1dccd6a583d63c1d2c722bac8b78ad0ca65ef69c4de22de7b604491763311de6e87468017458c4d34165f559560142df05cb3477d7649a6c278e2099e6ae986973b16c66354f0ca5fc61ac5d1bc4a071589879ba30590f6821cf460b5ce763994b618ae18ec7c2cdc76c2d101385d7f3aa522a61e66061ced385d98c8759c9dff43257e636a9853c01739bf91ab7e9100de6361331b3f6d099e5e89c3281eab93ae9ac1cda53930167b10c78af588ea786330b0f671266c5029d156de3d235cbe38a9d15a294d0cca30c60ef648d1e997c30b1f6e7fda63617926da2d15ead193a58eb7aa19368da6ed0999053306fd907f3967d53f296a998b72cd2794b4bfe43acb6c862a1807f37cf8dad42f177102f99a6f3123e323caf16bd04cef8950da260beb258132d997c20ba63353bfc84c6063beb39e21facd5b784bb5c6a01608eb71be6104b93651f45bc446111c45c9e39c84683eac9744c8f429d1ead801ecb793756a1708ad43598816950a4d3a08d96c42c51c54c5d8b999816cb745a34075ab0d08a8daa88b3b0b08b7561374d5894040977b62e5c56742cd7e4c86cce7835e10b71e173b09c750596b3ae4c2967dd1d83b74a07af8592b3ce70ff5beabe9a6abe3a57173acb574b7456b22ca454c971d4c096e081e561f1b55a135f9180f1958fc5d71a2cbeca528aaf79587cadc5933bec6929e715eb5522db4d35dee663f1568ec55b45eaf1b607166f959a788b068cb73d75c259bcadc3e26d7d4af1b617166f1b74f1e61514b3dd388ac51d2bae96b9d754e36c0116671bb138db947a9ced8dc5d97e9a38ab1330ce166271b63f166707a41467fbe8c261840ff493d6646f6689285e528db77db1783b088bb783538fb74558bc6dd6c45bdd80f1b6188bb743b0783b34a5782bc0881d8611db923ab12598931cae731256fb6019b057f5af509aae41dc622906f3080ce69129c12cc4ec3b4a675f7391080ac46c3fcfdd7380c5416c2cc222f2682c228f493d22976902cbe47369591da9b6da787ed632ebdb766c5390860a131edbda4619dbfa2383378cfc878f35c68a3117394ee722ac6b6b1d9799e7782b039706cc119763e11daf0b0ff64b97297972ea8d8e15980e27e87488efbf92e34393b94794562b2982e8b112cb064ec4b281935836d0326836b04a170eebd23cb9eae558385b1a06ebd22cc18c380533e2d494f2b2522cd24ed3455a071e69de804a394fc6cb9591e958ae364d0c790489bad5ba0c87cfb15f4d9ae1241b78624399eb78e2677fcb3e827c1e766cb9b9c960dee9ae7d5d15dcf21f7d767506cfae8639c987cd6a427b2ca35ba3f31f9608ced424827b032682329d70964ecf720c87fed76292cfd6488e04915cae93cc5cfe1c5d82628b5b4af9a40dafb3653eaff4ace32e1d24e15460d170ae261a0a9b048b864a4cf8791ae1970614be0e137ebe46f8f680c2d763c22fd008ff3ba0f00d98f00b35c2339a0613be11137e9146787e40e19b74c259e172b183142e9738a9142efb6169e1525d5af05a8b534127b0bade3dd72912854d90b4b1bf468b4cbebeaa763752f1b2da92946ab297b99a76af5e3c8cd3170d973bd8fe288975c032f903b078bc42178fcd9c58cdceabd5a65ea73c100bf9ca64212f72d979030ac5559e1424e4837421b30478952601a6370f96000fc6ccba5a6796d7829cc88dc977ffbfca293268256fc6c2be461776070529ae03fb9db96ab0cafa2118e66b75397440cc8762a6b253244d66cf1fa613ccb294ebf5e9b4baf0cb71e15b30243768903c1310c9e118921b0d911c8121b9498b64fcf820488ec4b4be39513630bc0632a0a3b0906fd1850cc71217c5756feece5fe0b5af1432a3a3312d6ed569d1846b91cf47928b79f657ce8ba935ae3e41423d0673c4db348eb8a55530473c16137ebb46787e40e15b315e77e87835d5f09ae3febcce9b4b1d80d8719851776a8cdade3a9851c763c2efd208bf30a0f013306277eb8879f34ce6f22ad0263ea93208a513b1b0eed185c5369959cad3b13781b33285f4731286ee5e0dbab276c1d09d8c09bf4f237c7c40e1a760aceec7e2a544342783533a1533e4015d7aef10cc90d330e1db74e93da0f0d3314a0ffacd1fe5b07d105e6760263da44bed1d8399742626fc615d6a0f28fc2c4cf8231ae1df770a26fc6c4cf8a31ae1db020a3f0713fe9846f8a0cec1849f8bb9d1e33a376aa571239625b2b10256e87b0b67831520e761e63da1316f639760e69d8f097f52237c6a40e11760c29fd208bf33a0f00b31e14f6b84ff1e50f84558ac3fa38b755659a8ac9a3392cb0ba602474e8e0e12d717ebc26535e6671df346c4259851cfe98c82b3cf64e747ea75e64bb1b09fc79351fc02857c3107cefbdbd327880697611a6cd769c06aed70f1141c849bcdfbcbcb79220f9a982fd76891c9f7dfa9fd89d46c1d5df06ea7175c3d5b57f3447da7d38b4ea269d458f85897d315588a7f4993e233d283a5f82b75c259c4bcacb75715fd222efa2a4cef57347a2f0fa8f7d598f05735c2af0c28fc1a0cca6b1a28914050aec5f47e5da3f7e701f5be0ed3fb0d8dded1407a5f8fe9fda646ef063d83e97d0326fc2d8df0d77b04137e239601beadcb0061f65f2a6a2da967ff376161bfa30b5b97fdc30c38955ad4cd9806efea34600d4c380637938f35040bf1162cc4f77421c235792c54af8b2875e2b762a1bfef97f84c43fb6fc334f82099fdebab1ea76effed58e81fea426f93c4fe54c760efd069c146d53eaafa411955fbd8496554ed4eccda4f74d6b6e3d6e6b969c9eba62fa936b766625ce74a108befd269c2869d3e75aa4f8d64c92cc8d4c8bb31333fd399d9b69a99f9ee35deb4d854ef2046de83e9f1b94e8f865c0f9669b17ae32cc7dbbd2d4878f762e17d913c31abe1a63626731fa6c197c92d9ec3c35b1f28bcfbb1f0bef26fb10c37358b1fc092eed758d2fd26a5a4bb0db3f45b3ca39ae8781bfc94572dda63fdd226ed9207755ab09ac7774ef59ac7e801c16a1e0f698467f2bd416b73b45ddd9f3d58b3e77bc7ef5e423f38fa91f664e163cd9e87b1a8f95113351b0346cd2398f7fda4f33ee6dcf1ad62595109e26b8f6261feac0b938ddcb1319722378f96ebeb539d12fb1816f22fba9059e9b4dcfd77a1b393c3e6bcb16bd0b9d98f6391f7ab26f22e1d1c2cf29ec0ccf94de7ac01b47e1213fcbb8e135bb497ee64baff0509e3292c7ffd03cb5fff4c297f7d1ab3e52f9d2ded79fe0a4769d5c560b9fcbe58ec8a186ccb9c6774bab0eebdbf9deadd7bcf3ef3cc2e41baf79ec50cfd074bcab13e4bd8b916c4a0e7b030ffd58519df4f3ac74dc4157c8677f07ed2e73190ff6940b2ed1d8380dc8ea559b6dc514db36ce7c12069f6058c582482b48af2c470ea7251caad70f613ae3784ff1b84db8b9869518d69f9c38299f612263c4d233c2b3b98f097316e7574dc9a706e95bce4662dc75479bd82855a57172a537fadd1a48e57b1f0eae9c263b58ddddd5026f1ff720385f41a16527d2ca412311cca2c0b12d2eb58480d7421b1e2decb8716198f9cbd8185dc5017b297f57b8d88441aa4d69c7853a34b26dfa9bd36d74d4d70efd8dfc1ebbf8d5c642dd5bc0f39f82ca25f34952870acf2fb962e0a19b6261a7daa4fca67aa2092dfc62437d5488e0691fc0ee676cd746ec76a99b1427122afd906ed7479170bb1b92ec4d62089a91d3f6c5d486c17ab203abc87e9d042a743174d624bac4b6ac9ee7d4cab9658b12167b49af4d77c8085da4a176afcb2377de8a959ff21a6476bbfd6a7d277f311166a9ba0d69bf5e07c8ce9d116ab6a494f8cef238ced801324f44fb0d0dbe942efa8490f9816a9d1f814d3a73d4603e64aac002ce05580e2948ae2cfb0d03b607962be5b0ce6b8214f775bdde9cefe2e99030385f839166247cc5e5d885ebb767fbeec2048e85f60a1774ae67bb1ad1166f2b45020a6110509fd4b2cf4ce7e7d0fd32235dffb4aa70f6b1974d1b40c464f0cd632f81a33b66bc4ac17e41b4c70371dc54efcbdd562f08ad14be75534fd56bc159ce1ba80b3afbfc53876d770dc1890e37798b9e93a737b053257dde9345500df63007a68009c382918801f30003d7500d898c3246e946722dc76799e9b93cc48a1b9f923665e2f8d79b70634ef27ccbcde588b8f8dbc7a13de8355057fc6cce8a33163cbd46066fc8209efabeb9d991e4cf8af18a37ec9daaa53b96717023708d651fc1b167286dfb6aa4e83d4b2ebdf315dfaeb74f176f68ea57dd6662e70ff0eb622f30f2ccc01ba30d96d6ae1fc89853310ab88b069e0057c83dfd4fa90fec21c7690c661c70674d8bf31730663357ccf1dca5d6c6ce3ac49bc861974e7de7fb050876039a574d2196252452cdc898eb73a215872f917d32053a741674d7249a4496ac9e63f9d4e2ca56645cc77ce631f680d1eaa33b86942e4418c8a60e10ed385dbce17e8d4f046359a64a633e6b5b9bbec3c27b607706abbcb0eafb223062eb307b3a3fae6af7e42cb76e53560e21834b6dde695b31ce765f7bf03dcffe6cc72b03df64744f41bcefa0913ebae4bd3790bcbeb466af2baca59c1f2ba3a982b8ed2b9623a2f22bc31bc74ae76291f6c62951966d206f737769fee789b0ba48b5c319db7750a78761fc43deb62a68fd6987e6140d3eb61a68fc1325cfc1490a294f281fa98793b69cc7b26a0790d30f376d699d7d5a9def4f06adce9dc2cd6b888cd0f60cf96b9ff9638de2976418c6e88193d5663f4ef018d6e8419bd8bcee8de4a9c2e891b8f19c4e335d65d9a2ef2bf725e7ff79c5e420a56d036c610ecaa41d07b7630044d3004e37408d8dca7c93c659608832a398a125141830dd0202636d569c1caedf19a723be8cea9cd301373927504552f37bd13808298d61c0b7d82df8e204c8bd4caf01618ea893550456a89b96aaec655bbcc09e6aaad3092937424d9519b39ee83399c59ba93c119cad1e8feee1376484925cfaa581f4819272bd329cba8d2f9dc8852671dcfbb2b03e7d7ad31d29335a49d80a4db60a4a7e8faa102926e8b919e8a0d66b1e34a5771a21b38b95809c7c87bfeda3f10bd76980ed3b07e0018bf93f94f257ce7ffa0538bdb636877d3a0fd3e20da0e9859d3b1ec60ae235b8b5ef3379d6707e971e6c697b7418ced88193b43636ceeeec18ced84099fa9115e961f4c78674cf82c8df053030aef82099fad11be2da0f0ae98f0391ae13f0714de0d13bebb46f8eb018577c7bc772e565b88758d31af9dc93353d6282ce33508b9896bb00a513aa6451e5657adde5197589bd48ad61e985ef95807da7cf7cd5cb7609f1d289c9e5838f3b06ee43c3eb236c92d1067060aa91716d27c5d484c428e5b14e407b4a73716ca1e580f1ab62e3848a87db050f7c4ba21a56de929c65b5f2cc4bdb04edd5888a9c6603f2c3b58a0c90e3edf2b5876908119b4b7ce20d6c1a29e80951ed786626d2aaff91fdbb0561db90a627c7f4cbf855846914c3fafb903d725a632303e00d36b1f9d5e038df48a75ae787533f95bd0e1f4811a9d337bbab791c58e4de71ca776c6f1be11bf6b4b1645589f9dd71750339a613d7983b0a4bb5893746fdd3758d21d8c092fd0087f24a0f0213ae1cc5796e830ab821961447026a6f5525dd53ca0d65998f0428d70b7821048f8504c7891ae2abc3898f06198f0651ae19b030a1f8e6556c5bacc8a85ca368eaf709dbed0290ddc879b8d85b65c179a77805e6cbb7a186a6a75b81158f82b74e1b36e5eafa1c93257d623ea2d1c5f2d762991196e100d46621aacc46a09310de082e920618ec2c25c8535b66361eee12c17bdfaa91c0b301a0bb9048f6f6f5730f6b07ad841274a8cc1c22fd585df29cedf92e9919a07ee8425e6d59ac4fc7661b0c4bcb34e387b7f8d9f9cb9312e78acae7ac0662845d8011474d58379e2888a4d7c2650b1186188c98c1d3ccd8adf446fb398f2e655aee37a24ae3094f9ae30ace51586c18e43a82b5685d84517dd6cba6f79d50fca0abf0af78728d7bb32a9dedeba3c96e72d73bcf39e83eb1d641de1ae585a5d8795446c2462897b5bccd36ab09582e3b0d0d6637922acf2991cf53b1e0b79832ee4a1eeed4c9eeb5454f510cafd3fe3871d19fdea47ae2f13eb1dbc26028b2bef9a2eb6fd08be01450ea6ff46ac97081ec71e9f1252df7e6402a6c526ac248f6db6e3353dbd19b7a96b3011d3603fac872156b6ece1948b12254888b95888fbeb421c6fe83905dcb3d788263a4bd1cc87e4b0ca322e33b157f50864dd24ac643c405332b65816ac649cac13ce0abc03fd948c2d71c153b03839c88fe00438a662820fd645761f1ed9dea48a393cdb6695954cbed0baccf176c964d5b94c07eeb4338567606c7c2cd32d084bc4e06eb0cae5342cda366ba26d6bc068db4d279cd53b0ef143772dded49c8ed13dd430da66e804b38ae5617e046fc505cfc4046f89543f706d80a3e19c40f82c2c120fd744e2cf01237136c6fa089d270f37f664b997d6047eade41953a6238fc692bf066b48ccc1001da901b4b03818a0dd314047e9006513034a752baeb918a2a335885e0f88280f43748c990fc557e4e2f3436ff37e3da454b6f6cfc752f0b19a14dc2e600a9e87d1dfaaa19fbf3c18fdf918fde374f447d400fdd851007afea91d15b00706e9780da4ed0121ed89413a4107692c026906470321c58e62f226bb143be5a2069b19d723247753d70393bf06cdf8f6c2909da84136634530640b306427e990ed5acbc8585337d53d19f6c6b09dacc1f644406c0b316ca704292f8261938b3470ef2a0888681f0cd1a91a44b92b8321da1743749a59912af78a8179153c92438f27d5433b1661884ed720da1610d1620cd1193a44237d238208544c72ab0f1c937c2308a6020cd3991a4c635705c3b404c374960ed3985ac6343bf094eba518acb335b0ee0c08ab1083758e0ed64ec6b0d41d2db0ca42ea071b1761b8ced5e0ca2e09866b1986eb3c1dae61c6b85806cf3a04f598e4af41f0146378ced7e0b931209ee5189e0ba82afd7237103da054762a598101ba500368506930402b3140175101921b8660092df86626ab3040176b005d1910500906e8121da0d1355253c2cee6865d10a98de39662a82ed5a0eabd3a18aad518aacb74a876ae255466c3cf6b306097ebfa2603022bc3805da103965923c0d4bd3253edb45d8b81b95203a6c19a6060ca31e15769849705145e8151bf5a477d608d509795fe5469576240aed100f93a20907598f06b751d3f65c184afc7685f47473bf6db645752111f770a427b0306e47a5d274f40201bb13ebc1b347d78ec888f207d789b30cd6fd4f5b5ac0da6f97e5854de14a41d631e952c13f3aa515e31b80a3c0912cdfb633171b3262686048c8903b098b845d77d1330260ec462e256ca2c2cb68d7d2ab40fc280dca6ebac290f06e4600cc8edf8b8766db9a65745611593e58eb7fd4bd0dc7f3386ee0e5d274e40748760e8eea4f425b393820ec580dca5ebaea90806e4300cc8dd7440e039d3a924ae2d18907b745d3201811c8e01b9570764708d00513b5c52817204a6f77d3abda73b8ed8da357e9a8aa7134bb86cbbcbd836062baab44fd74c4bda89bfc1d6616c12be2ee7f6a78bd9fd6c3546fcd41aef776f47ea189b71816c3e12b3f97e9dcd9d9cea137cd8de22e96e8b9d4d6662f6c233315259cb7214a6d1033a8dbaa01a559f0429b5d92985d52a47ebb462b7db226c0b46a5f972dad9bbbfda3cb7bc5a0075f1008ec1cc7e5067b67796f922318faac461e7797a6b0d5704acbb1eab0b97cd3e7a28c236d08a0fb7bae471b8e4ad3ac92cdb7838623635f8384ce5474c553e1e93fca8a9e41330c98f994a3e5127994d587adc0fe60413964ec2547ec254e59331c94f9a4a3e4527992d147aca0f8c040b854ed50966e71d3ded47f00fb8c6a761829f31147c3a26f85943c16760829f33147c26e6c9cf1b7af25998e0ed8682cfc604bf6028f81c4cf08b8682cfc504bf6428f83c4cf0cb8682cfc78a91570c8b910b30c1af1a0abe1043f19a218a8b308d5f37d4f8622c437ec33443be0493fca6a9e44b31c96f994abe0c93fcb6a9e4cb75925915f69d88f959f05760f9f2bb86f9f29598d6efd580d65761b0df37857d3526f90353c9d7e824b3051f1ffa219d830bbe1613fc91a1e0eb30161f9bb2b81ecb933e31cc936ec054fed454e51bb184f2996142b90953f97353956fc61ce30b43c7b8056b767ee947708276e5ad3ac16cb3b2af22e69b95dd8681feda14f4ed18e86f0c41dfa113cc96687deb4770735cf09d188bef4c59dc8525edef0d93f6dd98ca3f98aa7c0f96b47f344cdaf7622c7e3264711fc6e2675316f7632aff62a8f20398cabf9aaabc0d8bbedf0ca3ef418cc5ef862c1ec258fc61cae2614ce53f0d557e0453f92f53951fc5a2ef6fc3e87b0ccb95ff31cc951fc704ff6b28f8090cf27fa6909fc4fc82ed636be2174f612a47a2862a3f8df945d48fca09fce2194c709aa1e06731bfa8e3477002bf780e835cd714f2f3188b7a862cb6632cea1bb2780113dcc050f08b18e486a6905fc2125f23c3c4f732a6726353955fc1fca289a15fbc8a096e6a28f835cc2f9a19fac5eb18e4e6a690dfc0fca285a15fbc89a9dcd254e5b7b0e86b65187d6f632c5a1bb2780763d1c694c5bb98ca6d0d557e0f53b99da9caef63d1d7de30fa3ec054ee60aaf28718e58e86943fc254ee64aaf2c718e5ce86943fc158743164f129c6a2ab298bcf30c9dd4c257f8e51ee6e48f90bace73a3d6ade73fd25a6750f43adbfc2b4ee59035a7f8d09ef5503c2bfc190f43644f22da6759f1ad0fa3b4c78df1a10febd4e38db19b85f949dd9ac0aaf26fa455cf40f18ed0c43da3f623af737d6f927ac5b7840d4bc5bf8674cf8c01a10fe0b267c500d08ff15cb5b079be6adbf619287984afe1d2bc2320d8bb03f3095b34c55fe134b31430d53cc5f98730cab01e7f81be331dc94c73f188f6c431eff622a8f3055f93f4cf24853c9acff4c2b7994a9e4884e322b6046d7400113d50967f343c7f889c301b8e0348cc74ea63cea60927736955c57279939f4584387aea713cc32bb5d0c33bbfa188b5d4d5934c0248f3395dc10933cde5472234c728ea9e4c698e409a6929be824b301db89ee0f698ae42c761c5cba53fd7fd537ae1d8507d95417243bc724d78f37b6c30537c3dc7c92a19b37d7096673e226fb119c604e5c0b2c5ea798c66b4b4cf25453c9ad30c9d34c25b7c6f2bfdd0cf3bf3698634c37748cb6188b19a62cda612c661ab2688fb19865c8a203c662b6298b8e188b39862c3a612aef6eaa72674cf25c53c95d3018798630ba628e916fe818dd3016f34c5974c758cc3764918eb1d8c390450f8cc59ea62c7a622cf63264d14b2798b50e17d440ebb037a6f5de865af7c1402f3405dd1793bc8fa9e47e98e47d4d25676098171962ee8fa9bcd854e5013ac96cca66811f95131ddd85b15862c86210d6505e5a030de5c11ae199bddddb489e4379a248bce45cbebcd73bd29bed795feafec69603b345bc2bdce7894f0929746de8a1e1c059441416fcd48da2283b75a37d350b93e9819d00324447b10fa338af1629e60b99797cf7ffd529905ca6699c65f6657674ac66879fd0ba5445833e1e8a793ca4261b8b8b4c2c812f374ce05958025f6198c08762097c650d24f06198f05535207c3826bca4068467eb84b3aca934517a570360491d0960842e00966a57ebfa28583200feac86538c873312f3c835861e390a135c6628783456375b5b0375b331583a2a374c473b6195860ad34ac3ce98ca95862a8fc5545e67aaf22e98caeb0d55de154bf31b6a20cd8fc3b4de68a8f5784ceb4d35a0750e267cbf1a103e017391fd4d5d642206fb0043d8b9188f036b80c7244ceb830cb59e8c697d700d683d0513beb906844fc5ca81430ccb816958117c680d15c1bb6145f061355b044fc7086d312434032374780d119a89113aa26609cdc2081d6948683626f82843c173b08ce068c38c60772cc73dc634c79d8be502c7d6402e90a713cec6bcb7fae19160cc3b1f037d9c21e879188ee36b00c77c4ceb130cb5de03d3fac41ad07a4f4cf84935207c2f2c299e6c98141760ac4f3164bdb74e305bf570aa1fc109563d2cc4d2f869a6697c1f0cf2e98690f7d5096627a29ee147f0105cf0228cc599a62c16eb24b3f18eb3fca89c60bca30053f96c53959760ae7c8ea12b2fc5543ed754e5424cf279a6928b3018e71bc25886a97c81a9cac53ac9dddddb0bdd1f5a2695dc189f54b11c73e68b0c9d7905a6f2c5a62aafc4e2ef12c3f85b85a97ca9a9ca2598675c66ea19a598e4cb4d25afc6245f612a790de673571afa5c19e61957197ac65a4ce3ab0d352ec7205f630ab9026371ad218b4aac1bf5ba1ae8465d87f1b8de94c77a4cf20da69237e824b3598137ea1ab335322b70a32e48362bf0263f919b6056e0268cd2cda694f6c3fcf116437fdc1f53f95653950fc054becd50e503b1e8bbdd30fa0ec258dc61cae2604cf29da692376392ef32957c08167f771bc6dfa198caf798aa7c18a6f2bd862a6fc132a9fbc832a9c3b120ef270bf2082c613d6098b08ec4627c9b698c1f85497ed054f2d198e4874c251f83497ed854f2b198ff3f62e8ff5b7582d942c747a3a60b1d8fc3747ecc50e7e3b19ad6e33550d33a01d3fa0943ad4fc4b47eb206b43e09d3fa2943ad4fc65cfa6953973e05ebe17ac6b087eb54cca59f3576e9d330cccf19623e1d738ee76bc039cec0846faf01e167623da02f18f6809e85f9c78b86fe7136e61f2f19fbc739987fbc6ce81fe76251f84a0d44e17998f0576b40f8f91892d70c915c8069fd7a0d687d21e6d56f187af545587efaa6697e7a31d617f396615fcc2598e0b70d055f8ab9c63b86ae711906f95d53c8976392df33957c0546f97d43ca57622a7f60aaf25558fc7d68187f57632a7f64aaf23598e48f4d255f8bc1f8c410c67598ca9f9aaa7c3d96837e560339e80d188fcf0d79dc88f1f8c294c74d58c3fc4bb286f9cd58c3fc2bc386f92d18a5af4d29dd8a45ec3786117b1ba6f2b7a62adf8ea9fc9da1ca77602a7f6faaf29d98e41f4c25df85c1f8d110c6dd98ca3f99aa7c0f96307f264b98f76209f317c384791f56ceff6a58cedf8f09fecd50f00398c3fc6ee830db3087f9c3d4611ec454fed350e58730b7f8cbd02d1ec65cfc6f32177f046be3fc63d8c67914f3c47f0d3df131acc2f25f0d54581ec7843b69e6c29fd008cfece7de465638946b06bd035287880354870369b143419984f9fcd4cc22f729fc7b922bb59cafc2636bf23c595252e2b585119759570d33ce2da270e3ab03a3696c75e060fe0595ced82ac227b1a84fab81a87f0acbe5eaa4996e2aaf93cc8e30ae9b265f4ea27682238c9fc1d4ae67aaf6b318edfa3540fb394c78831a10fe3cc6a4a12993ed98e446a6925fc08ac2c6696645e18b58376a9334d36ed497309d9b1aeafc32a67333639d5fc162b0b9690cbe8a496e612af9354c724b53c9af63758b567e623041dde20d4ce5d6a62abf89a9dcc650e5b73095db9aaafc3696d9b5ab81ccee1d4c78fb1a10fe2e26bc430d087f0f03ded114f8fb3ac93ddddb4e7e7c24c1e1ca1f602a773655f9434c721753c91f6192bb9a4afe1893dccd54f22798e4eea6923fc5caac74c332eb33ac35d5c38fe004ada9cf31163d4d597c8149ee652af94b4c726f53c95f6192fb984afe1af38cbe869ef10da6723f5395bfc554ce3054f93b4ce5fea62a7f8f491e602af9070cc64043183f62297b9061cafe096331d894c5cf580138c4b000fc055339d354e55f31ca5986947fc3fc62a8a15ffc8eb11866cae20f4ce5e1862aff89a99c6daaf25f98ca230c55fe1b5379a4a9caff602a8f3254f95f4ce5d1a62aff87a93cc65065d679aa4d7d3b19a6be884e30eb89dfd98fe0043df1519d600679ac29e4344cf22ea692eb60927735955c17933cce54723d4cf27853c9f531c939a6921b609227984a6e88499e682ab9112639d75472634cf22453c94d30c9934d2537c5244f3195dc0c933cd55472734cf23453c92d30c9bb994a6e89499e6e2ab915267986a9e4d698e499a692db609267994a6e8b499e6d2ab91d26798ea9e4f698e4dd4d2577c024cf3595dc11939c672ab9132639df5472674cf23c53c95d30c9f34d2577c524ef612ab91b26794f53c9dd31c97b994a4ec7242f3095dc0393bcb7a9e49e98e485a6927be924b346ca3e868d94de5823655fc3464a1f4ce345861af7c5345e6ca8713f8de0cc0c877ca2ca3cf7d90af7d74dce24feeb0a3ed5836d0e5deeb04da12b9c657c5247299fd681bd2da79fcc74af85ae764c8fc413550afcf0aac4fbad327411c1782d3114dc1f4b464b4d93d100cc290b0d9d7220e69445864e3908d37899a1c683318d8b0d351ea213ccf725f72338c1607226e66f2b0cfd2d0bf3b795a6fe361493bcca54f230cc2f4a0cfd6238e617a5867e918d69bcda50e31198c66b0c351e89797299a1278fc23c79ada1278fc6fcaddcd4dfc6e80ac7feac705cb5430ac7eaf322f716855dcd159015bad8d0cee0ac4c63333833ddbf68f5c56671eea48b77163beb7c39541a1aed3beb04b3dbf5ee0f9d558712ff540ba02eee57637501b0d9301bd2cc67c3ec8209df5803c277c5d2da26d3b4360ecbd0f633ccd0c66359f0fe8659700ec6e20053161330073cb0861c70a22e805eeeed417e9824389b32172b3d0e767fe8a7088ee4a079c76c6789b3d2bd2e757f19e22c72ff5de3e6238b5ca92c3f29e1b928fb8afd925c027b0be6762cb75dc3f316d6d40852884dc2ecdbacb36f046a5faefbdf12f7a56261dd0c579f6230975dd5389135f3dd2fd86cf820764cc6ec384467c73c7ecb66d6cf73c361b9b997b397f2bfa7f19c9d956ecbdc4fbcd26d5ad59b93dc32cfcbfbe772fd8b5c5dd7f3b787084bd8af85aec475dc222637f68d6aab5766aee0246b82c3148cc3a13a0e45c41c2a9d393cfe8b7923b89407cdac2d10a75625a641e92f53314e87e938ed54c5c95b8931c1fda9c2fd611eaf1f95f0f4b042d48216f1545d213e677a05f1fdd453f234cca22d3a8b1610c6fc14e398c7790521b21b46e4701d915dd1bc6d9efbfd146e4799b39ce7d49e9d15dcce45fc9caf92aa5c4e2f6362dc3ba6de3b1db3ec089d6523135a96ef5e3756954ad2a64af1943abf9a815972a4ce92c9a82553b897e9ca59cf1babd7dc55edf3ddbfcb8467e271182f2388a533314b8fd2593a0bc97166716b36704f5a25e201da39dbfd6d354f8bb81d3a56ec6d5d78deb339ae5a05ae14263787b70183583e0bb3fc68cc5b8368e2595f2cfcb6d07d52c16b54ecad59c2d2445e1cc492d99825c7e82cd9bac36a19ac362639153a93451ecc42f05fe27afa0d772d5c94c00ae657eb1c76da612c74ef3cc49acb23e660d48fd551df39616ec7eadb05dc5be2f33ba6b92c9baa97d8f1a5724dd8b43b66d3569d4dd94e7cefcc44cedef30799cfe5bbcff204755d099ba8d601bf0b62c55ccc8ae374560c4e183379a2b614f37199a6d75789a829bdf330bd8fc74a1d2cd4f8b61cb365adfb5181a8136e4aa871a25f6aaa56988f597a82ced2310163a822500cd544ba9987d973a2ce9eb14a59325cbb125be66eecac56168765eec7956eaeb982e7a28571e5abf756e2d2d27b278855f331ab4ed25975bc25e54a1e97b086bf1fa46489f7891d5bb6ec81913f59477e48c2ba8917eff179d724ee6d3227a8499fd913d3fc149de6536b3025e4054c0935114f7b61d69e8ab5e5f0fc13e6d9f378b95fceeb8a456eac1538ac25bf4653ca27ae03a49e432fc02c3b4d67596fdf1e38457860cdd47cf7c6b43c5da765df6a25662cd4f8f43183fb5eb1fbf7f26abac66aa041345d88697a864ed35c45d35898d04ba678532d44be9aefeaaaf3015863c69ed794d7ec835979a61f2bb1dee849496a2ff17548fa3ead7d312bcfc25a8e89eb69d37859b8da2d195754d57282d45852b7641166c9d93a4ba6fbac71cee0a57b459547ce76bd3316873bbaeeb918b3f91c9dcdd37cda3c938fa2b25c5a8e9be079766a16a7daaa28c0ec3d5767ef309f6d3a2ff718ea8c0cd4a28b7d15c482259805e7e92c181ac8025dfe87db965adebf14d3ff7c9dfee37ce5fd396e4da550f4f0eb7c2c78ae9f9a6d85986d1798c74de218a819df2ac2f4bf30d84823ded32beb1405fc99d7ae6175d51237bfafb95c6d1966c745580b34a81d5efd3a075841df1f558c5975b179dea5f3a1e47957d0f4b11cb3e0129d05137da57d3f3d3ab559eb5b81d978a949af61aefbdf3a745c0e2f27e17741ac588959711936f61a3f4ee3cd48cb736328d69a9bcc471b4b93f44924b254951bc4a25598459763795b728bbcfe5c7cb4cdef6f41ec28c1ecb8c24f1aaadecaf3578226ea29aa791b4b311baf34e9fbcde37e55c9475a965a521f5d8d597a95ced2293e2df5d716aeedb6c61accd6abfd79aeded65c5efeb211451be2b30cb3f19a60a3fe3379ec2d776b459ead13799f2eeb0bcc622dd55ab0642d66c9b5fed2a03e9ff137fe924a5e93ba5f9663965ea7b334cb67893dc17da752131f897b61bc6f82685f81697fbdbf5e572fc4203d4c31cbf44f6b2a5e2a31cb6ef0d31f13a49730719f4c6dd61ed76136dfe82736aba7bac98eb7a0ad40e36d783a4b3c0e9d5a99be1eb3ec267fbd6b149651dbbc01b3f966cce69a1aff91a3be9eb717bad6ad767fd5a5e59a6ea56ec46cbe059b8d9d3cd526cb916a33856ec2ecbb5567df24b484f746eb8bb80ecce7e4cc96f8f85be1c891e282b8b7e8e3713fcccedbb0b1cbe4f118ac2fbc3663757fccdadbfdf4adcc033ae5f0f9f46cfc3dd1181f6e039415c48203300beef09fee587f61f074e7f54cfaeb334e3d860ec4ecbb13eb57093e4351ce8a8efd3a91f746e8e6a2a6164b076156dca5b3629f1ab2c2eb65092229e6c5a97f1984cbc11897bb755cfa28deaba639ba91ebcd989ef7a45ebaa9b9e28ecc070fc1ecbb176bf5a5e61bfef346aa19cf876296dea7b33433a59498788d49eab17418a6fbfdd86cdbd4676bb39e15162315bcf6b19acf478b9fc15e33366dc16c7aa0e6f27768d34cfe45650d5b713866c5363f733eb05e9364e5706df7981c8159f920d64a0db64e22967fafe173074ae2629432573812b3ec219d65a3d0da7df52d65e22d63a308e54e6c958b5f29416c390ab3e5616c0cc7ef9a9a785b2aab694965d1d198458f60730782c5ce64fe7bf59c5a4d4514b61d83d9f668b031eb64b155ac19d3c66dd28d8007b1ea58ccaac782b59631ab6c5939b615b3f371aca7a766ecac3e7e9a8aa5a9d5d98fc36c7ec24f9b197a94699b3955ef3c1eb3e0493f631cf87e01c9c7386a7b96e60998a54f99cf1d19e96427b14f178fecab20169c8859f0b4ff96170b3378ff86671ff63c780cd577ff8d44d8ee2193b81c36b37d0eefa1f35274e600f7273ece244f29942b2fe4ee36a5e24e3e671a94bac459c8f9557d84b1b3093109cfb8e8ea451def9f7e1186bd52641f91650ac121627db4ecaff4465bd96afa293c1729e225245b773d83d7af2b1df57c48cc0add6a18f654675d729be44e436c4dca525e0eb3d85de2fa4e7d619194e5921ec848ffaf59fa2c8bd5412256a399ecafc8c014bd29b916cfa579c735ea7ca87d35b2b026a5d3dd1320d70447d85efb8b9ca93c3115f20899e3febd8e57f7938605f3205d5883b900595e2615073b6675e23a7207f326d2f04daddc7fcf6ce538f5eb46b3581c3c4f09aa350735cf9556284637e7f3f85be778b39662ab02c380ada4570cdb764a6ccd3936e6c6b0d9b89bc88cd902ba30e03a77df18ae172871b5e3b8f2dc57ca450e29b195889c90ad492caf6ad98601de017d63f05ea484d786c38b1d229c2f06f564d7074cbc6100f7719318b89728c1b550c079ab83d6840e588ba631602f53026b5cad3090c8c280a9323b86e9154a4c5d34950bb91f92a70a2c37278ad199e2d0140b4dbac640be4a09b2250799cfd179130d61e563269fa0128e24bab9670cd96b94c83a24f5bd094e91e8b1c9e505457128006eed1203f83a25c0a6da9a1b1b4a5d16928ac7eba0d6f6067d71007dcd1b5759150a4c677688617a93be0995e3e65685bcc93f9303f336222a0f5d6523bb710cdb5bb5dbf254db0461aa7c2c1f11c3f6766d566a65920c9b9fdd095a01efd0fb597c8919ef676c3c79634832ff26fd62d8dea5c4568f63f3266f9487040efb47c2798fbe12017d6a2e576193c3e6b98401d5c7ad63a8deafdde497e7ace19d3d4bf9df958e37d5bc3414d80e488f61fb80125ba36aa5630eef370b03a4fc0931481fd2f7c226cadac3806b71ef18ae8f6a3fd72a73bc754d614035be730cd5c7b5d9e7aafa55d86a5b634117e227f4e0a08fa92b8e263adece3ee1684566378f81fbb4761bdb4c009b6e10064c335ac6307d4689a9ad0fff8af5b786015d8b1631749fd30fc2613531ef10a3a29025cf0edd63f0bea084d70aad6a846fe4b2ac4d0cda973ba67e36434ca20f03ae2ded62b8bea22f3b273ade2cb072fe39ab62b0692bb3c52cba7251250903b8190362e0bea61f146195d96522f0e5ca74fea5ce52a1d434c7db42280c004f5d1c03f84ded160deaa8d224fe4b9846949e01234adfeed82a6f6c6bed3080ebd22c06eebbda2d1e547061c0b51c34adbeafdd2a08acbfc5daaa6180766f7a0cda0ff4530c627064995a14ba26fc563060f2237db28478d4196761c0d562480cd74ff465e72227cb89edef19f69adbc7fd63f07edeb1837373b852eb43816d63460cdb2ff44934b6425c8e10c4aab961c0b5e7e218ae5f2971b54f9aa3c98a6d718872b8ada079f55bedcf032a08c96cc68f3bc630fd4e5fd560b37f563970ab8399429182d07449f6de2786ec0f7a6458953687b701c251a11d9bce90d5afab0857977ea6be442c18677c311b2b3a26391b9d32fe94c92be4b2c1e23676969b759aff0917a765549b9e9211601a5e86cf564186afc956198116685497a95b95505d66a201c80c1f2de98c40dd147ede8e0d1464041c95c94830d8951149b4742f23c9cc9b0cdffdf43a666ae7b44e4fe901d86fac54c4b49423ed1929cde2ce08dc4b9761b45241175ee201a30c9ff97946804941ba18d5777b64f85c4e2043f7b3e6319197c894981178759bce7e6c4ea29f7765132923705b3423d09843460a15e90c1fdd091909161ee9620b9b279c81ce9acaf05939cbf0b1b03323c912820c1fadb38c94862c62ebff61811d5bb79fc5d6fffff5fff9d2fc2cb662fd6f062157d45abd7aec3f94f5d86e22dd793b31b01d73fdefa1b2c819a9ead3a59a3e73c56692de6112b226abd3ac615c5d776dc487b1a9d477cf8bc49a08ffd28fedc5a38502d50d6c47bb6690e11ce7c7c054701e1d8de1fccf269c634289f33680d3a96311cea1a1c4790348ec119b700e0b25cea700cea84d38878712e7a700679a4d38b34389b30ec83bebd88473442871760038ebda84736428718e0538ebd9847354287196039cf52971b296b917a8d753874cc3ab3964eda890b1fe5b89ac0125b22e1a0fc48f0499e6948a4e8c45949e4886f508e0890d6b236117a3491baacf5a4084edf38654380f0095a24636e11c1d4a9c2b00cec636e11c114a9ced01ce2636e1cc0e25ce9f4191d4d4269ca34289731ef0ce6636e11c194a9c990067739b700e0d25cee341626f6113cee1a1c4f920c0d9d2269cc34289f33c80b31525cef64ee2f679fc46f2c3dca2880ce60f5430bb8036516b9b60127a2619cc8e00661b9b608e0821cc7600665b9b60668710666b00b39d4d3009fb91c860d60530dbdb0473580861fe03aaee1d6c8239348430ff04303bda04332b84307f00303bd904734c0861f6047966679b608e0e21ccee0066174a98ed92c08cefea20ac652ea442f92440d99512255b7350e6a8b38ac33a42c9a4486cdd28b1b5151ee881aa70d423e93cd5bde3ce080b99ba54208f06854c774a909d3449193fa9d65b5b433a6f38870ae90b00697a6d74b761be09c5b1fc319bb287a83e15ce2500670f9b708e0825cefd00ce9e36e124edbf24c3390ae0ec6513cee1a1c43915e0ec6d13ceac50e26c0e70f6b109e7d050e2ec0d70f6dd91ed1e1567f8508e04ed9e7e9428db24f1cc09eedfec2f528c8d234418df72621833762446692929c6ad54de381324ecfeb5d13be42f9f249daa4596b46f023e39c02698612c726e063007da04937014920ce66500e6209b6012f65c92c1bc11c01c6c134cc251483298970098436c8249383e4e06f3520033d32698841dc46430cf0530b36c8219c656cf4500e6509b60128e4292c1bc05c01c66134cc2f1713298b70298c3776cd786278a2d3b251d52bb9c0ae595a03199bd2351c64f3508e314985301ca119428d9e8f83a8ed0dbfb8eed8215ded1f16620318fa4c426d7efe213fea1c01c876db4c6262090f6122da1c23a17601d458995c55f9983ef6248866e0015baee00dd684a74e9c2234bdc974a7899cdf62e98c81372a5e36d5e98789703c27c926c8f8345a0377d4c6d1439feaa42616cef8c069eba1325ca8e494aefeafb6a91d62cc97cb3635a0ce8ceb601256cf7d06db703808eb50d2861b94e06b42500ba8b6d40c3581cb5004077b50d6818f7306a0d808eb30d28617f3b19d05600e878db80128e0691016d0b80e6d8069470ac920c681b0074826d400947d2c980b6074027da0694709e0719d07600682e2550ff5b8f7bdbeeb386e9322eae94b6115a4935adab1f403b89badfb3549c1a014f95984dd9efd992ca23d91a13896df28eed0609fb20c6fe00e5941d398891ebb093509608948495f7a22811ca19a0736e6a6df67db223182a782ee99d7ae189fb5f9b493c1de09d4689b7299a572e73ff0d5f6ed91924f1dd28c1053fdf228cd5a18b801f4eb70927e9eeae6438ef063867d88493744b3d329c778291f49936e124dd698b0ce7cb00e72c9b7092ee504886f3378073b64d38c3d9326f08f2ce3936e124ddca990c67378073779b70926e964b867321c039d7269ca45b3993e1dc0470e651e24cfdb006c20e10b239744d01d67c4aacc1368c225d384d368ff37350becfb30966187779fd18c09c6f13cc30eef2fa3e80b9874d30c3b8cbeb5b00e69e36c10ce32eafaf02987bd904338cbbbcbe02602eb009661877797d1ec0dcdb2698615ce2f20c80b9d0269861dce5f51b00731f9b60867197d72f01cc7d7724ccf8d174d2644e369ebe2b684e2eb2092661014406733c80b9d826988455233298390066814d30092bed64307301cc2536c1246c4e92c19c0c602eb5092661470719cc290066a14d3009bbe0c860ce05308b6c8249d8394c06731e80b9cc269884957632987b0098c536c1246c4e92c1dc13c05c4e0933d8391784b54cb2732e2e00285750a26ce4deb05d3c0adcc07378fb7b85b3defd217c03bb594e0cd9ca1de97d50dca250ee6ef43af0be55942859d0ebf88ff9eeed46f763325843a860f5047e5742094bcecf90f3d54bdd570b7971513def63f544d289042f52e1fc1e74a395d6064e2c19e70b26796e7872b22019ce62aad5143341525e4d8933f9de46507db8b711a1978e8810618d022f5d4389952d67a87005ac765f827b1a4d74e0163d6400c956533402b966192540b91ab2d259eeb063bc16551d9954c811caeb04f7e5e5ee47eb1db6fa87154ac475c7c654681f0068d7eed88a106cd384b179380ce49ee5b5d13cf47b143c61ad92ec20f88dc02f2b6c8249e89964303700989536c124ecec2583590960aeb30926e1300419cc0a0073bd4d30093b7bc960ae073037d804937018820ce63a0073a34d3009271590c19c00606eb209266173920ce62e00e67e36c124ecf22083b906c0dcdf2698848d493298ab00cc036a03e652073b782efcfb0e97019807da04338cdb90ae05300fa284e9ff4844cade22aa9eccb701c68377244669292946b22311f34187f0e61d99b4d5d1c7301e89f837f0c9436c8219c62311ff01300fb50966188f44fc03c03ccc2698613c12f14f00738b4d30c37824e26f00e6e136c10ce39188bf039847d804338c4784fc04601e6913cc306edff82b8079944d30c37824e2bf00e6d136c10ce3a44107b4808ea184d9dda93eedc0ff9c8e619470c9e674dc0f26221c6b335cc26c800cee7d00ee569be11216586470d301dce36c864b58b52283db15c03dde66b8848d0032b8cb01dc136c861bc6498a8b01dc136d864bd8b14206f76200f7249be112760192c15d0be09e6c335cc2ce6a32b85700b8a7d80c977058850cee2500eea994701bb8376c6353b6a02bbcc782b77562b84ea3c4a53bb0c9bf2f8631993f08fa0a4ea7449bfa89eb84099cecc4f522e0b167502770b9fc30df09ebcacdde00d79994b8d8b161ece712feca1c872dda5ae6bec826e0842ff1d605d8cea2c4d649932fea77d09e58059734e18ea242fa302899cfa6441aec40fa300e2a8f03de790e25caa61c6599fb232b30d89acc092e0b76b615fb9b0cdc242a70c301b8736bbbba8327eb52a78cfb6a117f9b7446f25aaa39766783eace799468e59a76ffcb08c338c17b1dc079be4d38478712e75280f3029b708e0825cec600e78536e1cc0e25ce6f41b174914d38478512e72ce09d17db8473642871f603382fb10927e97eb064388f0189fd529b700e0f25ce6b01cecb6cc2493a204c86f32c80f3727b5b48845370c85a48cd4107c815b5d1219c1cad7a2a1b616708d910c6bd00eb95b5dd55e70d61e439b9ce746782fb22eb9f96c31ae5fc0dc2f94c3954486f0725fe559448db3a89bbea3cd5bd8dfe0841926df4770dc84dafb6056418774cbc1c80bcc61690847392c8405e07405e5b1bd5257fbdf00c681857241d0e72caeb6cc2991d4a9c7b029cd7db847344287196009c37d88493743e2719ce0100e78d36e11c1e4a9ce301ce9b6cc299154a9cf500ce9b6dc249bac32c19ceee00e72d9438836db51fc6ad2ece042df45b6bc3333194d5b73b276c0b916d773e04e0bccda6849e1dca359dcb4042bfdd269c234289f36080f30e9b70922e8a25c33906e0bcd3269cc34389737780f32e9b70668512675b80f36e9b70921e2e4686b32fc0790f25cee6ee8d37ab73a9c3565bb099c5de991bf94e5867baf77262f0eea58427472ee519456b5d1245fcbfc2aa511fdc37c3b8bbcd5ea0c6791f25da74056d994b628513ec381332bc648b0d9a01bcf753e20db6450be939ac74253cc8061eb0096618f7559c07606eb3096618f7559c09603e6813cc302e819905603e6413cc30f6754e07301fb6096618f7559c01603e6213cc30d63ca702988fda04338cfb2aee06603e6613cc30eeabb81780f9b84d30c3d8f1b10f80f90475c7c722de0a5f542575116f681638e5fc25327864dbf2cf00bd464f52c20b761626617b87ec2ccca1a025fe546d7474f89b4b3cc7892dc0ce71355841db8fb4886a06fc29c0539fa6c4cbf6ee602f2f735f09efe63c6d40aef80c25aea6c21b59c0cbb82f4ad9ec2866327075a9c03900dcb33b32479ced7eb2d2fd6b292fb50973c41fa8506e0349f6394a94669b9591567bc83a7edb83e2e6799be18671c7e33600ee769be18671c8e20d902dbc6033dc30ee78fc1280fba2cd70c3b8e3f1bb00ee4b36c30de38ec76f03b82fdb0c378c3b1e7f02e0be6233dc30ee78fc2180fbaacd70c3b8156a3d50157bcd66b861dcf1f877e0b9afd706dcd8e49c58af141355c005eb96cb921f0dbd900aeef5c073dfb0192e6123820cee6800f74d9be1123622c8e0f60270dfa2846bb6b377186bb917801cf76dea7ed942f7870af7c1123eac5208b6012603378a0adc002706ee1d7b7d328c5d894f029f7c97126d6a1b5613b6b7c8bcf51e9083be571ba308d808ffbcda2a8cc876151b0512fefbb59df0fdef2a4688966c57b11341c2ff80126db2c5b513dc4fd7f042ca5b5a3b9ab24e3a8eca530f0589fe439b70921ee54b86f34680f3239b70920ebb90e1bc1a24f68f6dc2497a6e2719ce4700ce4f6cc2393c94383f00383fb509677628713a20effccc269c234289b315c0f9b94d38478612677f80f30b9b708e0a25ce5280f34b4a9cad1c3803dab39f757c543ab5340f9a6cf2ee614e0ce157b5e191fe4fa0211c11256bb36f00a5f9d736e11c1d4a9c4500e73736e11c114a9c2d01ce6f6dc2991d4a9cdf83bcf33b9b708e0a25ce39c03bbfb709e7c850e21c0470fe60134ed2b94e64388f0589fd479b700e0f25ceeb01ce9f6cc2392c9438cf06387fa6c42917d6fa5bbc931dcae53b65a059f98b4d300967da91c15c0960fe6a134cc2d17532984500e66f36c124cc33c9602e01307fb70926e10a1132980b00cc3f6c824938578e0ce67c00f34f9b6012761293c1cc0730ffb20926e1c41932987300ccbf6d824938fd900ce67e00e63f36c1245cb94c06b302c0fc971266b2ed0be2bb3a08db3f64b3e09f0328ffa34499dae1908475cd1c2aa4cf82ce38b68587357b7e938ea3936d7d7518c019b109276915890ce77c80336a134ed24933643857029c6936e1249d704886b33fc059c7269ca4130ec9708e0338ebda84332b9438eb009cf56cc219ceed563b009cf52971063b412e8c7b2acf02d5f8069428e1fea010682dcc8b235b1ab833f0c38694f064dbdc5fb21e19cae3255e7062301bd904338cc74bbc0c6036b60966188f977816c06c6213cc301e2ff11c80d9d42698613c5ee24900b3994d30c358157a1ac06c6e13cc301e2ff12880d9c22698616cef3c0660b6b40966188f977805c06c6513cc301e2ff12a80d97ac7b6c43d51de0909846539d922abaf4063b2cd8e44193fd01bc6a931a703946da93b35d6f11f9992657cb1df449edc9918b676920c5e4b2a780d40926e4709af8b936cd2351498e3fe55cef79623ed685b42857501c0da9e126b5b879d40ccbcafb82af03cfeaa770e71d8fdb32100d9c19e7c328c738b9e06f964474a9466bbc685711bfff301da4e94685976cd3e5ee3ca0bef813c8d41a2ee5c1b89da5fa53c8c7d423b03945d2851764c923f56df186a18652e49b68144ddb418d0aeb601256c819301ad038076b30d6818b738f9050ce276b70d2861ef2519d09f00d074db8012b67ec880fe0980f6b00d2861294f06f47700b4a76d4009c725c980fe0b80f6b20d28e1a83919d0bf01d0deb601259cd34106340d549bfad8069470c61119d02800da977e24689d2bad909f88e17d382741275df8608e746230fbedd8167cd847822e06283376640f672eef825b225012b68cd896052428b34121d49f12656a873710b68d46517967138074406dcc65f75b0c8d0e65efd23500e7409b708e0925ce6700ce4136e1243d479b0ce703601863b04d38c3d995fc0ec039c4269cc34389f35f8033d3269ca45b4d90e16c01f2ce2c9b708e0825cebe00e7509b70924e3524c3b90ce01c6613ce51a1c47930c039bc36a679c92342bdf9727ef6f0206c1de55061bd061449d9b53da5c6ff796c843df464e7b19d0bd08eb0290320dd369f2c0338066400236dc2497aa80319ce3b00ce5136e124dd499b0ce74d20b18fb609673807e39e0338c7d88493746372329c9f019c3bd9849374935d329cf541deb9b34d38494f7021c3d909e01c6b134ed2e5ff643827009cbbd88493f40417329ceb00ce5da967c6b381b60237f0f0ce8c674bcc24ae7194b8ba6abc4fdfa06466c0c90aa443c303a8c0e6013f1c6f2b58c22e1032b0510036a7367a96fc819de67e54e03e219e154296111c08b04ea88d75ebfed6bd0da79c4b47b6f26d1c8039d12698613cbd65170033d72698613cbd65670073924d30c3787acb180073b24d30c3787a4b168039c5269861dca262208039d52698613cbd2503c09c6613cc309eded21bc0dccd269861dc6161128039dd2698613cbd652280398312662f0d4cbf63eb709f1ac2e45f9946047927b028662625e4de4efcbc9052deabe9b5d0cb9d20fb83106226db1fe451e0cbb376e41a8f98eac443c56427113d0e50cea644d9c4bd2970ad2fe4be3733ce5fc3e7814ca4c43687125b6707eefc2eaf93b98042edeca4455cc9ca10ce51da0d0c0cef6e4fb226ac3a9125eb7741b29ebb231714c6579dc258a57f0824f5bcda5e05977c9e27610732d93ccfd74042cfa7449aae54930ac4f57fbb7af42b48fcf36c3a30279c27181c09bc75be4d3849e72b91e15c0870ee61134ed2f94a6438cb00ce3d6dc2493ad7930c6736c0b9974d3849c790c8704e003817d884332b94381b019c7bdb8493b4f3830c670f8073a13d47e185f1c8925b00ca7d2851f671e2abf465eeff598731ecf7d4b597e680f772dcaf56d0cebc5b44d549f233a8dcef1b16d0841e4d06fa7d007a1125e83649328709eedfec2fdabdbca930ae02181753626ce4787b79b33dc2d6b97fe5bb0f373a84fda043c88a252786aca0363c0f2be5639e47d90d42e5796f028c4b7624c6aaac8a12e3562a6f5c06302eb5e79422c2bc906c6fba2f4025a9d09ed337c2386be93480b2c8ce837608133bd9413bd340625f561b3b30c8da65253a4b249f035dcd732226ae94d6632ba98aa351606e483125daa6ee0d0b94496395a1d91c63781771b5023eb99c1a9c6ce5b01798a039dcf78a9c301ef69401c0adb0e75c98301e099e0350aeb46bfbe870eeefd51fe486ab6c031ac673617a02a025b6010de3b9309d01d052db8086f15c984e00e86adb8086f15c98ae00e81adb8086f15c982e0068996d40c3782e4c770074ad6d40c3b8ff473700b4dc36a0613c17a607005a611bd0309e0b930e8056da73944918bb8b8f706228d7d973940961c94e7694c934300ab99e1265338172a8b388bf5accefcadc9fcbf92be1ebfa780278e186da987384f7b443f5d956a78489ba2115ce723070b1d1269ca343897311c0b9c9269ca49d1e6438eb039cfbd984333b94385f0279e7fe36e11c154a9c9380771e6013ce91a1c4d915e03cd0269c434389f31090d80fb20927e9be346438af02380fb60927e931f76438cf003837d7460b28eb7fa60574284077884d7b188f0e6597db65a02d7ea84d38c78412e73680f3309b700e0d25cebb41a5688b4d38c379eefaeb00e7e136e124dd7a970ce71f00e71136e1cc0e25ce4620ef3cd2269c211d4c03388fb209e7c850e22c00388fb609e7a850e2dc1fe03c8612677327360654c6a7602f0f7d1b683a28788edd91c3baf1fd4484f3e0c8f6e66a0d506eb5f38807c2e44db64c2002261e1c4789b59fc643e337949ae8b06df94af9df0cf33a2e7292b3def136e9cbe7d4e47c78421f3e830af66a2706fb787bb6ea23ec9823cb0ece03c5d209b6a024ede32443b90bc8024edc117b23c85543ffeb3bccad013e7b526d74260ffb9fe94cfe1ae49c27dbb3e70ce1921732948f002f3c6547b68ff205933cee99ab69e7c81553cd91db0de03cb536d6feb27611cb2f83e496a4653c597e790748f4a7d5c64906f8a45898e8494fcc224bf6270098a7db04338c0b5b4f0430cfb0096618f7933b1ac03cd32698846b87c8606e0530cfb2092661d94eb787318079b64d3009d75d92c13c0ac03cc7269861dc38f26000f35c9b6012d633c9606e0630cfb30966189b97a70098e7db049370bf0f3298a7039817d8b38b1c214ab26581c3413bfd427bfc7274281b935f02bfbcc82698616c4c7e03605e6c13cc3036263f07302fb10966181b935f009897da04338c8dc94f01cccb6c8219c6c6e46700e6e536c10c6363f26300f30a9b6086b131f9098079a54d30c3d898fc0ec0bcca2698616c4cfe00605e4d09b3bb831dc9e867ac92b4db836cac72049844738dcd70c33810fc2368bb5f6b33dc30ce4afa0cc0bdce66b884f55432b8bd41b670bdcd70095b5464701d00f7069be112b6fdc9e00e04706fb4192e612f1519dcbe00ee4d36c325ec4f25833b1cc0bdd966b8843dff64700703b8b750c26dab810b057aaab3b3b1492783d7a502390180bc95fa9c2de683f084c1dddc27de1aa6c2b8e76418c9ce1b1c089685dd4689b1b3c61ff16561f98e778c1ea96f921da5b72f6812dc6e2354c2462c19d45300d43b6c844ad80420837a16807a676dccbe4fadac0f631df52e90b3de65e7597184ed2ab2b3e20a9c18d6bb29b1f6d0782c53a292fbe46ab70ec016d89629a8e3376d232cbcc8b66c8b02c0f750026ee1de14b8d617f2843eccc9756d5be37eeacd929aed2c73ff25c34776fc595780ef5e7b8e3f0be35c945d01cafba88fe05b2120b295744bb9ff6de0653c61a59e0c5c2600773f25b8060e3bbb9005bb3ec4473db603b81eb069cfcf3194e3a46405c8a1a0e2b3cd269ca4c3ce6438d7009c0fda8493f40848329c9d01ce876cc2991d4a9c6900e7c336e11c154a9c7b039c8fd884736428710e03381fb509e7d050e23c1554941eb30927e9ea24329cdb01cec76dc2392c94382f04389fa0c4d9c4a97e62bbec060e5f17705f80ed49ea5d95d456f64cf72f4f6018dbd94300baa7ec397590b0af876c79e1f300e5d3b53d10a11fdd99e8b0fd14cb38726f0745d2319eb55443bc67814ad0333615336328719215339500e7b336e1245dd64586b300e07cce269ca4878993e16c08703e6f13ceec50e2fc0a144bdb6dc2392a9438a701ef7cc1269c234389b31bc0f9a24d38878612e71690d85fb20927e9f202329c57039c2fdb84735828719e0970be521b6b393198b3dd4f56ba7f2de52d22d2434e7ea082f90098f7f6aa4d3009e7b493c1bc0bc07ccd269884f3dbc860de0e60be6e134cc25e253298b702986fd80493702d2619cc1b00cc376d8249589a93c1bc16c07ccb2698844b03c8605e0560be6d134cc2f9bf64302f0530dfb10926e1982419cc1700cc776d8249b8470819cc0701ccf776e46e9ee19fe4ff3440f93ef5d46a2669359fe6cf3eca73592c714af9801b19b81c2a70439d18b80fec3c468fb0a24e3605fb66e08f1fd606d62cfe7f799dcc05143a53c46bf1b9a55cf74386956c31ca64d041fc1125d6be4efcd1644b9cea8bf8feb70f271b07d6a37f4c89ba932663f0d0e639b9ce7417289b52535485bb9cbf41d84622cb6b1f03defb496d7420fb5b4a3594b6fd4e365be90880f3539b70668712e70280f3339b708e0825ced500e7e736e11c164a9cc301ce2f6cc219cec3777200ce2f6dc299154a9c0d00ceaf6cc239349438d301ceafed39dd358c5bf6ef031aa2df50a24c77d4c39cd7b9affdafb7922e029efaad3d07f28471c6fc7700e57794289b0b944315a0b5701e36d99cf8b100def73bd20fe37b9ac238c67e0540f9436de698853c1f2ce02c581ee9894b542085f1708901a040fa71c76f18c93a3f484bf617a940be0c40fe640b48c2044f06f24500f2675b40124e5b2003b91580fcc5169084792419c81f4111f4ab2d20091b926420cf061ef99b2d2009872ec8409e0a40fe4eddc1c15e9eefbe52c27724f416aeaee662d833d6c229778d2873d52be0c190e11c478533db89e1fcc3de6d4ac378c2c6f520effc93126dc724497e82fbe91aeead6c7300af6f9370ca1799af7e0892fe5fb601259cf64506f40300f46fdb8012d63bc9806e0740ffb10d2861fd930ce8f300e8bfb601252c94c880be0a80fe671b50c2fa2819d0570050a79e6540097b93c880be0180466c034ad8ab4406f43500346a1b50c225ae6440df0340d36c034ab8cc950ce85b00681d4aa0ba199ef81655255c106937c9282aa45b00d2ba9448836d961fc6d38927393194f528517675e287e19802653c71573a33ddcf0a9da26a19c026fe17ed9405aaa1e262e0a3f529c19aed4c475844918dc25f08fa9e1a50a2edeea8936d6267b64de4dd77abab6509317348fd76215586f036f0db869470e51c3bbfe53fe93e7564a5ff510067239b7092eea24886f31680b3b14d3849b7ae22c3791dc8499bd8849374af25329c4f009c4d6dc249ba131819ce8f00ce6636e124dd94920c671ac83b9bdb849374cb54329c6d01ce1636e124ddd9860ce74e00674b9b70926e994a867335c0d98a126723f766ad6b7d11ffafd0b52cac271af47162c85ad78607fadff09cb0954eb657c841a0f46e6313ced1a1c4b90ae06c6b13ce11a1c4d911e06c6713ceec50e2fc05e49ded6dc2392a9438f700ded9c1269ca4dbf692e1cc02383bda84736828719e04127b279b700e0f25ce8701cece36e11c164a9ce7039c5d287106db3b91b49a44b64af334d08cec6a13cc306e787e1280d9cd269861dcf0fc0400b3bb4d30c3b818fb380033dd269861dcf0fc5800b3874d30c3b8e1f96100664f9b608671c3f34300cc5e36c10ce386e7070098bd6d8219c60dcfcf0730fbd804338c1b9e9f0360f6ad8de9b118ccf8ae0ec22a3bd96cb86701ca7e9428e56e492ce0651ca494bd5abc42068f6c6e71c489c1cbb027518f0e657b271b6c14dddf2698616cef0c033007d804338ced9d4100e6409b6086b1bd3300c01c6413cc30b677fa0098836d8219c6f64e2f0073486daf634b7e520161999e4385743b1897ccac8d911ff68abf930a082beb64f5cd6300ce2c9b70668712e7628073a84d3849477fc870ae073887d984735828718e043887db8473782871e6029cd936e1245df44f86b319c039c2269ca4dd7064387b019c232971f676f42b7ed9cb4c680eafc2af70d63bd557abc72f1b08e386544782dece519498fdede3293b8ec3d76dfc13f0d7d1b6800ce36af45b01c831b68024eca42303f90b00b9932d20093be8c840fe0c40ee6c0b48c2ce0f329095a0b0196b0b48c2c10c32907f018fdcc5169084935dc9409e083c72575b408671d4fc7800729c2d2009a7c590813c03801c6f0b48c2293164204f07207376e49498f8f638610588ac2d3e0aa09c4089b2b57bb3de899d4f90c75f63fbc4952b67159041243b619d3d911027d6c6c8a4bffea170f6acdf0760e6da0493b0124406f37e0073924d3009abe66430ef013027db04338c67acde0b604eb10966184bf13b01cca936c10ce341ca770398d36c8219c6932b6f033077b30926e1400419ccdb01cce936c1246c4492c1dc0660ceb0096618371e7f04c09cb9635be49e28ef486fc2e287ec48ef6f4107f02c4a94addc1be691739cd83ed8331cb660a532ee1919c2451122844300c2d9b531b9358bff7fa6fb7895fb78b6b3c159cdd1cd140a15b8e28a1cb92288703b3db2047e3848e0737664028f9f7c1dc615166700efdcbd360e69a874963b6cc20b769240be53cea7b954b8499f092ba59d5e504995ec770160e752826deade6ce0509900399b689a28e1c9c0b5a3f2c88e2071e75182ebe224dbb3080acc71ff2ae7c51069dffa122aacf301d6fcdac02ae7b955ba3f94f322877965ae76f467a4934d9bcceb5261dd192c5d994789355dc1ba94e792f18315c9ce1108dfb4c1cbc188d07c7b8e630a637b7d0cc800f6b0ebf4b5e1a13c56b93948fa7bda06348cc72a370340f7b20d681873cffa00e802db808671167b3d00746fdb8086f158e58600e842db8086f170860600e83eb6010de3b1ca8d01d07d6d031ac663951b01a08b6c031ac663959b02a08b6d031ac663959b00a005769cafaaeb1525ac9192f58a6600b44b766c7b3eec4373cf3831944b77e42048aec38eab5d22501256eb8ba2442807835ea6c2daec1b65738ee7bb3f96f013ae128d2d85715b9ff120b117d9773c3d61fe398a0ae906e0a9cb76e4b6536a7f6818272a8e04fe596c13cc30cead7b1378e6729b6086b1af7e08f0cc15b539aa54e6be5ac1f3cd15bce2e4894b04388cbe9a097c75656d96f7ebf88b7ef69c23f4da1c2aac3783290fabec6837b1f2be947b35bb5bcdab52849d266ba9da4de700b425361d614bbae331590bff64900194da84734c2871de0970aeb609e7d050e2bc0d24f63536e11c164a9c2f029c6536e10ce780c8af00e7daffd7dd9d40c755957100bf432da424695a5ad616286069e89634cd5a6ba5a4b47a0e9c44138e7a2acb9049433569c24c1252965a1414a505a9a22828c85a1004dc1059d42214eb5e54162d050ac8525617c482f5de3b3379ff496632c991ffcbf7414f4bf2b699f77bf7ddf7de7df7fbae24ce4a959c055077c62571522339699c5380332189b35a25e78781b35b12678d4ace5ee0ec617216da5fa226482819b47bea6bf39c6502b4de309ed6f33f56baddf8905d291d4a437c5aa7f5b3ef83b278869ca19c3466407c0028fbc218caa9dc37d5458d0ba63939f573dc2fa4af316e19dc4fae66e215b84ad7cf745fb2cbfe4c8c7d2b6171ed09b5e199724e5b8d99bbb6c1697b96bc614788a4b426e0e5407a36fb2d90dbd22afbe1c995969ab86fec3dcefe1bb5531bfc8d4fdc6fd465f6d277b75801a7fa399232bd539f6568179a0be042b3461227b5e182c67912707e5a12a7ce145409e05c2b8993dae84be3ac02ce732571521b7d699cf5c0f919499ce52a398b80f3b39238a92fcc689c8703e77961743c089258a46fd9631e38fdff63ecc2a7d9957a8deb46e31e3ac94d1b852cda2d26a03d9f493bd9e46b005eed7fa2f6382a64f5df5809cf459f0bab85a8c32e1633ad61b5106d6595c18d50063f1f4619cc555ba6f7941a30b08ec5d807b5e4054cc6bded2fee65438b4f4015539c8ba6184ade179864e38df1cdb96ef5a48003d3fcd66636d07d31ecce80c3bf2a13e3d368d7e47be144be300cda2095cfbb3d6b571974bc5e2727df8cc6d4f9474305b05e56586ab5ca6c1ef3a06c5e240d5463368f7200bd581aa8c66c1e8b00f44bd2403566f3a805d04ba4816a4c3eb118403730418b8ccb67dcd57f2b9f308d9ece65e8d477c73903aee55f0ea3bd32774ece13323a1ed4312f3ce3589ca7c30dfc572471d6aae43c11382f95c4491d2583c6391638bf2a89b35225e756a83bbf2689b34625e702289d9749e2a43e03d138a702e7d7257152b320d038d7c0c9fe0d499cd47c9b34ce1b80f372499c152a392f05ce2be406e8139341d302f4ebe1c1f29b328354888dc8b417709be0bdf9b798acb3b2b06217edf9594a6a22a3c3761054b0d46ec53de7c7b82f4168210677c03dc19572420c8894b410832ba0fc5e2585927af1a2512e841af6dbf2a23588a48b59a437c3897e3593748ac97c918c63af0f959793884acbcb793da05ec34f8416f36fdedb5257fd36d3685c184c5bffd7c1a1edf5b5d7579900f35a26a6bbe7767de47afca9adb7c75211805d37ba635f6207068dc3d55f05d7eeeb4733f74173caa4c99750f2504e6dac24bb55c07983a43eef952a470c8ec16566a3244e9d03309f039c374ae2ac50c9590b9c3749e2a48e8c45e36c00ceef48e22c57c9b90f70de2c89939a4781c6391d386f0937fc2a7bcbe7b2d40aa1a5d09fc8a2fda40968bf2b37b28d1992c5a25d0db4b78691b07c78954085cacede71c0bc4d12a6c607cf3301f3764998c41e9f34cc9580f93d49981a03ad3b00f3fb9230350e3fd206983f9084490c3da0619e06983f9484a9717c8c5301f3479230358ee51203cc3b24616a7cd43c1b307f2c0993d86789d7e609987732318f3099af7f5df799a8498e1858ef81dde63a07bdf8181875a431c8b0055e7bfc4403b2c6d0d89b00f9aed17deb89dd17884ff2b4ee0bb381f2ee30420e47d2215c63a7dbf3a075f41e76ea1fd78121e69be62acc12bb6f9dbe67882b8d0d86d89d81d6fe39152e51f78ee6899dd9944c3cb169a3b1de05e5f0a74cca99592887d39536d94ba9137e3ad6c4fd252bcebdf6ef318644fe20d4a53f939b0387d812456bbdbf1b4af3cfc3e86f9ffb32851b5cec4b6cd4cea58e33782a8bf524a86f37b1738475f88eb46e0371c53dee0e00b2fbd82905b0e36c283d3b67b2d80e01b65fc8ad1b898d24b4baf13ea81bef9737ee3ab15eac6191de0e57f207d88900ddca2e19a0eb8b1cda2806b456a63970a26f668f79d5db7fefd8681772d7616aed483b85c700da8392025feb983522ed197c2dd488bf94c459ab92b30338b748e2a4f63da6711e049cbf92c449ed194fe3dc0575e7af2571d6a8e4fc3894cedf48e2ac56c9390f387f2b8993daf798c6b9014ef6df49e2a4061ad0383703e7ef257152bb2bd038af04ce3fc84db8427ce54b4bb87219d4a35b258d4c4dcda1487b83be161a381e92c449cdf049e3bc0538ff2889931aab41e3bc114ef63f49e2a4f6efa4716e02ce3f4be2a466a9a3716e07ce8725715213a6d2387703e7239238a9e97c699c13e152f4a8244e9d8346cc00cec7247152d3f9d238db81f32f921e38eb98dd62680f9caba1eefcab24ce5a959c6dc0b94d1227758c6b1ae764e07c5c12277504761ae7eb26e0dc2e89b34625e747a0743e2189b35a25e71ce07c521227758c6b1ae77a38d99f92c4491dd09ec6792b70ee90c4494d0c40e3bc1c389f0e232e331766669c460d33ff072d5263173c133d23095363d8cb9b80f9ac244ce2694ec37c0330ff260993d8a79886f91a603e27099398ff8386f932603e2f099398998686b913305f908449eca840c37c16305f9484496c2ea6613e04983b256112f37fd0307703e64b9230895dbd68986f03e6cb4ccc7dcdd09969325f62d02069e3bc4c8076a357a440124b240db218205f950249bc82d3201b4c00f99a14488d43382d05c8d7a540129f7668901f05c8bf4b81243ee9d0209b00f21f5220892d4334c89301f29f522089ad4234c8e500f92f2990c456741ae46e807c430a24b1059d06792740fe5bdec08bc4ebf76216e966b8357f93495a6e329342f6e44c75927b348d7a33306208b31c11ef43bb5979b9ea6028d1ff8c66c3c7e0d8217d3d38af85b2bc4b1226b1f18386791d60be25095363dfe20b01f36d49981a53ecae07ccff4ac2243e76d2302f02ccdd923089375334cc8b01d3a5b11283497cfca4615e0298114998c446111ae606c0dc431226f13194867935608e9184496c1ca1615e0398ef6162ba0c79abfc6c97edb51d1241d2d06a58684799006d2c136da4c386522329698921cf8532b8a7244e6ad8348db30938f792c4490d9be60d28069c059238750e29560a9ce3247152534ed0381701e7de9238a963b4d03823c0592889939aae87c6b91f70163139f30fc7849c1a87af6d806e85c54ccac9794a667a4fa98ceb588c6741891c1fc6c3e3f04e706a4815ad4c3e6102cc1249981a07fb7e12302748c2d4585b3e0e981325616a1cec7b3b60ee230953e360df8f02e62449981a07fbde06989325616abc597f1830f79584a971b0ef4700733f49981a07fb7e0a30f79784a971b0ef1d8079c0e83e932737951c22997863441b223902cfe4078e266566dca4c68412b7c173f9414cca6926b3236ccc777a8d7a0b77d227373774639cbe93fe835052a73079dd709eee43ddd61caadee13c27423d3955cec9ad3124fa7e38b90f6652fe7f437c126fda69e303ae03da43c228a5c3bb35d2f830b9104ef843999407a728bb6d095c6912232aa3c43b4e5a196d07d8695261358eefdb02b087498525560534d846803d5c2a2cb1f59306bb0c608f900a4bbcc1a7c12e01d8f74a85d57883b50060a74b8525beefa4c19e02b0474a8525be95a7c17e026067488525b651d1603f06b0a55261896feb69b0cd007b1413f64033d2f8cc792aa3875f85e6be99d24035c6b6bf02a0b3a4816a8c227e1a40674b03d518e3be0340e74803d5184dfc1c80ce9506aa31d6fd19002d9306aa31aaf805002d9706aa31e6fd79009d270d546374f14b005a210d5463ecfb8b003a9f1dae9db00f973d6685fde3e0f4bec99f6402b44a26daa126b36f49b79d11b7abb6da9f9a531e43f58122de77d2fa40ed8417d0554cdc6c490173e7a94ba616a0be7da2a517381f4ef26a39eff435f61cad8753bf268c78cee15e806a5536836c8492592b89b34e25e716e0ac93c4a9b391ee1eb8142d90c459a192f331e07c9f24cef92a39df02ce8592382b55721642ddf97e499c552a39a703e722499cd52a3963c0f901499cd400301ae71ae03c9a1dbe90b01b5865176af28bc4ec64628eba992cb269c691ed3576c0c6970eda78f269d9959016930e8249d8e9cb4cab7f9a767a2df6f7e3cc4abfd629f6ee70b9fd3332e713ed9f6cd3239112fb8d8e357da6cb4f75db8bf96d77d8b9ee9b254cf91cb777eeb01f993aeca5be7daa3775783a4da35dce65a177dfb6345264e7457d867bb737c7fb921ff5cd30e9b92dfd2d048df66fa75961977402a591023bb7c77f3b47de657feeb65327f94f73ebf4f8e38b45a3de8b75fbedb4db654bb26c61e0326ea4882eff5b5bff011b6a9b137314cb81cb15f8e5baed6f5dfded75a59171fed39c881b342198ee0abb5368319ff2eac19c22bf0fab72cc2d48ad17cd989a8efc497fcfc173ba4c664c5069a478c09c065fe282f9b95b2193dfc295b715f6f7cca96e1b7d199f5390f26eb54731732fbb5225a73d55ba33bfb54b55992ce3f101dffa0cdf35c7cd19bc66915fb3c7cf6df6c738d9c0d7d0bf76f6b96e1f93e52728bd156649966d4cc8b34c724b454394dad2c8f83c65b0346765989ed3ed8f992b55cd29f1525f11254b7f30ada4dfb9c5b80e4bee1b25b7142c53e0553afdf460aafb9cd3edf65afddf18ccc976ec32e7ba7320a8cf1a7d2dd0eacf92e22ceb06f35da519f1675c536adf8f37ad7e5f637e7fa3f673a2b66e72d26573ed62916afb4fb283d6dcfeae597353a36574a47e4b4fcfbf4d574b0ebdb5635c5518c97e056c7fc7eaf77c7b94bc24b9f557a48e6cc24fcdb7a7f9f72ff7b5a26888a35256e68ec5bb79ffebdd714f1d765f4cf7f715e409f6c82737ee4efd78ead472ff8dfd1f7d2889eafabe0600 serializedProgramBytesString: - serializedSignature: bd4f426fe3ed390c0f904a4e073e064e51c47a3fff9b89d52f4b0d82afb7f3d36a641e4fdb5e031703d225afe1a63a63f951db996f20f468682490345a648f0a + serializedSignature: 9bf73ea52749eb8af080857a9174d0550a3b3516ab9b32779e3b1497e181db6bba9f7dae01e9e0d216413cadf7dd14b51bbcff391bb080a160025a1eaa598900 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset b/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset index 4c348cb..45eba67 100644 --- a/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset +++ b/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c59531b47109e05842410374288cb029bd8f1810438ce6d9bc3871cc00e201ee2a430068189b9228ed8a954e53d4fa9ca6b7e445efd43fc1ff22f92eede5934da9dd9033442104bc5ceee1c3ddd5f1f73ec889a34838f71132e4b6c9e4db11196636b6c97edc0dd14a4dbf0359facfc67ac00e9065c57a0ec264b79b4c4cf55a31bae5978da6707d0f290ad42ba49e50b2c0ff759689b8727cc5d87bf3cd432eaa0518e4db3a76c8e258cb80789256ab4cff30c94cb88c07592bd85d23c31859da4a92801970528d9a7b26d60daaaf79cfd40626d43d92ab429b02da0f9922846fea86174c3cc24c4d35a9ed6f334c6ef7b846794e63e6ff3c6d6ae89d7ef159e310ddbe8f5d9e8fdc59f812b1645fef8bdd8b6999789fdb5d8fa6b16f2316de5e5fdc233f457f3ab8d8ed5ae9dd71f109e31ed10fab6b0e914f23a843c4cdb78bd4bc233f46bfca3e8376eeb37ced3084fbb78794a78c634c1f307856711338b8fa1523e6a16157c74dbf8e8e6691d4f9382cc56da20d4c1b6976d341b85672cbfc24cdbf95ba6f39041def218ec7785edb13419c1c7ccbf5b5b2dbd1d1a49d7e3053f57a9db03709d3d2020f1aa1cf9ec011b676352af4a1a3181ef29baae408d4d223aecece29da30b646e0bbe792124ec43fe238a28181436a16484cd408aad5eb05170f2e7362a4bd0ed1684953c5b84eb1ed17b016c3b6b7a8984e1c3de661e689ad16d1b722c40f7e0798b385ca0eb11719a27eeb3907740b17607a2ed24a46fa837a7ec05b897f5b9c82193f3280f72aa7c33945a6a9a066990fb34f9c1078d9c854610fafa61ee8675698a34bf3b34f1014333c860e0cc721aa30499519237c6d23496cf3b100c2ea35342b97d9b78df61b75d65912383eaee25098a1a3e6c4f657f8bbf7f172a156d9ca569e8edf310cd0d58a477cde8725070172114aacb20a376f80d19fc34f42e54107eb3de26d50bae807a1a994a1560e074660e2a3c83bf4d627b1f6225b2f59acd42b51df8db20861d3acad4f3e9c735c920eac5aa0ae81a19d0914a03ed1d59dc808e1ccb55041a3f7204a30a04bd785021582b43906670afb52298833c730af4804a3769dc2cd2dca567eccd5aaeb8b5401c6769f97348bcb823de702c7311f13465e26a512f678d7cb24b9f7048aee41829593f332aa3a8931845067d17976db76cc885a23611b0a28270484638c2d7007627f8173e0ee25135f17a992937563a183c0567fb914f0c8307831619c0521b69550402affe553a0fcbd08b9dcd94e1648114d7b009df81b4dd75c40f1a46232a8fe9900da3a8e5557858e108aec1808a4f6f0937dc2a0ae2545199e66883e517ad9af35a799b4822bd755af19af4e618ee65fd4c98be861875c4e3d722d429d0e4e1c0c71adddd1270b7a55f62096a6b889335dc65defb093aa552595783cababa64d685aa9f00fa6b80ce21f4bd413c5acbd42096d528eb17634242e26ab45d6827deae261e93992ded0d2d5630e060d92e51c1d96bf0a0831b6137eca626b7b124d958b743386f165476d1a4d24f8f2a1406d04fb38a786f1988b7a888f7958178ab8c388ad32f55969d72524db94d4579e0b494db65de40287d5fe1206edd4d42db5720cc11058e43682f0b60eede81dbdcfea63329728e94340007e348e52c1d3284c954d6b522ac9a90db276ae55bdf0cfa467d8850bfced40b8dd370a9d244a7cc8b501397658cdb9d6848ed4471196174a22b7e08a7d484bb648471741cf643b8554d38a18a831f95210e76abe0b87a4a389232c2b4b7e387b0cb84a3474518dff438263ad336bf156d75842dc377177c76192cf52768b04283295a2e96a8dab9959496950edb41a4ec5549795d26e5b04dca09f0b3022d164c19cdc9e5329ba129e706dcbf72f05a5cd404e1b34fc5e70d199f13363e8b7d06d145b1953abf5c7ae857c977f3e4f2cdd078b00f13ff57c4cf59ca37a092ef964cbe31176fb2dbdc236e737e6510690591e0924a8211990439e538a68a0c592a755aa437157f75caa5c9940a87b40c87ef98358bb2e644e22253b680cd1ed72c2e5de7498a3cc87544b545cd979e9159a245ee265c5f927476b9c5ddfd7259c6a00a918c1fdb9e22594db92c8b58843c7f165c9ee83aa492605426c194afe8a3b2e7b38a409755328ec964fc53a3dd2e50e91a503c24b990ae6ad306eb07e3c3cff68f9b4ff8b5b4257aef166c7bf08a4a07e3321ddcf36567e6f612da97b9a9747a1bf3f2a1307c0d03a7dc0fa86601da8a6f21d3b434cf30d9fa517e20087bdf06acd1b2178f6397f726dd6da63e1ee45c499ef4a4c8c9b621b352e9fc6fa73a4fc584b944162d409ab62a2e9aa49fa056f9c1475693a6cd821b27b4266f2eee606fb5721b0afe76dc24304763311040fda07b6584b027db09f6ecd7eb55d22d22601dab28c34939343633b414f8341a3fe8fa36e20fcb667d273b32e1f493168a4c6fe8956c81e8add9fd86b63daa8df34f45bbbfe6db768ae1581e4633188e3ffb9f47ca0ca2f93982d06305960c06962f747a7f17d7a03930ee4025b7e945c6deff690e51454be241ab1fe14e1213ba282698507e59092857b92dbacfe1344219d605654480f22b9d50f64aacd2cf027a541fa843ba40ed1440fdba1a41d568a9da40ed1040bdab13d47189d3eb580c6a54425c9712a28212eee9544213570276bc4e766dd1c6d5af36e042ba80630270f7750237200909a5d6ab7e99ba0c02698336a50bda6e01da89b39c0de44a763734ba775417942101cac9eab5528d73026d561a17a09d3a4b2b3dffd3ff7a01cae94a40a95a499dffe97f5280f2814e28072550166822842ebdc39ef0dfdb5db4885a2300fc5027c0710ef0169d2b46a0d51bef1a816cd70564b300e4239d40b630d5cc738757397f6e6e08e03dae8415aa22a668851a47716d56d8220099ad1620cfa33b3709403ea9162035ae7eb401991080fc462790c1f642353ab7b628d9204039a3134a347efca1baf57b9f05a88c4ce409586dc0c57401572b00375b0967c69753fb92975258b6479b6cd8e0fc59609d00e45c25805439f3791fa71b05209f560b90e7719c0e0b403ed30964c2639c2e3d82a615cca42e30630298df5613981a5d5c1b98ad0298f3d504a6c659a43630db043017748279ba8d5f8d4e9fd2056d3bbb300798329d0458c97921f7b9ac794aa88dcbba0365b30c37fd5680f60aa5c5134369faf1161e8c0b72e4ce9da6f7719e9c288e4d475b65d351398e28c9243dcd71a5988b56d2f47bb78b2cff122bf9372ce150820eb3e540f326713c3351606bc4147e42ff015f7df5224a540000 serializedProgramBytesString: - serializedSignature: 8adff8fb70d1d5a224812aac1ef95eb5a22e08b4962e89528feab18535d6144c010b6f9610772743f37029962e98f56735b1b24bcf1e4b728f5053ecc58e6703 + serializedSignature: d55111fa1f5823047a0a469938a7aac177bf7f141009c323450bbbfde1503eb1cd3fcc6be766581ca7c5c75bbcb56eb69ba79b700c4470f795e538480bb11108 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset b/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset index 05756bb..93faaad 100644 --- a/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset +++ b/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9ce9521b4710806705ba2c40200e81c1c4ce6539b691001f712edb086ce3f80ad78f38298c41c44a84204876d97984bc51aaf218798c3c40fe25ddbdb3d0da9dd99590062462a9d895e6e8e9fe7aa667767645282be0655d81c39a581279312556c596d81565f89487f30ebced6f4efa33b10fe79fe0b8017957c4f9809af8ba688dc27111be5544156abe169b702e52feb228c0e745a85b806f98ba0d7f0528657543a555312f9e8a27226d0d078858a34a159966a15d560c8e73e21de41648296c244b5969382c434e85f2764069a7dc73f12399b503799b50675f9440e64b92189b0f09fa20ec53549e23f2dc057f71f9392ccfbd2c2d26cf7d2cad97a5e1b947ca1b63df91c49fac0d3c271572fb595a92a5f9c825d770b94efd0159fe2cfb8ee794c2c6942c3b2ebf87649998fccc5975cbf39042ff619636c4d2f03ce8d27f50eaff974bff1185dc344b1b61693e72433997dc5126c3b1e10c2b8332265cf909997e4ec5256c510f7f007d6e43ec892c81ba24ea1f8a4ecde04188a22378c0d7456ab60add7d0f042846c22a8db3aa981533ca913066f530bdf374dc801245123ae96de20f4f13a85c09de05368c2b907e9fa2000ee422e44c894770c65a2fc4340ccce72e296bd06c09424141acc0718fe4bd00b5bd25834cc221efaeb30432ed88b403290ed03df85e220d97e9f886342d90f68b9056a5f85886083907e7b7d49ad7f67df8ac6a73452253eba80e4cba743bfc396e9a076b50fb2cf5e7f71e39098f50989894c3b03b4b51e2778f27de33b4830c4e2e8b52c63421b36ad2664496e69f250fc1c66df45aa8eedf36ef1be29aaf2d6a32e8ee71b2e0d0c3b713ff94defd1dd90fd79a362bb2b4a4980830cd0f2ccacb58231e09fe2684c3dd3954d48ddf52e1a7297df918f1dbe58a54ae7107446866aa75002d7f9e408167f05724b52be23bcaaa1cc44127e639a67bbc958bc8054e46319d0629ad431e52218f1d37f2e018e3873c7660d721727ca909c635048374d011ec5211a435dc0f46097a1763cea739a8fb0a48bca19ef51aeaab166ffe4c71d179d5c554cd33413ccf2b97948d69a423dcad209c43c23d2a25e32e25513f8de0b0ca75b4dcde32eaba15f1585ee2e2b455809c2aa460ad57327d159644d82111d32a48b057bdbad2feaeecaddb957de4ca0c1c5bada1ceb5119d6b934dba36aa128c81a25f112cfe859747785c2f3ca6ea3789e30e9a4f2128fd2c97d28d07cd81ba7b454a133083dad7f93cae720dfa6b50357562effdd53555ae506f2ba9ba4454efb533ba768754eda232ebf0cec19fbb7d4cc7ab517b7baa111d123a1d86553aa4990e790aa0d8270a9ea5c333ca2940b54674e951f5624a5c39c65e8c79bb24056d68bc1fe3daf3b27bf25777e43475e4518f71c12ae8ba72af0a21256e1b457818701728b748eef70e495d3907de63daae7c4d1af8631ead3b5c8c11e5cf8430a2a5ce137daa81859e385bcf4432a61f25499de0f12605f7eb044f34297840251803cfb97a04a7f48253bae035598f609f4834a8128c91e803e5e0764b4eeb250fe9209f6f12f2b04ef08526058fe8047fd8a4e0b44ef0474d0a1e5509c649fee37a04fbace1c674fded13a1982c57b51187c79b299a507721eeaed3f55e8126f70d8af3580f7383a5d45766bd2696d6ce328d0c8fb33a0e9faa387c2f9c2b31e7ba8a6fd2dbd7b838d36cd3763ace348b07251760feb1ef902d911505b0eb0d95b6b9e13e6dd575776e8d16424538be24ebdc76f39d09771ee7d50891711d918b2a22b704bfa0f1bf9cb1edac909deb24fbadc2977e36add11ecf5643f64ce8ecc9a8ec2918f4f072d31ed6f9b7159ccee9385dd24504939cca50360f4da14528f7b04eebfa4b14de968541728124ef434dbe8b98a5854f4ea8765fd437f4b0ed1df00bc6a295039f06dfdec3159deef69e77b57bd43b3d4156a8bc36c5fcc6ad0bb6497f572b2a2d726401695a099e364b2f73af86b2b428bd7cc4de14ac053e0312e952f7a1c6f7b46d014f284681001c09ced5f2a29c9e8b726aff0d0a04b617b4a171950438b7435a70871b3bd95d00b54597391578e32b1a0ee5d00f574dc2c285df538a82b6803c15db14bfc0b7ad8e4075c54254d1b04bf8bd960dd0a3dd15f286922405efb7a01ea65609b02bb4d0255bbb693ec543432670786502fad4e14ca69e8172d840f67f3ec9e4b0b3e06c1e19736232c5826993b160447ad65e5394a190df2a2ee76ebf99fbc7f19a3891aac7b8a3c48a011656678e03e5a6ec8b55df85a04194515328e30ce5ac4994b85d6f63b477414b729fd418b2842964dd0cd93593c870cbcc7daf621e32abf0d779d8ba18b6eb26b18d2be25f3dfb3b37cd411d330535cda0de6847a8373a10ea08837ab31da15eef40a8c30ceae7ed08f55a07421d62506fb523d4d90e84dacfa07ed18e50673a106a9241fdb21da14e7720d43e06f5ab76846af08ac818d45e06f56b93507b25546c789b903ab28bde3dbbd6810b9b022718b86f4c820bba2ae7ca1bed83715328a30ce5ed934459bbc16170e231b6c1916028ef981ecece0d66e761b05d8a89a8b231707da6c08519b8bb27d9073b7fbf32c650ce1d074addd66fe7ef57a618cabc4994f53f30dc795b71110671de24c40b8afe884a54e9472365f150fec0f4b4cddf210678c124e0a4d0ad21cbb248e70d718bc1bb7792134f6db4347881680ce51986f2be4994ce4f1b74134fedd392460775da14cc1e06f3413bc134d8338dc11c6430174dc29c54c0ac7d8a50ffab46a3fdd4d8ec3e2a4ecd933439bcd3ff90778f8cef5dd18cf6367326e0facc7e9c6540322a838cc7b44ed9009d6cd9878fb664e9971378bbad91c7eafc65063f77f22d62b0d4a3a4d432dfb6e2591a95a5cd3c57d3e3e3952cfdd8e434dbff48d8ff0f885ed84dd3f4d4d52a78de168e9baefbf46faaf6a94cf83f71c4e403a24b0000 serializedProgramBytesString: - serializedSignature: 9a49548a44bd71e74df41e2332a851f04a9f3cba85f04f68f251af3399e7e90dc3cccbd103e2dd557eed797bfa34403a2b92bd478b09f9da81583e9498036d01 + serializedSignature: 1c945f793f880ddf0321d126de412afdbda16afc69020ec1ea91d05f1af53e1eb53e0f6a1823462b57f6a14d9d2c9334a83c8bb03b712afe791b35d790c1120c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset b/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset new file mode 100644 index 0000000..f9f37c4 --- /dev/null +++ b/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: f9280f40c34dba44d856803aa60215d7 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed57dd52d340143e5b485bb48af8878e5ee8953a322480c3bd803f38080ca5dc304e2934d5ceb4b1d316451fc137f23d7c0c1fc10bbf7392409b6cb35608324833ddcdfe9dfdbeefeceed9646cc24f4d21d9a20d5aa4692a51953e9287b745e44d3c7e29ac5fa736f2f7482b689ba2078691fc7ba4ee205d46a9435d8cdca73de475692f928bf7658c7551e2da1afe2e7aa9510c2ad112add12a4daa5b06135b32a813d429e6a5f24817e80b5a5d01c593d8d23489a488968eb435013aecb74def8456136d7b18d3a6066cee8ac5bcc885bfa504dd6bf4af508bec0cd73f1942c670a45940369dcd10054af2b45d406dc18086454934ead21ccd6a59dc55851edc8b9256d0a32e4647e2537c8f4dc1e01a78dc1e177450ff4a3cc84ea8a3659a5690f3a81d9a81a8db112b5b98b60137bab489b425f676003bded34489dd151db3019bfe6a6aa22614b4857243101625fd24485d41bf8cbaaeac6d0fab7b01f981cc16e7dec6bb6ececd40323d46fda21a54ef2fddd04d4b60c3e86df6cf8547fe894758faec48b00d476dde23ea5bcc13171afa878c2587b56f634624537d75b36473516dc4141c9e639ca17e7dfb7acfd3b3442e7a65d8ddf784c191873f177e5dfdf0e3eb4fab9fda1cd959a676df402d4958b6f758dd8e5948a66059a30e038dcaaf74f2e7b8b2788af2fbfdead26f7807642532f53b405d467145827f3700d745a387301af389c30672226b3c689aa00d1236a313367fdac29a4f922461f387bc8e8425ff86a351706c8082260c9695c3a3c4632fa4671be3d7d1a32ea50ed96c5a39435ca1184113b639f66d02fbae2869be505d4ab850d54e2cb69a58f87af1f89a5cc0c2f35ac7cecc69f03d2217300a6d416916e0dc31e595950d9c4a392be2d79729dd99fef4508bfb655c76c201e0712ddbab46fdc494ce1cf242bfcee1a6d66f468737f595ff7cbf39bcdfaef65e1f3336aba89efee561678637de3b9bf19bd1b4147c03abf2c10f03eccf321e8e1e3574291fdaae034c64b6e3dc82c6c454d8c33a99cf5ff6cf73e0ac0afe0e1e7f21671cf6c9b534857b1808e7873c4fa46bcbf5651fb9476f82cfbc72df34bd94cae4a427f0585a02677a049e4853e0f1812bd30bbaa4265e2e2df15470cc9e8380e670a0b81e8f1f1301170f16dfca7ea8606c45f2a35862f3b9a3e6873c33936d9a4fd21b0c57e9d76be34c052f1dd3e304b24282576c0e67e79affcde8329d946b4e099ef78dbbb486ce5501c53feb378495aab74c170000 + serializedProgramBytesString: + serializedSignature: 5ca87c5aba37ee23b61c1b2a116b8ccfeb751c2a0f423a6f1d6495604dcbd27cc181bf579f6407e5104373a259fb2ed6d251c7523496c154f748b7b88bc9390d + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset.meta b/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset.meta new file mode 100644 index 0000000..17b2487 --- /dev/null +++ b/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b8ffdfb4e1a952e44b4e632879e38929 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset b/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset index 1689c04..3b1e462 100644 --- a/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset +++ b/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5add76db44109e752ccb0e29495a92505a20e5a7750fa5525b4eafb8a109a529d0f8c4716e0a277513a5c760bbc6369cf00abc0f171c1e861bde03be1949b62cad24dbb512126a1feb677f6667be6f767667939c45f8a85bb8ecd10e6dd06daad121bda4369e36706fe1ebbef9e515eae2fe02d73aea6ed17a4a4ffedc506fe3ba85b71ef5d1f3673ac0bd21f55572f0bc85be0edeb8f4083f07ad541e9d6ab449dbf484d6d44a8a883de9d4f3ca14dba58ab83ea05f51eb88523c8825556bb85451d393ba1694f6db3da5efc5ac16ea0ed0a74b4dc87c2e128b57b9afd824b79277cf79cf3c5ece50a2f923c8aa53872cae54372780d8ef990e2e8b2ee45c7d80320fdb87191d08d0585813fcfa748fee6a2dbcac16027a6fc8b58e160d113a1f1de28fc810ac5c135f27404f0fe55f09bb4c500335b7e91bdcb9d733ba03c09f86a4ec61d82628766817d78ec87b06b5a32dd34c622ac37d7620d3f5b4164a7c403b786f8a8655b9fe229a3aa2fd16cafae2f76d78fe03dc8f65b4a8ed5d3cebc6dcf520d3eba877b8b872d7ad7d9a36610d6b6fcdb19bbd66e4341861e80bf3de34cc5b3c47d46f11265e63e806194302b92be38e1b4a47caee92c5af6a2782e0e436462dd4fbb78bf77dfa2cd1163d324cf715b160c8f0ef7f7ffee8afce9f1563d4b47b6415d8b4ab29a62501cbf2ca6a352221d904c3c8dbac68187ea583dfe4c2ea09c2efb66b48bbc90928c8ca344a80ba88d75d3c1ce3d744e30aae75746f7a716e136f7dfc220cd92cce1490a34b689aa27130e77430174f1ae6f4b89204737160d71066fee8112cc52098a6431c82731a046da6695ec7bee8550ae9c5ad63a4e775fc944e270a4dc7ce1bd0736d6c76161283c8a4dc1871dc5c980537051d37ccbafa2e536efcad7715b1e26bd4d5d1de91759ccb6b828a9f2cb865a32d93f97a7360d5101a8b4954eb815461dab1177947e26d48c834f44eb0244e308be1e21cc3d4390653b7acb1de66eb2f86140ffbc952bc9f14757ec28eae6aa7b494c5a592c99e7149e7193c93d4e5c4f5286eb4b7c6f18515f185e9068863bfa4639f595ad5ac24ffe013619b251826be4ab1737c299c75a16005c337e4ad47964c259bc64fb0d9c41614e7cc68171a3c17d6d3d36d5ecde2d2eda30874d3665e6956b8319afb1f497aeeefe675d6a5db149f659a9e45be2c20cd61e5dc59ca675305ef508772164718f5c994de94ae054fb1c29cde8726df6fba029ec8591c04f04cde97ee7534e9a7cbdf868c1f3cde74f23f15017e3a3283132676aa2f00cca184ba1ebe6e54328d90f08733f3b2e9528de87c589408740cf55e0ab80e8c08cd0f59d6fe6b9abf13f4ef72c44786e1551f166d0eaf57fee791cf66f2396b1f1cf3e46c0e14ef66399b2f0853fb32538ed0647f20bb018342a3bdca91426964961be39832fd4c77817b2f4be0563de00e3ccfebe3392830a8fc3ed9d94159ca0aca5200caf7b38492f7cf9dd0d1895f99196c6656b0cd05605bcf12b6a206b6cce05aca0aae4200ae6b59c275cd9bb0ee96be2db18e95e803912ede1f7b7fe4386fd3381700f8832c019e17695d59357f1c14f7b2836c252bc88a01c83ecc12b2c5d8d5b77d66e39f0a80f75196e0f1d6e527c9eb5944f8ecfdec45423300dcc75902b73c02dc43391e69a2993b716312b1d901b8901580f90080d74f0ec00d3cf19d77fd156f2a3790c39dbda96bd0b949936de6e8063b817f2c594edc6796c79c15e17671e497b5dbb3724ad02ac72ea26e06bdec31d146edb7b277a9c372f78f8cc36cdae2036e759f263b5e4a96999eea9629700410f2a0e6cc3c6816e9bbced25749e5171258b1e4a4fd3cdbcfff751638fa378d3539e8a9817957b843db687c284af1c7f817dcc3895e12280000 serializedProgramBytesString: - serializedSignature: e7cbc2637967815b978a4a76c333e9bba36974f61a13ba2cddd53c70bfa6d53b82c82e20c327ba20b596920df65f1539fa59abfb7e9afdb4e542410869b77c09 + serializedSignature: 7e8a458f6d5f4bd1253b3c6ee8307075baf97ddc8188d79b4d659c23139318779be40402f06f6751fcdbd1a8faa285b09f05c7a2be37a7ca9c19b91914fb6b0a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset b/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset index 016dda4..971690b 100644 --- a/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset +++ b/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15477ac0e7812a0844130203a6d860d914354cb14d152004a24ac2d88041a820610909159a6ddc0dee0dd773efbda75c729738bd39c925712eed92d8c9a55f924b72499c7a37dfec0cefdb79f3bdf7f6edce635736faa1d1ceee7cf37dffe96567879533fe2f368fffdac1b6b31ab68035b156d6c30ef1bf6ab8dbcd7f9c2be5bf95f571f700ffddccefcd63335284847f17c526f1df75fcaa9f0df09083ac85bb9de27e036be37fd7f1b06dfc0a7cdbf9ff36fe542c87076a626bd816b69995c64a5288d82102f54bbf18d8152be0bf57b3e3fc6e9b500a222917b74af9af067ea75fdcebe64aabe776b13dc2ac6e7eaf8587e9635d5ce67e21b1e0531e2e266c124ea1744748f752fe3f8fff7f1c5d83154bf8ff5cfebf5efa0f93610be4df31f937b88ba48c27e4f548e40fee281996cb2bf996f42b92ee62a4d362e98e96ee1229f74974cd751bbe5e5e0f97ee65f2b9afa16b708ba57bb9bcff14ba0677b9f47f5a5ee748f70a4dde159abc659abc65d25da1c9cb95ee2a4dde2a4dde6a4dde6ae9ae94fecf68f6d668f294ff72edfeb39a5d6bb470ca7f85765f8553faafd5c229ff95da7d154ee9b34e0bb71cf9e37cf39ca64fad166e05f207778c164ee9b35e0bb712f9833b56de7f5ed307f42dd4e2ca417e2b513cca2f8ff9cb7b4b993baf28797adecb43cfe3fbcf6af79769e196227f13eba528bcb2699c6363a9caefe3e5fd17185d07e8f5491d73d727750ecb9cd38eec9ca792c852b66cd46cd9a831ad97f75f44d7e06ed0988e91ee26a4a7f2db6c48cb2d5abc9b913fb85be5fd97d035b72daf5e93a3c26d937e2fcbeb09d2ddcedcf5e536e40f6e83bcff0aba86782e24e269d4e2d980ecc6f79fd3fc8bd135cea39bb5fb9bd17d9e86b913b478701e2a61ee3c349179cf434dcc9d879aa4fd9f38b2f33e4b224ba5ef0e2457d547576ae9bb03f983bb534bdf9d4ebcf9dfd1e4a8705769dcaf926ea974af66eef6eb6a29ef23e6aeef94bc49289d7251bcea7e31ba46e991f703e93f59637f9e07f68adb2e03b7dd1ab75dc81fdc3d1ab73d8e6d853334392adc351ab76ba43b55ba7b356e7b1d79055f68dc94bc299a3c939dead962748d1816ccd3384c411c4cf2d2c9c7fb983b1fef935cce387116be964496d2a3d9901efbb5f46846fee0b668e9d1e2c43be2bb9a1c15ae55e3d72add69d26dd3d2a34dcafb86961e4a5ebb26af5dbae74bf70073d7377a7875ff3987d359bdd5fd62748dd2b050e9339db9cbc10c967e3950756ba7c6b853ba1dd2ff552d9d0e1a645cabc93888fcc1edd2d2a9cb6151344f93a3c2756b5cbba57b48faabfcd4a18553f75fd7fc8bd135e238b255933393f92f0b3dcc5d167aa4ad328d8b3e4a22eb02e9aaf6efb094f506bae6b246e568cfcf4ef23cb8bd48cf5e2963bd26632cba8f65a8e7bb92e83d47bab3a49b6c1cd48774e963eebcd52fe37e135df3b847ab7638570b770173f7732f62eef250c6bcb70b0306bf4183df4996580e8e3277393889fcc1bd81b9cbc10d8e7dc5aafdbb4493a7c2dfc4dce5e126e9ce8b731ea76c9e2bdd1b917e373277beba59ca7b0b5d831eaa3c0c3077b91960ae7253fc912657e5bf5b34b9b748b9eaf9414dee2073d78f27b5fb27ddf18e567990e2ad381f93fe6fa36b70e74bf788bcff8e66ef092ddc09f43cb8c7e5fd77357baed7c25daf85bb4e0b771ca57f21fa9bb31af3290a433c3356a5bfca8b0b983b9fbc87aef1732add9f44d7206f2b73e78f8bd9d97c3556e589d9da3d537982e755dfe5b894fd31213b55f8eb64f82f3cc48febb154cf25ab0bca59bc7ca5aacf6e45e16ed578dfc6dcf5d96d8e4de33e61eefa4c859b2b9f7fdfb937ee33cda6b93e6c523add6ef03b8dfc944e773277d93a8dfcc1bd8bb9ebb2bb1cdb264cd2e4a8707723dbd435b895d2bd87b9eb8e7b1c79e3bf8ff4c675c3edcc5d779cd6ee9f66aeba63fc124dce1dcc3c863e65974fc93dc1f22951e5f39474ef45badeab3139a5311baee9701f73b733776872d4fde7d2633e61a726a782f9cfbff7233fa5ff035a5adc8ffcc17d504b8b071d76133fd1e4a8700f691c1e62f17a00dc8799bb1e7d58ca7b49935394c25ef55c31ba46fc4ad47860749af292f1ab62eebe51b267f3a57b06f9554bf711e47706f981fba8d4ff0374cdb9947eacc955ee6348d64219f643937eb931b1e2b09e8fc89a798fb45c280c357cba4b232a64ea4511109d07bfe0df4522da01de98f5720186958926b1ee31c0e95419572626c78a90de35e277337fa25308fd28318aaf274401ca75f19f36b4acd2cffd6bc5aa0c2cac74f23b0b583d7721d43e5e65ece23f6e293b78b45dbcc3d2c61af9ef5e216f1f573bf1c95426c1128c1e663b97e9ac1075731f05b4975f77090d1bc4ef2342d336a17d1df71b10eb5587f8307835778f89d8126defe37f9be26c94c8cc3a9a178a287f67394a25d31a6e0d685f2eea85af52e45ca408a0cffb4816c39c7231e2bd2b2125be62e85432d099a893322a05b298cbaf8a958bfec6f60482de6d4cb4d09cbf1dde8b78c59ecc16331948ee29c282780a7ffeed11dfbcafeef34f73dda655b372311c9c9ac2b46460415e596c628284e426e4e6e65480a23afe9809bf68f21ab288df79ae533ce73d01f244cbe44e8018747fb6f28b661e04d4dac4ff3ac4ff1f105709e95291279bfa3243c3994a3d0aee3013dc826cc34d5d9b24835b70d6ae385cf867265848104ca5034570b889a0e8853566bd7600dda94d1dc9198e386b459c61b9f09c4414e364718d941d4d51f1e49ad3a148a44326d2a994c831a44405a4c42883711560dc68b79e859a9ea0221157ae29d5c5fe95a67354296596eec5a6741773319393d631546c6a8b85f8974f24fd5891f4994540257e1e95f8e3a8c41f9f71e2e79b125f64b2dd56133f71a4a5fe5acdc37670f38e88eef3200f6f1a9925cf0ab02a305f03654ebf12917e339869bce84d232a350b4c84c5b07d5f560837f041cb467eaf993fdf263ac6e08f1beb552286b84dee10c9494f4c9b74a9207d2122ed57338a78a1a9fc40324c32b4ae3fe4ff120a4c215d6046989253543d3767b9c098a7336ac50ecf36b68557300799330e55f1f688312868a4c6b3dbb9db2eb400ff16d9094e1e57f20c31d9540b8b19bab5c64276aeac808d21c344c69c2232262c9434717f67fa65ad48814e11d302a3361003f5bc62b1496c5e1d14a99d4b34205345ece1624315ac9154c19a66285862b79b878255642a58627923fb43d3cc3aefb0b7a334edcefb74966c64e9b5eb3eca9434406f06a5949e34d3e9a4194d099f69106eac5093082fa684cf32088f79d47c0c25fc8200b08c3509870e153472094364683806c5a0b85fec773f208a6a6b628cf9748ce34c3142019c6d2880f372bc15c0f126e1903a730c557a0590854d1523c46ec78478a6d2f14c30c503590cf66424f42574c1a5b4e0128acec5063abd79dee84ca4e85c42d1999b119d522ac7ce0b20c74ea284cf0f40f8649370c0bfc080ff7bf9def09f47e12fa7f05764847f0a45a83200425329e15501089f4609af0e40f8f994f08501089f4e659c4b0d19e70723bc659c1954c65944659cc519659c998678ca457d0d5b52c333cc539311de877ab04d22bda11ebc5851169bc3bc0ff5926947757d665179f3b200f2e60526e1d0425f6ea2e1a129bf90120cabf0099d079899edf3dc5d984dc5b1cc140748d89f8125734cb140f15d6e28be0f8cf2567c2fa284af3008cf19ed4d78195537aca4ea865519d50d1753e9b0da6726ba84a25363a0f385473a7329add7f8d47a1e5560d7065060e79bea61d1b5cdee129b33f50b72bc0f24d7714da727725869ae6d6b19b58e965c07aa3e5d4025cf7a43f20cf3983ce526e105e23231c7ee1be72dc7569884c3f31bd2c9b14966c92ba9a2b0d16751a8a270d41b70cc28f586a3da54142664bb28e89366de8ac22613606331d84c148354f153c5602195e6f02a6442e309589b38af56ee054faf12db801a644c6d3c9e1e7ea78fdfeff794412e35a5a118e866734916eef50829b0acef3d156117f95cbd423327e336665e4b4dad0295908b4c0909f5d9f6009a9bc594f08600842f310987c46f34f2d4256fa3252fa56aca269f35e565148f1d01f0b89c127e6500c2afa084ef0c40f8324af85501085f4e25e6d53e1373052578974fc12b4d82617561773a82c7d28257519cf704c0793525fc9a0084d750c2f706207c0d257c5f00c2d752c29b0310be8e12be3f00e1b594f0960084afa784b70620bcce241c5a0610e5ab65d84095f9769f657e23c5e340003cea29e11d0108df4409ef0c40f8664af8c100846fa1845f1b80f0ad541eecf29b07b7516a7707a0f6764af8a1008437504c7afc3269a4d4ee0d40ed264aedc37ed5de41a9dd1780da5752c2fb0310be936232e097c95594da8301a87d35a5f611bf6aefa2d43e1a80dabb29e1c70210be876272dc2f936b28b54f04a0f65e4aedebfcaabd8f927cbd5fc9cd14901b0200b29f127e3200e12d14931bfd3269a5d4be2900b5db28b56ff6ab763ba5f62d01a87d80127e6b00c23b4cc2612df63696461f76292db893d2faf600b43e4809bf2300e1d752c24f0520bc8bca83a7fde6c16e4aed3b0350fb9049386c44ba2b9d6c926423520fc5e36ebf3c7a29c9f7f8957c98927caf5fc97d541ade17401af6536adfef57ed014aed0702507b9012fe6000c28f9884c312281c566058574c145e4b0b3f4a69fe70009a1fa3343f1380e6c7a9acf288dfac728252fbd100d4be8e52fb31bf6a5f4fa9fd78006adf40a9fd845fb54f5239f0c90072e08d26e1b03e070788f859e9bd89d2faa900b4be9982fdb45fd8b750929ff12bf9560ac8b30100b98d52fb39bf6adf4ea9fd7c006adf61120e93af2fa493fb924cbe9ea2b47e3100ad4f53c25f0a40f89d94f09703107e17954d5ef19b4deea6ea91577dd623f7502abfe657e57b29d2af0740fa3e4af81b0108bf9f12fe6600c21fa084bf1580f007a9d47cdb6f6a3e44a9fd4e006a3f4ca9fdae5fb5cf1824978b772f603ac2de7e17ea553e3faffc25df13f39ea922306e898173dfca62b0d7d38696d4b699474c690c29f1413a35d8fb74123f4a659e0ffd669ec74c92e1cdb88fd251b98416fcb8493054d23fc60c7bc1d630b5f1ddbd817d33832f9e1c156970addc9cb980ede53f75fcfe167ec739220a7ccc29687af5139ec639ccbd51ca4bd3f20465e58f9bacac22aca4b6f63b961e100cf68a0399d47df88c8c6e45fc2d482f163c4959f013260b5669354a3c4e47d71eaee55eceff307fbc596c3283f4a035a5fd834aa1af51f6fda4c9bed99a7dab38eb3e41dd9d16f5ac4de4b101d611503a3c45e9f975939e2bd24a87553c97b48a34708e55f39f0e99d9f63465db4f996c5b44daa6a70694e51e59fabdea1f97e5c59267284b7eda64c912cd127cc2897f5bccd2bc58f32c65cd374cd6d4a4281b3522d72596f6f873e9f9d316efe031747a7ca1e739cac66f9a6cbc3cedbcd7206b02bf252a139b9ea76cfa19934dcb3ce4426f56614941d8f50265d7cf9aecaa3fdb9aaa2319f0810c8eced056b6b366d99bad3bfbe45adec7750e7dd82efa046d5cd723e2698703f81e16d1803d4eafb853b66827583359a36662f58b94d51f9bac5e9d56cddfc01fde2f52a7191dab79aeeaff97280b7f2ef33e46bd489b7ed628ce190ac2b6ccfb182f53f6fdbcc9be8ab4eb98da94a53188d47985d2fe17d26905cca95327fadee1e905be4ad9f88bc96b96f4fae999b5e599c5e0c5ead728ab7fc964f5468f56e33c8aefc2f725938f4fbc5aefc5e6d7299b7fd964f3369f299dbabdf4223d88d6e40dcafe5f31d9bf2e49dfc06b7976f706d2ed27645ea6dfa42cfd552a77a7aeb76ac55c4fb3ec39a8b6650bff3b3ea63d97f5d85b94cdbf66b2794d9aa99b6abc9eed947d9bb2f2d74d56566b56d688be8ed39b1b907636723ffc72af9751563c94171bdea16cf88d745a551c2b4ea935a29fdac9fa891e9ddb46fa4e3036be4bd9f8497ab9d16c63aa9e5d6636669e1bdfa3acfc4d93953033639e89dc2e626e15631435ca6816f793e7479b7dbff729db7ecb645b5592fac46fdf15cbf262c1079405bf6db2a0894c1d3c3f9c4ecb975a4a7acf04954b3fa4387c8be2606becdc20eeb6728983c22e901b0f93bc6df1d2ffc9e73fb118bc02b95648eee321b78a1070d5cfcac5b96015672d4d7d4c24c4dd2dde3befe2b54fb338da259dc31f7f87d15f39495c83cbf48317a9ac30a5da02946ed8baf48f2c4dfcb847beb448c9e2a4c5216943cdd2df85541d29537558b938ab6d6e86b929b516bf07b10d37e721ef07fe3b0236cbb5af181cd0b3574483071d1b646181339252c698ea4c88f94280fa2e44009ffa816ce62c60f4c90e01fccbcf1d560129f1a94d5cb0a1cf69bf709bbd43cc003a7542a3a8a1bb2381ad6c741cdbefdbc436f62c36a8fafb589facf2719eeb8f04b24923e3c8be6d13d92863c1841e703b171405545b73e2a8fec026aa22816a2fab606a61337e544c1440ed2e8c83fac36c81728a63b4408d298883faa36c816a8820a8337971507f6c13d4c8841c15a5f66fe1b838a63fc916a686c861ea288a63fa8e4d4ce3c8dcb44908dc1fa18e42c1f838b43fb50f0d3a0a6b44d4d4827424a09502b4fc5c4db8be1611d4a7215391a647ba306c5acb8e898f44f40979adfac8571cb21d36cdff8ca1916b591aa3bfb2141dd1b2a46d6559d22e4759d29e5b599aa386b224b56b9987015b5992c6ac2cedaaa92cedf2189fa4324f2e554091fa73f6e59e3faa80f9a3cf00c2e3128253a37e6eb3469d24d3da992e3c2416f6e8a9d8bd0c0e07d574f0f395cc42573dbb2d1d0333a96be13d73d540fd459870564512e73d08e75fdac43905d544e9d448f04c9fb86f0d6a912da81508ea776d429d98228fe2d5293847d61acae9b6506e4328ff2a2c28ab2389f22184f2afc382b22a92280f20947f63136531aa3507643d09d7bd0c0e92368cc48383976f0bde0508dedfda84371ec133bd6b940588d672602982f877e7b230bbb7a854d843596b0be53184f2ef6da284fe06ce87f14163c2dc50043a393908db3fd8c4364be6c02efe10e43e18121e75c14bfd4a94d59c690df10a84f87bd928e42d72ec3d90744f8b4594d61a9db108e53f9e5b9451af2fe72394ff6413a5f7098d45111c811f4638ff394c38ab2289f35184f3fb3671ced49aa516814d4d42af66cec6c4e4882d167f6b80af4380ffc526e0120df0c124c3488b20ad75e1372190ff1a1690951104790a81fcb76cb4ede94db7554510e54684f2076141591d4994f72294ff1e1694559144b91fa1fc0f9b28276b35658758006d1f725df82308e87fda043a8799c6eeee75f13af141bca13a865f8a507f611375a9447d80ac089a5c55c1527b300b6dc1ac4230ff2b4c30974410663982f9df6182697145c81acc3908e6ff8409e6c208c29c8e60fe6f98602e8e20cc4b10ccff0b134c8bb34bd6605e8460fe7f98605a1cb75b83390ec1fc6198605aec675a833912c164b110c1b4b82bce1accc908662c4c302d8edeadc12c413087d984a98fde21602bbf716c88cd77f621a0c3c306348a33f18b11d09cb0018de284ddad0868ae4da06a5731ae3dd339a4c462b17fdf16d44710d4bc3042b558f4ad413d83a0e6db84aa36235eca86de66c4510862814d8873b5fa13838429e4cc4e3eb49a7397da82de81a017da843ec3501d783b04d222de525b780f21bc236ce21d25f142c4ed02ae92dd99788c4d70e0726d816308dc489be052edb48bfe98be10a12cb289d2fb4e3b8b1d286b3b975a10ce5161c25915499cb7219ca3b351d0d3db7663718ede5a07aa11a12c0e0bcaaa48a2bc16a11c732e51ba7789581cc55bdb25723d4239d6264ad89caf1e6863f0123d8c855ad926513f368b0365fbec012cb105301f011c772ebb42589cd5bc68edfd8dd908e5f86c4ed1c1a30e8ba135e7793b023a214c9da14a9b3b93ac75866e46384bc285d3e20e106b387b10ce8961c25915499c0f229ca561e95f5acd99d6eacd2d08e5a4b0a0ac8e24ca0710cac9614169b5805b43d98e509e171694565b726b28af4228a78405655524511e4528a79ecbf14fd6d62937db42598d504e3bb7d31a513f0ae06e84f2fc6c2cf9560dc125df6908e2f4f04cb3599c47b736cd7602a19c6113e554a61f069aea70d12c1cc267ad985f8cb0cecc4631af1c82c57c2a82382b4ce370abeb3cd6c6e1fd08e70561e95b5a5dccb59633d7239417860565752451de8950ce0e0b4aab6be2d6505e8350cec9c6a62cf3e933f01dbbd614356814cf9e398ef05e64132fbc4d83db72d521b27850df585bd07211b4b26c2e9d0d9ced450ead01e48d08e8c536814ee017c9be7280fda3b7c3b20061bcc426c6998666c719d5c03114506b0ef2077b87dcf6c16108f05c9b80cf63fac032d9972fb230a8b4b6e97a26423acf2652fdccaecea41df8e87594762090f3c302328afb383623900bc202d2e23bbfd640362390e5610119c597ff76219015610119c5af0c9c44202bc302328aabe30711c8aab0808ce2e6eafb11c8eab080b4788e8c3590a711c8853641c2e0425f9488e2d70686236097667362ad5b88897f95ca9c0ba37e4ae11d08efa270adf358ec02599ba76c4338178709a7d5f35fade1bc0be15c1296050aab5f1bb0d6f06c4728978605a5d52f0d5843d989505e6613a5fa0858e21be287e423d19b438f217897db8437865fb490b39151ed0ee5217c5764a3239e5e8d18bd427c3902b92c2c20a3380f791902b93c2c20a3380fb90c815c111690519c87bc02815c191690519c875c8d40ae0a0bc828ce43ae42205787056414e721d7209035610119c5314c0d02b9262c20a3f8aad33a04726d58405afc2a8535906b11c8753641c2e9e3fae6aa7a0623ec81886fac9a8010d666638ea785a573ec88c5e1a1b5698a0b11caf5619ac8adb4d993b43691db8b70d68509675524713e8c706ec8c60c6425c3bb7ab3f26a93b5a25d89e06d0ccb4c786524a72cea11cafab0a0ac8e24cafb10ca4d614159154994ad08e5e6b0a0ac8c64a7fc4a84724b5850564512653742b9d526ca603fbd69b1f36e6d916c0342bdcd266af506f84236f4de009f87206eb709719a965fe12482417ea3860dcd03180711d8069b6027b0f8db3910a845a8d02dab80a8e7cff311c6c66c344df12da9fa1bb651cf918b10ca269b28a71b9ba6a1fd1de8e508ee8eb074a12a23994f6b11ca2bc382b23a92286f422877860565552451ee4628afca466fb37a08f63667218857db8478be8438c03af86d6876cc5f38ab9501b27682e0145b684720b4bb6ca29d656cdd1b993a41835e23ca521b6feda48d9508f1ee302d6f586de7ad2d6fec4338f78409a7d506ca1ace5b10ce6bb2b145815a168efa9ee16204726f584046b1cb341a81dc171690515cea5880403687056414f70c8f4120f7db0459eab1c9b1b8d461adc1d98360b6840966143f30b317c16c0d13cc2876852e4530dbc204338adf815c8260b6870966145f75ae43300f8409a6c56e9135985b11cc8e30c18ce237a41a10ccce30c18ce2cecd2604f36098605a7c89c51acc9d08e6b5618219c523eaaf4630bb6cc21cc3e2db12d4836d915fc09884f075dbc43705e1739fbdea3edf003eefd1c68eb12c9cba6a0d6a11827ac82654f58514b574010ab40ed91d4803086b4fb67620b9f3aa5a158af28766e6228cbdd9987c4bc4d8e0aa3fa35acca7209087b3b1f88bdbf11d9c470d57bb55cc6c2a77357fbc83073bc29fed115b67ad16756b5f227f0ca1edcbc63e0f6a82188bb33aa8b456dc172294fd3651aa0db1f12d0ae9e7518b60ade5d11908ec4058c15a9c53b206f63c047630ac602dce7c5a033b11813d1256b0516caec623b047c30ad6e2249e35b06508ecb1306da9b1fa5e9cb5c9921b04cefc5c4df8ba04e135c25830b745e8ef748e1688ee3bec8f03b22dfcba5ee4c201b68f03d9c57fbca5c11efe63f28f8917b8d7b2635c3df00579ad42369c6c0c9af5b30a68258ee32c51461c1e5d96d6998a6531d866179fd88178605aa7956d1249decc6d80a7015f4c3c0bfac0db299bc4f0a5993fd92cdc46a63e4b5a0e238418bca6e094d20567cba743b89bff3857ca3fb54ce0955cda098012339793aec0523a95454ee684f0ed5cf7169101c13795a5a9eda3734d5192542987e239a4edbf0ed23d47a6fbb072682a629501e4bdd41a5d0f310fb35433a775227cf8d2752b7fa24728d727d4f493af612bb45b5ea788b7fcfc70e6e9e06cbf01d765c3caa7679aa7bd6b74d2669e76a4395d384d766d1ad699d341b739fe54afc80fcd67f38253c23bf8dfad6990982626496869abf8d501616ba790dacdd43f682ba1f70655d18d3679166975447c7ef1ab9a42c45b0135c54daec2540185e9e6af7279a0b9fc169b3cd3fec8eb97388fdf9a98c76ffb2a8f079ac76fb7c93383e3efbfc4b9fd8ec4dc7eeaabdc1e506e879f5251e936f1b0ce68085eacec133b14fac493b93f020d539a4cd8680100 serializedProgramBytesString: - serializedSignature: 7b9eb41d6a7f73b28f7e4dda3e8069a7797838ca3cf1ddb6c3e91b1462017787a664d404cb2c1a20750560ea983ab811ef8735761b2a73c62a34e4556731ac00 + serializedSignature: c6fda208b0cd6458e8d48013ab425e1da6e2967f303c28db7456f9073bf873b4810a19fe82bbc8a8b09c6eee7274f7891700a6aad2a36a562be9f89618deed02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset index ae0d398..e25ee4f 100644 --- a/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset +++ b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a6b5b1347149e0db9ca1d0482a0606b6b2c4a02586b6f6a00b178414b807ef0e98311824d9f707948b4dacffdd47fd47fd07fd48fed396767c9ecec4c964d76a2a1264f76b36767ce9ef73d67cedc369265f0b1aec3618badb32536cb36d92e3b6407f06f09cefbf0b5af1cf933760ce757702cc2bdeb6cdaa7267eae5a6938aec25595d5a0e66bb603e732dd2fb012fc5f85ba25b842e91efc4a50ca8a42a54db6cc9eb23536668df8a8d8a24a552eb310979584e3227b07774b64143e244bb7c6e050803b55bab70f463be59eb39f09d63edcdb813ac7ac023a5f92c6e41f70b408139dfaf9b98f9f07e01787dfb0708d286ec32f06a223a97c172f7f5e9247b97c4492c7b87c5492c7f96f8c5f27f87990cbd35279473e2ec9935c7e4192a7b87c42929fe3f24949decde51725790f975fe2d7bdfc3ca4b1d3914ff1eb08b705ed8cc42c8a901fc0674576c4b278d3ba1620949d9afe418caae311dbef10cdf8d81a84cb11285044d226c5698d2db07965248d5b3d82dd4b742c428932299df63ee22fcf23d0b80a7c4b4233a882fc01b5226c0865b833cb1ec3196bbd607310d8cf252d5bf0d80a34a512db80e311e97b01667b4bfa41c22623d759079d768bde078943e8115c57c8c2021ddf90a525b27e156435ca2f07906116e1fc969ee6c57e0cff55cfdce094a96d54376c9ddc4e1f8e9b96010d5a9fc536fbd123efc523942ea779338c66b18d587f7a3cf191433bc96067b1ca75ccd95d964b36cfb27869ad7b180c8ed18b501ddf36dfb7d8cd8658d4cca0bb270841ddc35d77fe99b91c7dbc1873435b6059ec36ac491f688d88457d196bd4a3a13184582c9a434365fa2d15fdd44d17da48bf5dae4ce5823b204e3d93db01168e209d4eb3c07e811bc760ea2cbb0f4614c9ec0a3772932055a89b2b73d94ffce1bb2c0fea76296fdac3b91a37b3ca3cbecdc5f91027a3e87cfd20ea1c14513928d96e07f967a4460e4a9ee0aa3b083f6a06531a06fd6cd031d8a56230d5fe10b77d5ff1c9976a0671403be561f028af66b05b1b838d6dd031185530984bf171b3d7acbff3b19464165aa4511ed329ef552a073d0194c775cafb42509e5005167acada686360e1bd43d25284b2c1430be78a333213eab81aa0b84a7bc0f99ba08baca4ce3f834aff4c078aac944ef9905af96210e5e774ca874350dead537e3e04e53d2ae50867441909b2e601bde65e9de6d15635f7a99a1ab1f4c2685373a6df0598673d827b45285fa2b13cca9f81c6223c1bf5e5e909f529bbbb46e3268899fa86448fba05a6a9055e612c34cb742db35fe54beac899b733ff173e1e77a6f4ee1cd005ca8556036550a779a255cd433acd93ad6a1e5669c6ce0597a93c03db8513e7bb1da973fc2cdb86ef2b1abc6ed324ff3184dd0e29c43b6248ba13b90743428fe1bc0ec3251586bb4d6170d6530f79d37d00a5704023a3108739f23dbbf66e206c233a6c532a6c2ba1605be6cb31e807bc5ea1098c69a4a33aa4d32aa40f8c205da3e8338f754c87f5b20aeba350b06e51eb7a4d1d538d2fbdad434d9c60be067da631a775983f5161be2375adeeec60233c04b4db30353b209fbd23efbd82ffce5263e30c135efe19d721fb54856c29146f621efd8dd6c8ab0adf3546da8cf72ee8305e5161bcdf02c63c0c8f8ad4268f85059076e5db091dcecf54381f868ed3ceb5ed6c97933ac49f879d8bd4889d9cdb4ecc177598afaa30ff183ae6f79d8b2fe9f06754f8d70c44394e3e308f15288761c6f61f1386817c4a87fc9a0af993d0912f917f6b342dc4ff3819f4fab415dc09f85a16ce4fefd354147bc6675403afaa2c4b73f01cab4fe3fcf684f1d9fbec2559b40116bd3c59c46bace10ba6df21de63616d16faa1b0176eb1fe1eed283b1b502a74fe98f41ba3098ec8d1054cd39ac459433a835ee5ef7bb048965647669a8c267f2bf0359c78973a86826f74d80ad668130614e03ac336b3dfe0a937e587bcb194c020df273e05adbf724faa9e788314387b6a21bc2681619607cb7669f506077ff8c1462f295f092dee9adb2ff3b6907eca496fc13c94d68860a9c5d0cacf8766f90d31e233a7889a7a0a56a7ce1ca6e0d9ff7976cc6176c49dd2f8b0934c72984c72265b3c2ea415858ef9091cdf2aa619d2735bd9334fb93240f769403593059294056c0ae74c5288de7a23ada03881ed9e951a2371c014890981c47993248e4b71280f8877f880b8cc7e1716343a8fd01e81d0059384f65252dea607efd14cc2d15df676e3e1111733451c1388bb6992b8514edc0eef526ad26443347e1b92b3312a53a6a8ec17a8fcd2249529576674d6353aaf2b890984dd3249d8888b30bf4591ce23322e10f995e93ed93bac51adac751e89e704126f9b2411b7111b8dea45b9311ad3a668ec1368fcda248d97798762af371d505f7c4c4d1a57bb0e8052fba5f1b3d6cd440482bf314970d29535573ab493890a747d6b92ae7ea61b191ef022c6c84b9822cf12c8fbce247969a963714ff7d48bd99d374be915e8fcde249dee1162e72e36740984dd3149987abdc6bb49da7914a6040aef9aa4704cd11f37da6b32d8f71a6bc0030299f73e2432e73a90cc4181ccfc8744e67c0792392490b968924c7945d1ce94676f4eddcdcecc6e570e8be0eb60f16e1e1419cd0821a31cf4cba59df97e26e0c24a26c09a7ee6d45b28ba92dece3b1360fd22d364a07beb9d6ec93dd3d410d8de001ce43189ef963e21bbd01e5b4f7d33304b2fa4e33a5b901df4c63afd77ea9699b0a729b5a54a686d298cdd4715d25676227b1a78254baff09f65fcf866669cbb9dc2748cf6a937c1f3b6f2127b0a8577c928fcc4fe035c3a8e7110450000 serializedProgramBytesString: - serializedSignature: a1d837a5a32d679e6ef798cda5c4af1b535b3ad0d9c4968a1a2693bd502f9ae59f36b1aadce2e82d7c1f43213efc2ea42262196fc56cc29b897908901355070d + serializedSignature: eb2d79a7808272cb521832ff801bc20af072e0c2c8534b047faa6302b3994aaaf6241e89c98b94b7af13e491036e5802eba4daa09bea3ef771e760ccdc6e5e05 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset b/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset index d3d3271..36582ce 100644 --- a/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset +++ b/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d677c14d991c0df082421e2020b6241806009c3021a2132cb0242124224b14abb2cec82904642ac24b0021bce77debd60fb6c9f2f3a5d0ebeeccbc9beb897f7822f075ff6e560df9d3ff893bfdcbdaa7eada9ee79d5d3dd332575b3967e9a56a77aaffe55af5eec9eaa9cd23f997dfa6340f5a836d5a4fad5b0baa726f57f6d7a3ba17f9d3df7f85535a5b7a3fa73509fdba71a4bdc093fbb331bf46797de9b5633face5935a4b76378be57e5f5ff5dfadebcde83a323fa2fafafca2cd637f5ab76d5adaea8faccba122206f0a669732c037a6596e8cfb3ea157d368f9982447278aa5e7ff4ea33d3786e4267dabdeeba7a1ed59ad0e786f43d536a5ccbbc8d1297dcd01233a8136e969bed0ab33daaff6af4dfd3641fb438a6ffaaf5df2573bc4affd5813cf37fc6ecc3b56f9afd95e4789df97f9591df63f61f31dbd566bbc69cef35fb6b7de71f25e7757e167dcc1c5f67496bbd2fad7a9fac0dbeb46a7ddbe344d663e6da3edf351bcdf64973be9fecc3f6049171c26c8f9163c7cc7693d93e65e40c907dcd34f37147dfcce77cf79d32d73f43f661dbe093f72cd987ed499287934e1a550d4e1a55e3be34369bed6923eb1ad987ed1973fc39b2efca85e3d77de97cd4ec6ff1d9632b63db1adff62cc97ba3cf2eee35dbccb6dd679776b36d2332daccb6951c6b35db65165bb93c3a7c3c3acc76a9397ec3ec6ff7e9f9b8f2fadd0eb3dd69b6bbcc76b7b9ee79c59739b7fc9ab2b7e8d386dde703ee71cbfa39e52debe71c198b773832161f0b90e172ee247c5c1f3e4f8e759263b0ed32f7be40f6759ad51ff6c9bd64febf49f6617bc197e70b26cf9f72f25cbdc11cef36d7ddf2c9bdea93dbed3b3e486c08dbcb449765667b851c73e5667db6bfed3bbf87c8b09d7f4279fdd84d6baf4fef21afded56e3cd8a7bc3eb65f79ca52cd1d9fdc26b3bde8937bd1915be3da2be793dbccc83de0bb8ec6e952bebbc86c5b542196c3bdc3667fb1d9cfc790b5d2276b89d91f8921bbda6c0f9a7b4623dc7328c63d8763dc7324c23d2e8b385ceb7c5c3df75667b0e5735e4b1e54f7550e85410908db4473ef2cdd3803d135f0013fbb31d919dd0cbaaf05585a48fdd8fe9ad1166cb1b6901ecb2c27f96ec3cf417dc5180abd539cc4278a9280cc8debdf3c69de4debe39dd83a8406de983ed3a403da18de754b179debfad72b6540273bae9b88791d1066755220ef96ce76f195a55482a6a0ff9e1e2dd369a94ee8232ed0fb7a7f1c73d88b9f0f30a779cc7d973e3683ede649ed5a67f5f6654cad58f729fdbf2dcd3e83cc9e477b83953bee348b5d33b56b6d20f739f4d12f5a64212c02e8b12e809fc539282399f71459e28b0c9d2003c1bacbc83880c8329e632d2a87f1bca78860741d8b35b4fbb7c3fb88aea88274b19301736f420d0a166ef9c2a9d35f78ef073e59ed55eda0ca6193a7a1846a4160415e36b3be4842b00ad5d58b9b21a37efc191b7eecdef5ce237ee7ba31bc2eba016ab066f21a20034db13e8c9113ba190bd5d81d4c20af85bc84551a1c29b24f3308ab45c4c51568a96c7290ab6c9097cc37e4d2512508f29239bd0a90e1c74eb08e21582a0f1cc1453682d80b991025d8af8f39cd9f0e3ceb785093ee204fa2fc417d0e720fba84b9d6a97f2fe350d62ce627983a74a8f6fba8db892f43e2104fe5f3cc5969b1cd4ad8971c5f202bcdea3c43fe7bf5dfacbe7bc804d5d27784b7d1f2d0365a81366a0eb4516572cc59a8da6621ec15e717c442d0ea1cd571782650479774789bac0c6d935568933d0136899f47ce0a35362b605ff386a8158a3b93ee7f67f5bd7734a907e849b3263af8af0f66fe4868e6ab9179a3b54b1c2d471ce15a0be16620bcc696c93a5f26217f8ce02536c110e2d68611bc82175c67f3091cabec9bc736029cbb875206f5b5d15b0930f0b5d7df4ab03bc13a74820d45ca95ce0267f4a536842b17a62b11af9105adfafad08dacfac09e40d426d6329b674339da10c6b36b79cf5e6e138ccd494b93f2fff44f91f03a5ef80a9bcd21a6675e9fe7506a1fcbebc40e485e756bf277953308e3a67b0fab0ec8913b98d3a3b723980b38ee56fdc169057bd4c6393e05c6399c76ecb086df85d202664faad0ab1bd0ab9b022a645b6ea257cdf632b519534f161baec4aeb4152c28105bac51d85faad6f1a56a954d321cdc6a71a7667027a8cc9762bd5994ce663e9d47b874b671e96c8f95ce6a5b94c083af2e6894702235c81bc1210a47de1505eb215e42af7d51fbf203e3437dfa9a299d46def87b3971016661375b6a1abeb6d98125e354889221a9155716d670b5174c2b170d0e4163ad5b4d7a8682dab1843a83e40fb0e39bd7398852d1ade5bc7917e7cdbb6379f3a39cae599bae2bd0c3816ea123f30c0e86cd44acc8d771f1668f25de64a2c49bf51cb92738727b6391abe7d2d9c7a5b33f563a1b380b35d92cb4dae28dad6579e2635cfa395bfaa067277ac8557d6850c70b672596b35a6b0c575d45497d23977ab32d75c8eb4dfddbacff4ae502ae9bc26ba2e467932dfa63c098cfe1577f6b255acf0006f6c275ae5b947de8b554fa5c646db059139a1eb010c0df59c1c978bf69ea79d36ce6841fb2085711856fe14afb61aeb41f8955dab7dad2017f3c6af3f79596787c4defc324ed3d1d01a278762397f2315bca6be7ca790ff6ad87d1b707742e06b5fdc1bfdd09932879d8c6e5e1b82d0f0d45a5bd545ee295f9ed9ced4f70b67f3296ed1fe7b43f69d31e6a6e37bab9faf927a7ee61048a16ef7770da3ec5697b2a96b63b396d4fdbb4850abf55479969f4f3c9398d5b513fa70c38cb13200a45d17797251fb9b5f31dd17bcd5420c8891ed1cfe89c6ef5211b19d975c61ed55b99a85e2a0f5c54df6d23880dcb495182a5fa0ed0739f452d9a3c7d0448bb30f15a4ecf07d6cf46ebf9b421fb1655bae75389dc7316cb7265af9d8bf510390feabffba43d050bf56fe231e875458df57bb83c74d8f2b08ac4fa1912cde3a5fd0497f6395bdacb48da4ea48953b7ede5d2ecb4a50993d4e061d162f73e5b1a80ee3c17bbbb62c5eefd9c2e17387efe564a4f64dd9ab8342fdad20409b7630c30e738829738829763116ce6b4b962d366b985e0d918da1de0b4ebe6b4bb1a4bbb164ebba76ddac1f83d2c182cf453a36975d0925a0e0718f26a2126a20bed90ca4e44c3ccd3221fbc1c0e77044d39c7cf4da352af9dd61fce88acb3cb0c7543532978e63b7e36b84aec90cdc9c0ec7d164ecdeb891a6a4e3550c8ef69bdbca71de692ec0f48d2241433c9235c9203c1497ef6332f9e6e7cfdb5d74e464ff2a82d49189b8347a3ca9a0b38662ba93890765bb4a4baada45eddc0b9a8cf0deaeb41a6739c8e11b5620aee737fce79ef5dc165149e0e0b37b6720d8bcc2ea52a9a3baeb01cb7d914aa95e76c198eb088e1844d3098f47a18c1d778c14fda04c348db8d30825b78c12739f77ebe5cf77e8a93fc42b9924fd924c3e80f3c7d55eed8d6695ba9c461e75b892a95f14ae4add02572104be48e1825326a693cc339caed721da5d52619da4e43614a4d4023eb2c174086cb0c206d5c8ef365e6b89d0b20236506900e9b60282fa361040ff282cf716e71a75cb7e8b415719cd919112de25c3baf9ce516c1c57d2c7471bf8bc51d86022472c915fdf3361b83255e0ce33c7779137771ce335eaef35ce0244f942bf9222779b25cc9972c927338997877411cbe12eb8c821dff5e18ff69e0895db6d9029a18f755f94d8c2b5c907f5b9941bedb261862f15499b1f8aa4d3038d074999c9fe650cc28cbd848bb52d6968577058c331edc84a3945dfa7cb73ee33c900947ec3e66f3c89b38c259f02eeffad92876e9e1b49cb56979694e4b771c9b8e62dbd60075cd5d59181bef412df2660469caf080a36fc364402ba72c8f61d263ea55557828c5affb803e3a16718cb297d3fa814deb770a6add8b6787b5c459d408e472aba6e0fa68f908b3feca4b933eee5609d27d1ce9976ca4fbe799b497ad24877e8ec3cb360ecf097270d7dbd057420da03f14e6e1a3d0a071290a91018ec82b5c7ce55275f4baa72bc09b5a7b88214ed480481a94dba033958aafcf705abe6ad372a74fcb564d7d0afbb08e8e6e89bd84161ed5ffdf29ca6be1498028f97c96cbe797d8f2d9e6cb67214d6a8b2eacbf82ed51b8933f5e295b5ce3747cbb4dc7734c8dce8d2df86dd5696c15a45714f951347d8ed3f44b6d9a9e6034edc73ad7b1dc98725ad46ecb65c0d874b84409ab94edae731a7d994da3533efff4a64b7d14da5c10fb5ec1ba7234a09de1955139cd6e709abdc3a6594b44aff4c60ddbaa80f263c7f39c06afd93478ff82d5f1b0dadbd5df598b34845287f5b5c1359ef74c61f54d507bacb02ec4be2aa412ad8a1738f2af73ad2b7b1f83ab4db9085e5a4ab86b2a55866e721cbedcc6e124cba1f8191e6ff91965fa62e17b6e51b4bac569f5155ccc8bd6032db426eee9bc81201a3f24eba7414eb3afb469762db266ce1a0c6fef3a8a2ee5f4c5e394e3db1c8fafb2f1c80b47d0f27a0761db0271380d719cde69e3e4ef33d07c46e93304d5057cbf287e341be6b47c974dcb0e369af95ffe412dece62ebcaec1ed9f38d6cc737abedba627bf68c5fe020d475bb76c5722bf235c7ebfba72f9ed455bddaf487e47b9fcbec796df136c7e0b6bd99c3c4e9b7a63686ea9105f07b679ae09af51adfecde08ac40e8c56d042bf8a77c0deb4cae1033ecd7391b0f433bb90f6848e47909fbeb958567a6dee7b15ffbec5e249b9b8afde8bf77c659755bbf0aba58b5f33586b34726569d2f830d0c3a6e9fbc0aa4b8d55ab72f84cd2de98de543a175f03a92db2fb50f4578e3902ae98b64806de9470d3148c3c56d9609092a9947a366c3f0a70df4a5781178d826bb56a3cc3380d368d13344ad556573503fdf74b220af7b4651a90bdbda680ec6b259145796c290de03e5f5b00f77592e0c23f679e066c6f127ffb7a496c414be7d300ea59e25fdf2009aad4b3a46980f50681f58d92b0f8475ad2806907c1f44d9298d66013025a2aed983437f79e06688d4b0ad03e20092ddaa3ae6940f7c6a202ba0f4aa20b7e3f491a50bd0f8b666db54ff8b922e171bb49f15e965cdca183a7c63ad4cb38a83d651a1ebe0e1ebe33216939ff90221db42cd3c9c9462c84d9903d816c84565c36a092c906366bb225ca41b6645d9f8dd44ccf868ef385d117fba849338cbec017d8bc9507469a6160e42300e16903c1899cdf2c1939d72be71967a7244ce2082e3f7e7bc09f7e392fa1aff344d5da30cac589acb004d5ad84be45122514cd094f51291432316caba4b055136cdfba901ee89df3699643d92285f24982f2dbe603e5908986c18b3105518a15e63504e5b72f2c4aba6a431065ab14ca5d04e57748a2ac2f81d23f112808739d14cc9504e6772609a6608d2d06731d81f95d9230a1f13eed69b8db2652c500ae9002b89800fceee45438875358e16c2528bf4712e52655dc0c0ab3e44db080df95827a9e40fd6812a10a564162503b09d4ef95847ad052e8251e231234c20e2923ac2646f8be856c07f8fbed4752187b9b09ccef4f12cca32984d94260fe4092601e4a21ccfd04e60f2609661a9b584d04e60f2509664b0a613e4160fe7092601e4c21ccbd04e6c79204338d43775902f3479204338d931a7b08cc1f9584d9a88a7b50d19e7c11f4d54129bca709de1f93c4bbc2e085844710ae2b7bac784d51e5c0554b815304dc8f4b822b35f244332fea837552289713943f2189720b5bc4ddfe3cff7d9aa2e34faba5d09e25687f7221bdd45b15a5b1bdb981a0fc2949941b2d284b3f222458f07ba5901e24487f5ada3b67946d8dcfc33211b284a0fc1949945b2d3134ca23bf8251b4410aee5502f767930c57300888c1bd44e0fe9c245cdb4bf8d337655c47707d7c216bf4f4af56da44507e623e50865b7a98c6218f3682f2e71712e5bc5536625ed94e50fec2421670af57a67126681b41f98b92280f1894e3fa22f048fab628ff7772c67b339a6858b826658063c400bf246980dd165f2ee7055382b0dba460ef26b07f5912f64e4b0c7e2b79f50902fa5724416fb38076bedc133aaa93ea027af1fd876e40b08a007e233955601ae7ef371294bf2a8912d6057b57987a5fa124866e9914ba4504ddaf49a28b37e02738862a36e0779820fdf5e414ece3292cd83b09cadf9044e97e2f69f1c4dda4b9247df03204de6f4ac25b67a9c1a9405a530b7656eba5405e26207f2b2920059b3c62204f1190bf9d9cc898c615238f12946f26afde16442a566f1f22487f471229cc8fd1c193cbf870d720ae94176c438acdbfd71070bf2b096eade266381ddf1b37e34f6984584b20fe5e7262631a1f346824287f5f12a5bbd46606fd70fa2d308fb982a0fde4fca28db2864910ad58003840d0fe8124da4655ee1a50c1da5d6c0d6807c1fb8792785761edee7cd184731345d825b90e54ace1be94c0fb2349786e0f88ab9cd2de95dc4c40fe715240a6b12bd94040fe892448f7f103ae4ffe30bceee22881f9a7498299c6d75d9c2430ff2c493005c7d2c5603e4560fe7992600a3eff2606f30c81f91749822938e72806f31c81f997498229f8ccb018cc2e02f35349822938fc2106f30281f957498229b8ba4e0ce64502f3af2561365a6046eb950bd6ef62bdf26e82f76f24f196f7545c1ac7938e13b47f2b8936da80721a5f1cf01841f977922837abf8a39e82eb3bc47c3447c0fe7d52c11e4b21d87d04ec3f2415ac60281003bb9e80fd7452c10ab604c4c0ae2560ff31a960d3f874fc2304ec3f25156c1a1b58ab08d87f4e2a58c13e9718d81d04ecbf2415ace0c88018d8ed04ecbf2615ace0f89518d82d04ecbf2515ace028ab18d87a02f6df25c1c20316de59fb3ee52c344b5f77751981f61f92d0e2ad0d156cf68bad0d3d4290fea724d2688329825d5331ef7c9ca0fc2f4994db95f779e541fc56ae311c3975bea7ca2de20fdb8b0a5ad543f3ed73cd50b57e06dca4c6b889f3b567414fe165437e1384f3f56bdc773c654bacd3ce46588e9c8dfc7226e72bd6561b8b4dea6397153c133ba8af1dc46de1ebd672f0469d0c84a8285f4f1e2c13ec152cedb360948cbdec8e57ccd32af1fd6e364d4bebc77bedf200abe41ac1160fb3feff4ded5e95db06fa1ea880ef95ced1ff28fe1b05e7e3c549c9b3ea557dc53dccdc1466b31caf86359e5e7963986e6e7b323dba72baffafd7a31f8febd1d173f439498f76a439fd449fecce10dad9ede0d7b970d57df487c297843ae5fb8efe7f380489cd5843f2d25af5de28ea3a86522794fb0335a5f35b8fbdb87e7daf1353e0818b295303c34ff5ff035476cb631ce10000 serializedProgramBytesString: - serializedSignature: be82ae7a7d1c8780a8d681cc804a43aa4c9803455cf9c6d9a1b4ee762f7da721bb167dbecff3a4d5b27951056639905cf2b8a684f6feae6cf8ffd20bafef2803 + serializedSignature: 58ddca58b2bc1bffbcfc62fabb5301f5fe7142ee6d3c37b704bc980707b216b223c5b5d78ea7d440e15737b8bf6300ba38464034806680dc113ae42f6172df09 programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset b/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset index d830abc..8b02703 100644 --- a/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset +++ b/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b73d346143eeb58765c02014a2edc66e0a930802502c33b8416d2690293d879a18c31890c666c37631b08fd099dfe217e078ffd277d69bf737695c8d24ac289c525208f76577b397bce772e3a2b175cc2a5aea3d8a4755aa62ad5699bfea01e5acba8bbf8e9a7a0ff31f551bf40d9c4d875ba94b192af9fd422ca153c0d688895af690b755bc637c8477b056b7d3c716f0bb78f59aa884575ba4f8f688d16d45c06894d5934307d8ae552d328efd13b8cfac2146fe2cad0028a0d8c0c64ac0ba683794fe8a988d5c5d816d6f4a9039acf85e2f46d5e2b3249e5987acad4cc71c9dcfc5cc05de175dc769448f4107b3469875c1e5457c7803e58990d3a932e15349f409fb71d42bc1d10b0485e175c87748b96ac929f553321be97a56c62465b8896e35bbc8f6dc1cc75f0f3436a1ba0ff81689d15d7c648957e43cdab9ed14d28e24984ca26b6ed40f53ed550ee08bd67603b3e334b24567174cd3a686a0beca227007407cf1de17043ca37c2a92fdcafa06f28fed08347dc43bd2bbbc565efa36ddbb36620b3f36837c4a47e6dee819aee431ae6de15dbfcae91cfa11186be54366e5874d947d45f314d7cc75007194702bca6715387d891be257225deaec7101c5fc6b88476fbd678dfa1dba9b2d89161759f1709f6357cedc33ffffebdf8fbb2332ada2d72e595712143b4346099de15351fa3902e82e3143d66340abfb2c1cfa6ac363e21fc7a5e5be68daf8092bc9946152000ad61c263dc6d617b407725f6bd153619ae16c66a86fd98a63c265b16b0e3afd22c8693e02ed8e09efed47067c79734b8a7f7e4da879b2f3b82950404b378484270ca86206fa29ee68a608d564d4e5c35ed066a1f3386c27f1d6b74a254ddeb5f15aa2fcdba74547f00f73722a8da113d26885e4679789e92502e5a50f6d819666c6c56226cf2c404c28e8d305bd4718b55fd872b46bc924cbc94c4f5095b84581a41308a5f15ed0690e2234743a8ed4aab31a2bf701c888e6d4ae4d94e80a78c9f52accb9fc546fb58198e552e1b84f2c63836f0de5d780ee77b3588f95cac3cfb10319b7288684d2c9fcc924247035edf92434790a3d8a4cb962939772e1b89025a409a9570e4243dc95a3547582ab8ecb7eada01ad299b8b53bcdbd4c71e44b3de9e9ac09a7c790001f65e762e0ff78a09696df1e336fd890999fb3d02cd57468fb6fd6e088120e99ac0399a8dec2e80da96d03ec08f2f76f908f15f266675074ba8e2fe312b116917ec712fd3db8efa0b87ea2f8ef3d3617bbf926933fbe1d71e363d0ebf3f7ee391d1637cce3008a52090781c48e6f2f6f6a63551d7afe0c87e87394a5546fcfed8c7087310df9f12dfd7d0cde709dd5cc8e86d10f2187fd2d3df747303d2f2a57032401643402ee409e47103246fdcc294c61e6d4ee87203cec90b380a01b7982770f306b82d13fd86919c38cc3cdb696e5056f282d2094179364f282f1b28f581a02756d897e3c86bd43dfad57cf83d6a001742009fcb13e0d94427ef99295f5f84547464d24c8f83f0798a657569b981ceea4e19697bd873553ca609ea4da9f7333c9789a93b34de91289d6676fa75212c50444b9d8969691229a54dd2c3a49733295a71d91c8eb4fc1749ff5b6c5ec56567410e1f75685e13f7714aedcb1fd77d99e3fc0faf558946b41f0000 serializedProgramBytesString: - serializedSignature: a872141bd2d5082a4a006e71a4af8285deb8cebda20a8605341b6edc818fc62f3b9f8d165a31a4340fbec63fcdad03861acd1c311735884de28b3f3902917f03 + serializedSignature: d4c759842fe9a8bf2d6eda590d47b7f45b4b70b5d4e82f735dd54711870131a2b2d0214166938d421b6373774595e82acf2a379251f8da9b5ca7f9662c66f508 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Thry/presets_known_materials.txt b/Thry/presets_known_materials.txt index 8c23199..ce9bd5c 100644 --- a/Thry/presets_known_materials.txt +++ b/Thry/presets_known_materials.txt @@ -341,7 +341,13 @@ b9257d637744d15458654516d0135220 85980b42c2579134d951ee2c7bf3c7f6 2aff5bcb44571d145a53916006e5b0fc b26dcac062b7da14fb6e50fc6b69aa77 +02ce03781605f3f4f85c80bfdacfbe00 +5c816e03b652658498610330ae7c0b66 79104b7c72559ae419b9b5c0aaf3f627 +90e2c2c675ad56247b8ce0101848274e +026a7c368b9c59343bc40afa213abe94 +50a00808aba6c2c488f11f4b0baff9eb +6c802bc1dd1dee24095056a5f6da8a8a 84f6739abbf514043ba3c86bc241f9be caa5e4e6825fd1541ba4f7116c85012b 9d4f93f40c09a9b4e9d40d594df2436b @@ -373,6 +379,7 @@ e5e3830988904fb4e8ddda8116c9f883 53c3b33ab44d5b842ac7c8a095901308 d00efd7b6e40bb84fbca65c86683a186 360a40a163e0f3347b5b14b9771d2ab5 +f45e687b234af6948b76b2622ed33647 c9a75b790a45e0447bc87a8b5827d764 f06733e6df5d5584b9e5c62de0310e00 dd0230fc1fb9dc141a4bf63f069a8c5d @@ -407,7 +414,10 @@ f5df33c049e47e349b68e4159cb7dcf4 d51ae1dacdaaef642abce7df79a0f2f9 299117bf4be2de4429aa6f98e0322f4f 58cb7a72284678249ab615e41dca85f1 +1c7ee18c931fd454cadaa750534e1d95 +b215af399afe2f14e96c213518ac905c 031b327695a211149b112576815b9c21 +d12bf3d7f969d9a438edde912f2009da 864b654b07e5bc142b4622f196ca3b41 7992a19655656c746acc0bd847ed5831 1889e704c53edfb4eb6edb8e84d049ab @@ -425,6 +435,7 @@ c7c49b161bf2ede449f099db8f5f5a20 d52bd7e9131901e40a0effcd276b963d b62c0ec4025b4d14a87b276f5269ea5f ba4a136dc4e28bb4aac3682987d873c1 +4484e3331bc52724593257a69e2553b8 2f5faf56eef0ad748ad331a95b4b2abc d881b302dcb6b72459187d107c9a86a6 f890bc351c3a8ac4083a912069bfac26 @@ -573,8 +584,4 @@ a6c1d9564b56ecd47b82dfa7a8f11cbe d419d3432b8a0a24b986e614c57c2039 21221da753878694b9b9518a540dda85 70108d78e82c2ec488d6b504865508e0 -6c802bc1dd1dee24095056a5f6da8a8a -026a7c368b9c59343bc40afa213abe94 -5c816e03b652658498610330ae7c0b66 -01573f9fe8edab64b994bc9be95f1cea -f45e687b234af6948b76b2622ed33647 +f61de072c139b1046b4331e609b5ec8d diff --git a/bakery_times.log b/bakery_times.log index cd25cd6..f7959fd 100644 --- a/bakery_times.log +++ b/bakery_times.log @@ -224,3 +224,12 @@ 11/30/2025 03:06 | QuizScene | 0h 0m 42s 11/30/2025 03:11 | QuizScene | 0h 0m 39s 11/30/2025 03:18 | QuizScene | 0h 0m 45s +11/30/2025 22:05 | QuizScene | 0h 0m 43s +12/01/2025 00:54 | QuizScene | 0h 0m 32s +12/01/2025 00:57 | QuizScene | 0h 0m 42s +12/01/2025 01:28 | QuizScene | 0h 0m 41s +12/01/2025 01:30 | QuizScene | 0h 0m 41s +12/01/2025 01:33 | QuizScene | 0h 0m 42s +12/01/2025 01:34 | QuizScene | 0h 0m 40s +12/01/2025 22:23 | QuizScene | 0h 0m 45s +12/01/2025 22:42 | QuizScene | 0h 0m 46s